一、🔧 专业角度解释:JWT + Session 结合模式中的职责划分
✅ 1. JWT(JSON Web Token)用来做什么?
- 作用:用户身份标识与认证凭证
- 常用于:前端和后端之间的身份验证(特别是前后端分离)
- 存储位置:客户端(通常是浏览器的
localStorage
或cookie
)
特点:
- 无需服务器记录状态(无状态认证)
- 每次请求都携带 JWT(如放在请求头 Authorization 里)
- 可包含自定义信息(用户ID、角色等)
在结合模式中,JWT 通常负责:
- 登录后返回一个签名后的
accessToken
给前端 - 每次请求时用于验证“你是谁”
- 解码后识别用户身份,但不一定存用户会话状态
✅ 2. Session(服务器会话)用来做什么?
- 作用:保存用户的会话状态、行为信息、权限控制等
- 常用于:服务端需要保存的用户状态,如购物车、权限列表、临时操作等
- 存储位置:服务器内存、Redis 等
特点:
- 状态保存在服务端(有状态认证)
- 基于 sessionId 识别用户
- 更容易管理和撤销(如后台强制下线)
在结合模式中,Session 通常负责:
- 存储登录用户的完整会话数据,如用户对象、角色、权限、临时缓存
- 在 JWT 解码后,根据用户ID取出 session 中的状态信息
二、🍱 通俗类比理解:JWT + Session 就像门禁卡 + 公司档案室
假设你去公司上班,公司是这样安排的:
🔐 JWT 就像“你的门禁卡”
- 登录后你拿到一张电子门卡(JWT),上面写着你的员工编号(userId)
- 每次进入办公区时你刷卡(带着 JWT 发请求)
- 安保一看编号,就知道你是谁(身份认证)
但是这个门卡不能存很多信息,比如你的职务、权限、临时通知等信息,它只是个身份证明。
🗂 Session 就像“你的个人档案资料”,存放在公司内部服务器(Redis)
- 公司会在内部存储你的详细资料(如权限、岗位、临时任务),那就是 Session
- 当门卡识别出你是 userId=1001 时,系统会去资料室(Session)查找相关数据,做进一步授权处理
- 如果你被调岗了,只要改动资料室的记录就行,不需要重新发卡(不用修改 JWT)
三、典型结合流程图
[前端登录]
↓
用户名+密码
↓
[后端验证成功]
↓
- 生成 JWT(短期有效)
- 创建 Session(存完整用户信息)
↓
[前端存储 JWT]
↓
[后续请求带 JWT → 后端校验 → 查 Session]
✅ 总结对比表
项目 | JWT | Session |
存储位置 | 客户端(localStorage、cookie) | 服务端(内存、Redis) |
身份识别方式 | 解码 token 中的 userId | 根据 sessionId |
是否无状态 | ✅ 是(服务端无感知) | ❌ 否(需保存状态) |
安全撤销性 | 差(JWT 过期前可用) | 强(可立即清除 session) |
适合场景 | 前后端分离、分布式、无状态认证 | 权限管理细致、服务端状态控制较强的场景 |
✍️ 常见结合用法总结
用 JWT 识别“你是谁”,用 Session 管理“你能干什么”。
- 登录成功:
- 返回 JWT 到前端保存
- 同时服务端保存 session 信息(比如登录时间、权限)
- 请求过程:
- 前端请求时带 JWT
- 后端解码 JWT 得到 userId,再用 userId 查 Redis 中的 Session,进行权限判断