1.4.2 HTTP 协议基础
HTTP 是 Web 领域的核心通信协议。最初的 HTTP 支持基于文本的静态资源获取,随着协议版本的不断迭代,它已经支持如今常见的复杂分布式应用程序。
HTTP 使用一种基于消息的模型,建立于 TCP 层之上。由客户端发送一条请求消息,而后由服务器返回一条响应消息。
一次完整的请求或响应由消息头、一个空白行和消息主体构成。以下是一个典型的 HTTP 请求:
GET / HTTP/1.1
Host: www.github.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:52.0) Gecko/20100101 Firefox/52.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
Accept-Encoding: gzip, deflate
Upgrade-Insecure-Requests: 1
Cookie: logged_in=yes;
Connection: close
第一行分别是请求方法,请求的资源路径和使用的 HTTP 协议版本,第二至九行为消息头键值对。
以下是对上面请求的回应(并不一定和真实访问相同,这里只是做为示例):
第一行为协议版本、状态号和对应状态的信息,第二至二十二为返回头键值对,紧接着为一个空行和返回的内容实体。
在提到 HTTP 方法之前,我们需要先讨论一下 HTTP 版本问题。HTTP 协议现在共有三个大版本,版本差异会导致一些潜在的漏洞利用方式。
URL 是统一资源定位符,它代表了 Web 资源的唯一标识,如同电脑上的盘符路径。最常见的 URL 格式如下所示:
下面是一张具体案例分析
HTTP 支持许多不同的消息头,一些有着特殊作用,而另一些则特定出现在请求或者响应中。
Cookie 是大多数 Web 应用程序所依赖的关键组成部分,它用来弥补 HTTP 的无状态记录的缺陷。服务器使用 Set-Cookie 发布 cookie,浏览器获取 cookie 后每次请求会在 Cookie 字段中包含 cookie 值。
Cookie 是一组键值对,另外还包括以下信息:
expires,用于设定 cookie 的有效时间。
path,用于指定 cookie 的有效 URL 路径。
secure,指定仅在 HTTPS 中提交 cookie。
HttpOnly,指定无法通过客户端 JavaScript 直接访问 cookie。
状态码表明资源的请求结果状态,由三位十进制数组成,第一位代表基本的类别:
常见的状态码及短语如下所示:
401 状态支持的 HTTP 身份认证:
Digest,一种质询-响应机制,随同证书一起使用一个随机的 MD5 校验和
HTTPS 用来弥补 HTTP 明文传输的缺陷。通过使用安全套接字 SSL,在端与端之间传输加密后的消息,保护传输数据的隐密性和完整性,并且原始的 HTTP 协议依然按照之前同样的方式运作,不需要改变。