原文:
https://www.yuque.com/g/qajlhl/bqz6hy/mfpdvrhatc1gmkh0/collaborator/join?token=uKGl9LMlmxn7BtKb#
一个网页就是一个超文本文档
HTTP的性质
1、无状态的 同一个连接下,所有的请求之间都是没有联系的,都是独立的。
2、可扩展的 通过设置请求头可以扩展协议。
3、简单的 简单易读 对新手友好
HTTP消息
请求和响应
请求报文的结构: 1、请求行 = 请求类型 + 请求的路径 + http版本 2、请求头 常见的请求头: DATE:发送请求的时间 cache-control:缓存的过期时间 if-modified-since:资源最后被修改的时间 if-none-match: accept:客户端能够处理的内容类型 accept-language:客户端所使用的语言 referer:发送请求的页面的url host:发送请求的页面的域(即ip地址的别名) | 响应报文的结构: 1、响应行 = http版本 + 响应状态码 + 响应状态 http1.1 200 OK 2、响应头 date:发送响应的时间 cache-control:设置缓存的过期时间 etag content-type:描述响应体的类型 content-length:响应体的大小 last-modified:服务器所记录的资源最后被修改的时间 3、空行 4、响应体 |
HTTP api 之 XMLHttpRequest
HTTP版本
1、http0.9 单行协议
请求:
之所以http0.9会被称为单行协议,就是因为它的请求仅有单行指令构成。同时请求的方法也只有get请求。
组成格式:
GET 请求的路径
响应:
响应报文只包含一个简单的响应文档。这也就意味着它无法传输其他类型的文件,并且如果文档出现错误也依然会被显示出来。
2、http1.0
http1.0在http0.9的基础上增加了版本协议,状态码和标头。同时客户端也可以获取除了文档类型以外的文件。
3、http1.1
虽然http1.0有了很大的改进,但是依然存在很多问题。比如http1.0仅支持短暂连接,也就是说一个连接只能处理一个请求,请求处理完毕后连接会立即断开。
相比于http1.0,http1.1提出了以下改进:
●连接复用;一个连接可以处理多个请求。
●设置缓存控制机制;通过cache-control可以设置是否使用缓存,缓存的有效期等等。
●增加了delete,put等方法。
●新增了host标头;根据host使得不同域名配置到同一个服务器上。
4、http2.0
由于http是无状态的,同一个连接的不同请求都是相互独立。所以这会造成一个问题:标头中很多重复性的数据会被反复发送给服务器,造成了标头的冗余。另外,http1.0是文本协议,所有的数据都是以文本的形式传输,同时也是明文传输。这将引起数据在传输过程中的安全性问题。最后,http1.0在发送请求的时候,会等到上一次请求的响应到达之后才会发送本次请求。这将造成http队头阻塞的问题。
为了解决以上问题,http2.0提出了以下改进:
●压缩标头;避免请求头的累赘。
●二进制传输;在http2.0中,报文是以二进制的形式传输,降低了可读性从而保证了数据的安全。
●多路复用:同一个连接下,不同请求和响应可以交错发送。
●服务器推送:服务器会将客户端后续可能需要的资源全都推送给客户端。
5、http3.0
在http2.0中多个http请求是公用一个tcp连接的。当传输过程中发生丢包问题的时候,后面所有的请求都会等待着这个丢了的包被重新的发送过来。那么这样就会造成tcp队头阻塞的问题。
所以http3.0提出了QUIC协议。QUIC协议就是整合了TLS和TCP。它能够通过UDP协议运行多个流,这样避免了丢包问题导致的tcp队头阻塞问题。
协议升级-websocket
HTTP安全-cookie
cookie通常用来告知服务器两次请求是否来自同一个客户端。
cookie主要负责以下三个功能:
●管理会话状态:也就是记录信息
●跟踪浏览器行为
●个性化设置
cookie的属性
1、name
2、value
3、maxage/expires
expires是通过new Date设置一个具体的日期,再这个日期之后就是过期时间。
maxage是设置一个时间段,当过了这个时间段后才算过期。
注意:expires设置的时间只和客户端有关。
4、size
5、httpOnly:只有在http请求头中才能携带cookie。js操作无法访问到cookie。
6、secure:设置https传递cookie
7、sameSite:是否接受第三方cookie
sameSite有三个值:strict,lax,none
strict代表完全禁止第三方cookie
lax表示导航到目标网页的get请求可以携带cookie
none表示接受第三方cookie。但是必须设置secure才能生效。
8、domian:cookie的域
9、path:cookie的url路径
cookie的生命周期
会话cookie:
默认情况下,cookie的生命周期是会话期间。当会话结束后cookie也就失效。
持久cookie:
但是可以通过设置max-age来延长cookie的生命周期,只要没有到过期时间,就算关闭浏览器窗口cookie也依然生效。
cookie的安全策略
http-only
httpOnly开启之后意味着cookie只能在http请求头中携带,任何js脚本都无法修改cookie。这样在极大程度上提高了cookie的安全性
sameSite
禁止第三方cookie,避免和跨站请求一起携带cookie。
签名
服务器为每个cookie都生成一个签名,它会跟随着cookie一起返回给客户端并且保存起来。这样当cookie被修改之后服务器能够通过算法计算出签名是否匹配。从而判断出cookie是否被篡改。