高频面试题之状态保持三剑客-Cookie-Session-JWT
1. 为什么需要状态保持?
HTTP是一种不保存状态的协议
HTTP是无状态的协议,每次客户端和服务端会话完成时,服务端不会保存任何会话信息:每个请求都是完全独立的,服务端无法确认当前访问者的身份信息,因此也无法知道上一次的请求发送者和这一次的发送者是不是同一个人。
那为什么HTTP协议是无状态的, 是为了更快的处理大量的事务,确保协议的可伸缩性!
但是服务器与浏览器为了进行会话跟踪(知道是谁在访问我),就必须主动的去维护一个状态,这个状态用于告知服务端前后两个请求是否来自同一浏览器。而这个状态需要通过 cookie 或者 session 或者JWT 去实现。
2.Cookie
Cookie是存储在客户端的一小块数据,也就是存储在本地,cookie会在浏览器下次向同一域名(服务器)发送请求的时候携带在请求头上一起发送到服务器上。
2.1 Cookie的交互流程
第一次网络交互
第二次网络交互
2.2 Cookie的优缺点
优点 | 缺点 |
---|---|
请求头携带方便 | 不能携带敏感数据,不安全, CSRF攻击 |
数据小(最多4KB )-传递快 | 存储数据体量小4kB(一个网站最多20个 一个浏览器最多300个) |
存储在客户端(浏览器) | 默认不能跨域携带Cookie(可以在父域名设置, 子域名共享解决, 字段domain) |
数据类型: 只能是字符串 |
3.Session
Session是另一种记录服务器和客户端会话状态的机制,Session是基于Cookie实现的, 使用服务器生成的session_id进行标识,用来区别用户
3.1 session的交互流程
3.2 session的优缺点
优点 | 缺点 |
---|---|
存储在服务器 | 必须依赖于Cookie, 不能独活 |
数据体量大,存储安全性高 | Session共享问题(分布式 多台存储在一台服务器) |
存储在浏览器 | 用户量大 Session存储数据越多 越占用服务器内存消耗 |
数据类型不限制 |
4. JWT- JSON-WEB-TOKEN
JWT(json web token)状态保持使用居多。一串完整的JWT由三段落组成,每个段落用英文句号连接(.)连接,他们分别是:Header、Payload、Signature,所以,常规的JWT内容格式是这样的:HHH.PPP.SSS
Header(头部) Header 部分是一个 JSON 对象,描述 JWT 的元数据
**Payload(载荷)** Payload 部分也是一个 JSON 对象,用来存放实际需要传递的数据 **Signature(签名)** Signature 部分是对前两部分的签名,防止数据篡改
4.1 JWT的交互流程
4.2 JWT的优缺点
优点 | 缺点 |
---|---|
存储在客户端, | 一旦签发JWT, 有效期内一直有效(需要特殊处理, 比方说多加一个校验字段) |
服务器压力小 | JWT建议使用HTTPS传输 |
数据加密 | |
支持跨域 |
小结:
遇到这三个中其中一个面试题的时候, 建议3个一起讲解, 主要讲解3点: 实现,交互流程,优缺点, 从cookie-session-jwt逐级递进!