参考链接:https://segmentfault.com/a/1190000018234763
#### 一、HTTP 请求内容
我们打开chrome的network,点击任何一条request请求,即可发现,每个http headers都包含以下部分:Genaral,Request Headers,Response Headers,Request Payload。
**General**(不属于headers,只用于收集请求url和响应的status等信息)
![General.png](http://114.115.171.234:80/upload/2021/07/General-377af063d9cd44f199e1190e9f1e8efd.png)
**Request Headers**(请求headers)
![RequestHeaders.png](http://114.115.171.234:80/upload/2021/07/RequestHeaders-d9c9d73a019c4710b8df4b9ea0902988.png)
**Response Headers**(响应headers)
![ResponseHeaders.png](http://114.115.171.234:80/upload/2021/07/ResponseHeaders-72f39f8b7e3b43b6a5da2a4bdcf3d77c.png)
**Request Payload**(请求参数)
![RequestPayload.png](http://114.115.171.234:80/upload/2021/07/RequestPayload-221805e35cf64718acc63c1b502e67d6.png)
#### 二、HTTP Headers分类
在http heanders中,为了方便,分为以下几类:Genaral headers(和上面说的General不同,这个只是为了方便统计),Request Headers,Response Headers,Entity Headers(也是为了方便统计)。
![HttpHeaders分类.png](http://114.115.171.234:80/upload/2021/07/HttpHeaders%E5%88%86%E7%B1%BB-a6e23a181251418b9cc7a8dc5365b1c3.png)
>1、Genaral headers: 同时适用于请求和响应消息,但与最终消息传输的数据无关的消息头。
>
>2、Request Headers: 包含更多有关要获取的资源或客户端本身信息的消息头。
>
>3、Response Headers:包含有关响应的补充信息,如其位置或服务器本身(名称和版本等)的消息头。
>
>4、Entity Headers:包含有关实体主体的更多信息,比如主体长(Content-Length)度或其MIME类型。
##### 1、Genaral headers
> Cache-Control——控制缓存的行为; [详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cache-Control)
>
> Connection——决定当前的事务完成后,是否会关闭网络连接; [详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Connection)
>
> Date——创建报文的日期时间; [详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Date)
>
> Keep-Alive——用来设置超时时长和最大请求数;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Keep-Alive)
>
> Via——代理服务器的相关信息;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Via)
>
> Warning——错误通知;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Warning)
>
> Trailer——允许发送方在分块发送的消息后面添加额外的元信息; [详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Trailer)
>
> Transfer-Encoding——指定报文主体的传输编码方式;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Transfer-Encoding)
>
> Upgrade——升级为其他协议;
##### 2、Request headers
> Accept——客户端可以处理的内容类型;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Accept)
>
> Accept-Charset——客户端可以处理的字符集类型;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Accept-Charset)
>
> Accept-Encoding——客户端能够理解的内容编码方式;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Accept-Encoding)
>
> Accept-Language——客户端可以理解的自然语言;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Accept-Language)
>
> Authorization——Web 认证信息;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Authorization)
>
> Cookie——通过Set-Cookie设置的值;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Cookie)
>
> DNT——表明用户对于网站追踪的偏好;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/DNT)
>
> From——用户的电子邮箱地址;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/From)
>
> Host——请求资源所在服务器;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Host)
>
> If-Match——比较实体标记(ETag);[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/If-Match)
>
> If-Modified-Since——比较资源的更新时间;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/If-Modified-Since)
>
> If-None-Match——比较实体标记(与 If-Match 相反);[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/If-None-Match)
>
> If-Range——资源未更新时发送实体 Byte 的范围请求;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/If-Range)
>
> If-Unmodified-Since——比较资源的更新时间(与 If-Modified-Since 相反);[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/If-Unmodified-Since)
>
> Origin——表明了请求来自于哪个站点;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Origin)
>
> Proxy-Authorization——代理服务器要求客户端的认证信息;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Proxy-Authorization)
>
> Range——实体的字节范围请求;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Range)
>
> Referer——对请求中 URI 的原始获取方;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Referer)
>
> TE——指定用户代理希望使用的传输编码类型;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/TE)
>
> Upgrade-Insecure-Requests——表示客户端优先选择加密及带有身份验证的响应;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Upgrade-Insecure-Requests)
>
> User-Agent——浏览器信息;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/User-Agent)
##### 3、Response Headers
> Accept-Ranges——是否接受字节范围请求;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Accept-Ranges)
>
> Age——消息对象在缓存代理中存贮的时长,以秒为单位;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Age)
>
> Clear-Site-Data——表示清除当前请求网站有关的浏览器数据(cookie,存储,缓存);[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Clear-Site-Data)
>
> Content-Security-Policy——允许站点管理者在指定的页面控制用户代理的资源;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy__by_cnvoid)
>
> Content-Security-Policy-Report-Only—— [详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Security-Policy-Report-Only)
>
> ETag——资源的匹配信息;[链接描述](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/ETag)
>
> Location——令客户端重定向至指定 URI;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Location)
>
> Proxy-Authenticate——代理服务器对客户端的认证信息;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Proxy-Authenticate)
>
> Public-Key-Pins——包含该Web 服务器用来进行加密的 public key (公钥)信息;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Public-Key-Pins)
>
> Public-Key-Pins-Report-Only——设置在公钥固定不匹配时,发送错误信息到report-uri;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Public-Key-Pins-Report-Only)
>
> Referrer-Policy——用来监管哪些访问来源信息——会在 Referer 中发送;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Referrer-Policy)
>
> Server——HTTP 服务器的安装信息;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Server)
>
> Set-Cookie——服务器端向客户端发送 cookie;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Set-Cookie)
>
> Strict-Transport-Security——它告诉浏览器只能通过HTTPS访问当前资源;[详情](https://developer.mozilla.org/zh-CN/docs/Security/HTTP_Strict_Transport_Security)
>
> Timing-Allow-Origin——用于指定特定站点,以允许其访问Resource Timing API提供的相关信息;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Timing-Allow-Origin)
>
> Tk——显示了对相应请求的跟踪情况;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Tk)
>
> Vary——服务器缓存的管理信息;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Vary)
>
> WWW-Authenticate——定义了使用何种验证方式去获取对资源的连接;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/WWW-Authenticate)
>
> X-XSS-Protection——当检测到跨站脚本攻击 (XSS)时,浏览器将停止加载页面;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/X-XSS-Protection)
##### 4、Entity Headers
> Allow——客户端可以处理的内容类型,这种内容类型用MIME类型来表示;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Allow)
>
> Content-Encoding——用于对特定媒体类型的数据进行压缩;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Encoding)
>
> Content-Language——访问者希望采用的语言或语言组合;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Language)
>
> Content-Length——发送给接收方的消息主体的大小;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Length)
>
> Content-Location——替代对应资源的 URI;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Location)
>
> Content-Range——实体主体的位置范围;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Range)
>
> Content-Type——告诉客户端实际返回的内容的内容类型;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Content-Type)
>
> Expires——包含日期/时间, 即在此时候之后,响应过期;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Expires)
>
> Last-Modified——资源的最后修改日期时间;[详情](https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Headers/Last-Modified)
#### 三、HTTP 具体应用
##### **1、Cookie**
HTTP 协议是无状态的,主要是为了让 HTTP 协议尽可能简单,使得它能够处理大量事务。HTTP/1.1 引入 Cookie 来保存状态信息。
Cookie 是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器之后向同一服务器再次发起请求时**自动被携带**上,用于告知服务端两个请求是否来自同一浏览器。由于之后每次请求都会需要携带 Cookie 数据,因此会带来额外的性能开销(尤其是在移动环境下)。
Cookie 曾一度用于客户端数据的存储,因为当时并没有其它合适的存储办法而作为唯一的存储手段,但现在随着现代浏览器开始支持各种各样的存储方式,Cookie 渐渐被淘汰。新的浏览器 API 已经允许开发者直接将数据存储到本地,如使用 Web storage API(本地存储和会话存储)或 IndexedDB。
###### 1.1 **创建过程**
服务器发送的响应报文包含Set-Cookie首部字段,客户端得到响应报文后把 Cookie 内容保存到浏览器中。
```
HTTP/1.1 200 OK
Content-type: text/html
Set-Cookie: PHPSESSID=kq8v6iujarsgflkeq7shmai9c7
```
客户端之后对同一个服务器发送请求时,会从浏览器中取出 Cookie 信息并通过 Cookie 请求首部字段发送给服务器。
```
GET /sample_page.html HTTP/1.1
Host: www.example.org
Cookie: PHPSESSID=kq8v6iujarsgflkeq7shmai9c7
```
###### 1.2 **分类**
会话期 Cookie:浏览器关闭之后它会被自动删除,也就是说它仅在会话期内有效。
持久性 Cookie:指定一个特定的过期时间(Expires)或有效期(max-age)之后就成为了持久性的 Cookie。
安全 Cookie:指定HttpOnly,这样cookie不能使用 JavaScript 经由 Document.cookie 属性,来防范跨站脚本攻击(XSS)。
HTTPS Cookie: 指定Secure,只有在请求使用SSL和HTTPS协议的时候才会被发送到服务器。
##### **2、缓存**
降低客户端获取资源的延迟:缓存通常位于内存中,读取缓存的速度更快。并且缓存在地理位置上也有可能比源服务器来得近,例如浏览器缓存(但是只能缓存get,不能缓存其他类型请求)。
![缓存流程.png](http://114.115.171.234:80/upload/2021/07/%E7%BC%93%E5%AD%98%E6%B5%81%E7%A8%8B-c42350809799433793854428137aac7a.png)
###### 2.1 **判断cache-control或者expires是否有效**
![缓存时间.png](http://114.115.171.234:80/upload/2021/07/%E7%BC%93%E5%AD%98%E6%97%B6%E9%97%B4-ba1ff21dbb1344d88621eb0a0c23425e.png)
max-age值为缓存的毫秒数。
可以看到response-headers中设置了cache-control,并大于0,则下次直接从缓存(from disk cache)中获取
#### 四、HTTP 使用的认证方式
> 1、BASIC 认证(基本认证)
>
> 2、DIGEST 认证(摘要认证)
>
> 3、SSL 客户端认证
>
> 4、FormBase 认证(基于表单认证)
##### **1、BASIC 认证**
BASIC 认证虽然采用 Base64 编码方式,但这不是加密处理。不需要任何附加信息即可对其解码。换言之,由于明文解码后就是用户 ID和密码,在 HTTP 等非加密通信的线路上进行 BASIC 认证的过程中,如果被人窃听,被盗的可能性极高。
##### **2、SSL 客户端认证**
对于 BASIC 认证和 DIGEST 认证来说,只要输入的用户名和密码正确,即可认证是本人的行为。但如果用户名和密码被盗,就很有可能被第三者冒充。
而利用 SSL客户端认证则可以避免该情况的发生。在SSL认证时,必须使用https协议。
Http:常用的HTTP请求头与响应头