HTTP 协议是一种无状态协议,即每次服务端接收到客户端的请求时,都是一个全新的请求,服务器并不知道客户端的历史请求记录;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的无状态特性。
Session
客户端请求服务端,服务端会为这次请求开辟一块内存空间,这个对象便是 Session 对象,存储结构为 ConcurrentHashMap。
如何判断是同一对话
服务器收到请求,会开辟Session空间,生成一个sessionId,然后通过请求头发给客户端Set-Cookie,要求客户端设置Cookie的响应。客户端收到响应后会在本机客户端设置Cookie信息,此后每一次相同服务端的请求都会带Cookie信息,可以获取请求的sessionId。
Session 的缺点
Session 机制有个缺点,比如 A 服务器存储了 Session,就是做了负载均衡后,假如一段时间内 A 的访问量激增,会转发到 B 进行访问,但是 B 服务器并没有存储 A 的 Session,会导致 Session 的失效。
Cookie
HTTP 协议中的 Cookie 包括web Cookie 和浏览器 Cookie,它是服务器发送到 Web 浏览器的一小块数据。服务器发送到浏览器的 Cookie,浏览器会进行存储,并与下一个请求一起发送到服务器。
Cookie 主要目的
- 会话管理
登陆、购物车、游戏得分或者服务器应该记住的其他内容
- 个性化
用户偏好、主题或者其他设置
- 追踪
记录和分析用户行为
Cookies类型
一种是 Session Cookies,一种是 Persistent Cookies,如果 Cookie 不包含到期日期,则将其视为会话 Cookie。会话 Cookie 存储在内存中,永远不会写入磁盘,当浏览器关闭时,此后 Cookie 将永久丢失。如果 Cookie 包含有效期 ,则将其视为持久性 Cookie。到期指定的日期,Cookie 将从磁盘中删除。
Token(JWT)
JWT 具有加密签名,而 Session Cookies 则没有。JWT 是无状态的,被存储在客户端。JWT更具有良好的可扩展性,而且支持跨域验证