HTTP 协议
什么是 HTTP
HTTP 全称 Hyper Text Transfer Protocol,即超文本传输协议。是一个用于传输超媒体文档(如HTML)的 应用层 协议
遵循 客户端 - 服务端 模型,是一种无状态通讯协议,通常基于 TCP/IP 层,可以在任何可靠的 传输层 上使用
HTTP 概述
客户端-服务端模型
从一个客户端发起请求(通常是浏览器,也可以是爬虫、调试工具等),服务端响应这个请求。在客户端与服务端中间,还有许多的 代理、网关 等
代理、网关
一个请求从客户端到服务端,并不是直达的,中间需要经过许多代理或网关的转发,最终到目标服务端进行响应,响应回到客户端同样如此。代理主要有以下几种作用:
- 缓存、日志(存储一些请求响应的信息)
- 过滤(病毒扫描等)
- 认证(第三方证书,HTTP 加密过程会详细讲解)
- 负载均衡(服务容灾)
HTTP 本质
简单的二进制报文,HTTP/2 将消息封装到帧中。可扩展,只需要客户端和服务端达成一致。无状态但有会话,通过 Cookie 将数据包装在消息头中,每次请求都携带这些信息,就可以实现客户端与服务端会话。HTTP 请求与响应直间是建立 TCP 连接,TCP 中常谈的就是 三次握手四次挥手
HTTP 报文
在 HTTP/1.1 及更早的报文协议中,是可读的。在 HTTP/2 中,遗弃了一些无用的信息,将剩下的进行压缩存到二进制帧中,并且实现多路复用。虽然 HTTP/2 报文被压缩和封装,但是语义不变,仍然是可读的,只是需要格式解析,这在提高传输速率的同时,也提高了安全性
HTTP 的发展
起源
万维网基础协议,创建时间(1989-1991)
HTTP/0.9
单行协议,更早之前的协议没有版本号。只有 GET 方法,只能传输 HTML 文本,也没有状态码
HTTP/1.0
可扩展性,增加协议头,增加状态码,可以传输除HTML以外的其他类型文档(不包括音视频)
HTTP/1.1
协议标准化,消除大量歧义内容。连接可复用,并发,内容协商,响应分块。SSL 在此基础上创建
HTTP/2
二进制协议,与 HTTP 1.1 的不同:
- 二进制协议
- 多路复用
- 标头压缩
- 运行服务端向客户端缓存填充数据(推送)
- 禁止协议升级,只有 HTTP/1.1 才支持将请求升级为 WebSocket
HTTP/3
下一个主要版本(截至2022年10月,26%的网站正在使用)。基于 Google 公司的 QUIC(替代TCP)。基于 TCP 的并发请求还是同一个 TCP 连接,而基于 QUIC 则未每个流独立实现包丢失和重传
协议升级(WebSocket)
- 由客户端发起,现在请求头中设置
Connection=Upgrade
请求连接升级 - 服务端同意升级,返回
101
状态码,添加Upgrade=websocket
标头,协议升级 - 生成 WebSocket 传输密钥等,每次交互都要验证
HTTP 加密过程
由于 HTTP 协议在传输过程中,数据是明文传输的,如果不进行任何处理,那么敏感数据必定是会泄露的。中间的代理、网关和黑客都能挟持你的请求和响应,以获取敏感信息、嵌入广告、木马程序注入等
加密主要分为三个阶段:
- 证书校验:由第三方颁发的数字证书,包含一对公钥和私钥。
- 因为请求中间会经过许多代理和网关,这些数字证书由这些中间机构颁发
- 服务器收到证书,保留私钥(私钥可以解密公钥加密的密文)
- 非对称加密:客户端解析证书,并验证证书的合法性
- 提取公钥,生成随机 Key,加密报文
- 私钥解密报文,并提取到随机 Key,将返回结果使用随机 Key 加密
- 对称加密:此时响应报文可以通过客户端的私钥解密
Cookie
服务器发送到用户浏览器并保存在本地的一小块数据,当浏览器再次发送请求时,会携带这些 Cookie。主要应用场景:
- 会话状态管理
- 个性化设置
- 浏览器行为跟踪
Cookie 安全性
浏览器接收到 Cookie 时,并不能保证其来源是目标服务器
- 定义生命周期:每当站点的用户进行身份验证,重新生成并发送 Cookie,可以有效防止 会话固定攻击(SFA)
- 限制访问:添加
Secure
和HttpOnly
属性,前者限定只能通过 HTTPS 发送,后者限定无权访问硬盘。有助于缓解 跨站站点脚本攻击(XSS) - SameSite 属性:指定 是否/何时 通过跨站点请求发送,提供了 **跨站点请求伪造攻击(CSRF)**的保护
- Cookie 前缀:通过添加 Cookie 前缀,更有效防止 会话劫持攻击(SFA),与第一条的会话固定攻击是同一个意思
LocalStorage
对一个请求源的特定数据进行长期保留
- 页面关闭时不会被清除,只能 用户/脚本 手动清除
SessionStorage
对一个请求源的特定数据进行临时保留
- 一个浏览器标签页打开开始一个会话缓存,关闭清除会话缓存
- 同一个源的 不同标签页/窗口 都会创建新的会话缓存,但是 新开标签页/窗口 会复制 顶层浏览会话
HTTP 安全
内容安全策略
英文名Content Security Policy(CSP)
削弱/缓解 跨站脚本(XSS)
、数据注入
等,保护数据内容不被盗取、污染
使用 <meta>
标签配置策略:
|
|
使用 Content-Security-Policy
标头配置策略:
|
|
HTTS
即HTTP Strict-Transport-Security,限制只能通过 HTTPS 访问,配置示例:
|
|
Cookie 安全
在前面已经提到 Cookie 安全性
X-Content-Type-Options
提示标志,提示客户端一定要遵循在
Content-Type
首部中对
MIME 类型
的设定,而不能对其进行修改
X-Frame-Options
是否允许页面在 <frame>
<iframe>
<embed>
<object>
中展现
|
|
X-XSS-Protection
检测到攻击脚本时,停止加载页面。 CSP 的替代方案