Open HolyZheng opened 6 years ago
流程上是这样的:
JWT由三部分组成
{
'typ': 'JWT',
'alg': 'HS256'
}
推荐阅读: 伯乐在线——HTTP 缓存机制一二三 IMWeb前端博客——HTTP缓存控制小结 IT笔录——http消息头
关键头部字段
- cache-control、 Pragma
- if-Match、if-None-Match
- if-Modified-Since、if-Unmodified-Since
- ETag
- Expires、Last-Modified
Pragma
http1.0可用,现在为了向下兼容,也设置该头部,只有一个值:no-cache禁用缓存
Expires
设置缓存时间(该时间相对于服务器),接受一个GMT(格林尼治时间),用来告诉浏览器过期时间,如果还没有过这个时间则不发送请求。
Expires: Sun Jul 15 2018 19:13:07 GMT
cache-control
也可用来设置缓存时间,http1.1,三者优先级:
Pragma > Cache-Control > Expires
可设置多个值,比如常用的:no-cache, max-age, public, private
Last-Modified
接受一个格林尼治时间,说明资源的最近一次的修改时间,该字段的作用是当某个资源保存的缓存时间过期了,但服务器并没有更新过这个资源,那么可以告诉客户端此资源没有更新,可以获取缓存中的内容(返回304,不返回实体内容)
if-Modified-Since
Last-Modified的值会在下一次的请求中通过if-Modified-Since传递给服务器,如果它的值和此时服务器的Last-Modified值一致,说明没有修改,服务器返回304。如果不一致则当作正常请求处理,返回资源和200状态码。
ETag
服务端资源有可能被更新了,但是实际内容并没有改变。但是这样依然会引起Last-Modified的更新,服务器给客户端返回没有任何改变的内容。为了解决这个问题,引入了ETag。用于http1.1。 服务器为资源生成一个唯一的字符串,如通过md5编码。只要不变,生成的字符串就不变。在客户端请求资源的时候,将该ETag一起返回给客户端,客户端保留该ETag,下次请求的时候带上。然后比较ETag,相同则表示内容相同,返回304;不同,返回资源和200状态码。
If-None-Match
ETag的值会通过if-None-Match头部传递给服务器,然后服务器比较ETag的值,相同则表示内容相同,返回304;不同,返回资源和200状态码。
另外的 if-Match,if-Unmodified-Since
他们不是用来实现缓存策略的,而是用来优化并发控制,他们的作用是,使得当前请求成为条件式请求:只有当资源在指定的时间之后没有进行过修改的情况下,服务器才会返回请求的资源,或是接受 POST 或其他 non-safe 方法的请求。例如在某些场景:假如在原始副本获取之后,服务器上所存储的文档已经被修改,那么对其作出的编辑会被拒绝提交。
websocket协议的特点:建立在 TCP 协议之上,默认端口也是80和443,服务器可以主动向客户端推送消息,客户端也可以向服务器发送消息,双向平等对话。 阮一峰WebSocket 教程
http1.1协议使用了持续连接,所谓持续连接就是在服务器响应了请求之后后仍然可以保持一段时间的连接,使得我们可以继续在此次连接上发送后续的http请求和响应。
相比于1.0的通过文本方式传输数据,2.0采用二进制方式传输数据;文本的表现形式有多样性,要考虑的场景比较多,而二进制只有0和1,解析速度更快。
http1.1中,会存在一个叫做“对头阻塞”的问题,因为在1.1中,在接受响应的时候,要按照请求发送的顺序来接收响应,如何前面的请求阻塞了,后面的请求即使处理完了,也要继续等待。 http2.0 引入了多路复用来解决,它引入了两个关键的概念——“帧(frame)”和“流(stream)”。
http2.0会对头部进行压缩,而且通信双方会维护一个索引表,在再之后的请求中,可以只传输键名来减少重复传输的内容
http2.0中,服务端可以在客户端某个请求后,响应额外的静态资源,减少请求数。对于一些客户端必须的资源,可提前推送,减少延迟。
配置 access-control-allow-origin 头遇到的问题:
the 'Access-Control-Allow-Origin' header contains multiple values xxx, but only one is allowed.
解决方法,判断origin,命中域名后再设为Access-Control-Allow-Origin的值
if (corsHost.host.includes(ctx.request.origin)) {
ctx.set('Access-Control-Allow-Origin', ctx.request.origin);
ctx.set('Access-Control-Allow-Headers', 'Content-Type, Content-Length, Authorization, Accept');
ctx.set('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE');
}
The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*'
when the request's credentials mode is 'include'.
document.cookie = 'name=value;domain=.xx.com;'
TCP首部几个信息:
为什么需要三次握手? 三次握手是为了确保双方能正常通信,防止因网络原因已失效的请求又传到了服务端而产生错误。 服务端收到失效报文后,若无“三次握手”,会认为客户端此时要建立连接但客户端并不知情。
3.http请求
建立连接后进行http请求
4. tcp连接断开,四次挥手
为什么需要四次挥手? 因为主动断开的一方已经没有数据发送了,但是被动断开的一方,收到断开请求和发送确认信息后,可能还有数据要发送,当确定没有数据要发送后,再向主动方发送断开请求,主动发收到后再发送确认信息。
5. 浏览器接收到资源,渲染页面等
post和get的差别
④请求头
⑤响应头
Allow, Content-Encoding, Content-length, Content-type, Date, Expires, Last-Modified
请求头和响应头
⑥状态码
200,301,404,500. 状态码
https协议
https, 全称Hyper Text Transfer Protocol Secure(超文本传输安全协议),比http多了一个TLS(SSL)层,https是HTTP运行在SSL/TLS之上,SSL/TLS运行在TCP之上。所有传输的内容都经过加密,加密采用对称加密,但对称加密的密钥用服务器方的证书进行了非对称加密。此外客户端可以验证服务器端的身份,如果配置了客户端验证,服务器方也可以验证客户端的身份。
角色:ca机构(证书授权中心)服务器 客户端
①对称加密
在加密和解密时使用相同得密钥,或是两个可以简单互推得密钥。
②非对称加密
具有私钥和公钥,公开出去得密钥叫做公钥,不公开得叫私钥,公钥加密的信息只有对应的私钥能解密