目录
一、HTTP/1.1
URI与URL
报文结构
状态码
Cookie
常用方法
二、HTTP/2.0
三、HTTPS
四、跨域
同源策略
解决方案
五、攻击
XSS
CSRF
六 、缓存
强缓存
协商缓存
七、其它
fetch与ajax
性能优化
附录
复制代码
本文为原创文章,万字长文,建议先码后读。
一、HTTP/1.1
HTTP 于 1990 年问世,直到 1996 年 5 月才被正式作为标准公布,HTTP/1.0 就此诞生。1999 年,HTTP/1.1 公布,这个也是目前主流的 HTTP 协议版本。
HTTP 协议工作在应用层,请求从客户端发出,最后服务器响应请求并返回。
URI 与 URL
URI 是 Uniform Resource Identifier 的缩写,译为 “统一资源标识符”,用来标示抽象或物理资源。
URI 可以分为 URL、URN 或 同时具备 locators 和 names 特性的一个紧凑字符串。
- URN 好比是名字,确定了它的身份。
- URL 就好比是地址,提供了找到它的方式
HTTP 报文结构
HTTP 协议交互的信息称为 HTTP 报文。
⇩ HTTP 报文结构
HTTP 报文由三个部分组成
- 报文首部:服务端或客户端需要处理的请求或响应的内容及属性
- 空行(CR+LF):CR-回车符,LF-换行符
- 报文主体:被发送的数据
客户端发起的 HTTP 报文称为 请求报文,服务端返回的 HTTP 报文称为 响应报文;主要差异体现在 报文首部。
请求报文首部自上而下分别是:
- 请求行:包含用于请求的方法,请求 URI 和 HTTP 版本
- 首部字段
- 请求首部字段
- 通用首部字段
- 实体首部字段
- 其它字段
响应报文首部自上而下分别是:
- 状态行:表明响应结果的状态码,原因短语和 HTTP 版本
- 首部字段
- 响应首部字段
- 通用首部字段
- 实体首部字段
- 其它字段
HTTP/1.1 规范定义了 47 种首部字段,见文末附录。这里先讲一下常用的 Content-Type,后面小节还会讲到其它常用的首部字段。
Content-Type:说明了实体主体内对象的媒体类型
- text/html:HTML 文档标记
- text/plain:普通 ASCII 文档标记
- text/xml:忽略 xml 头所指定编码格式而默认采用 us-ascii 编码
- image/jpeg:JPEG 图片标记
- image/gif:GIF 图片标记
- application/javascript:js 文档标记
- application/xml:xml 文件标记;使用 xml 格式的数据
- application/octet-stream:任意二进制数据
- application/x-www-form-urlencoded:用于表单提交,将请求参数用 key1=val1&key2=val2 的方式进行组织,并放到请求实体里
- application/json:以“键-值”对的方式组织的数据。这个使用这个类型,需要参数本身就是 json 格式的数据,参数会被直接放到请求实体里,不进行任何处理
- multipart/form-data:多部分多媒体类型;首先生成了一个 boundary 用于分割不同的字段,在请求实体里每个参数以——boundary 开始,然后是附加信息和参数名,然后是空行,最后是参数内容。多个参数将会有多个 boundary 块。如果参数是文件会有特别的文件域。最后以——boundary–为结束标识。multipart/form-data 支持文件上传的格式,一般需要上传文件的表单则用该类型。
只列出部分常用可选值,完整版请跳转到这里 MIME 参考手册
常见状态码
状态码的职责是当客户端向服务器端发送请求时,描述返回的请求结果。借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了错误。
1xx:Informational(信息性状态码),接收的请求正在处理
- 100:请求已被部分处理
- 101:切换协议
2xx:Success(成功状态码),请求正常处理完毕
- 200:请求成功
- 204:请求处理成功,但是没有内容返回
- 206:返回指定范围的内容
3xx:Redirection(重定向状态码),需要进行附加操作以完成请求
- 301:永久重定向
- 302:临时重定向
- 303:临时重定向,要求使用 GET 方法
- 304:请求资源未更改,直接使用缓存
4xx:Client Error(客户端错误状态码),服务器无法处理请求
- 400:请求出错
- 401:未授权
- 403:被服务器拒绝访问
- 404:服务器上没有请求的资源
5xx:Server Error(服务器错误状态码),服务器处理请求出错
- 500:服务器内部错误
- 503:服务器暂时无法处理请求
- 504: 服务器作为网关或代理,没有及时从上游服务器收到请求,请求超时
Cookie
HTTP 是一种 无状态(stateless) 协议。看到这有的同学可能要说了,它不是有状态码吗?怎么无状态了?
这话没错,状态码是指通信状态,而 无状态 指的是 不保存状态。每当有新的请求发送时,就会有对应的新响应产生。协议本身并不保留之前一切的请求或响应报文的信息。这么设计主要是为了能处理大量事务,确保协议的可伸缩性。
假设是需要登录的网页,但是 HTTP 本身又不能记录之前的状态,所以每次跳转新页面都要再次登录。
保留无状态协议这个特征的同时又要解决类似的矛盾问题,于是引入了 Cookie。
Cookie 的工作机制是用户识别及状态管理。Web 网站为了管理用户的状态会通过 Web 浏览器,把一些数据临时写入用户的计算机内。接着当用户访问该 Web 网站时,可通过通信方式取回之前发放的 Cookie。
Cookie 由以下字段组成
- name:名称
- value:值
- domain:允许访问此 cookie 的域名
- path:允许访问此 cookie 的页面路径
- expires/Max-Age:超时时间,不设置则于 session 一起失效(关闭浏览器)
- size:cookie 的大小
- httponly:若为 true,则只有在 http 请求头中会带有此 cookie 的信息,而不能通过 document.cookie 来访问此 cookie(可以一定程度上地防止信息盗取)
- secure:是否只能通过 https 来传递此条 cookie
示例:username=John Doe; expires=Thu, 18 Dec 2043 12:00:00 GMT
常用方法
HTTP/1.1 提供了 GET、POST、PUT、HEAD、DELETE、OPTIONS、TRACE、CONNECT 八个可使用的方法
- GET:获取资源。参数直接拼接在 url,对长度有限制,不同浏览器、服务器限制长度各不相同。
- POST:传输实体主体。参数(实体主体)作为请求的有效载荷数据(补充项)被传输
- PUT:用来传输文件。自身不带验证机制,因此任何人都可以上传文件,不推荐
- HEAD:获取报文首部。不返回报文主体部分,多用于确认 URI 的信息
- DELETE:删除文件。与 PUT 一样不带验证机制,一般不用
- OPTIONS:查询针对请求 URI 指定的资源所能支持的方法。
- TRACE:追踪路径。可以查询发送出去的请求是怎样被加工修改/ 篡改的。容易造成 XST(跨站追踪)攻击,通常不使用。
- CONNECT:要求在与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要使用 SSL(Secure Sockets Layer,安全套接层)和 TLS(Transport Layer Security,传输层安全)协议把通信内容加密后经网络隧道传输。
网上还有说 post 请求会发出两个数据包,先发 header 再发实体;get 只发一个数据包。
这个说法其实是没错的,发几个包取决于客户端如何实现,目前已知的只有 ruby 会这里处理,大部分都是发一个数据包
注:实体主体指作为请求或响应的有效载荷数据(补充项)被传输,其内容由实体首部和实体主体组成
二、HTTP/2.0
2015 年 5 月,HTTP/2.0 协议正式版发布。相比于 HTTP 1.x ,大幅度的提升了 web 性能。在与 HTTP/1.1 完全语义兼容的基础上,进一步减少了网络延迟。
先借助 Chrome Developer Tools 来看看 HTTP/2.0 与 HTTP/1.1 性能差多少