0
点赞
收藏
分享

微信扫一扫

JWT + session 结合模式 进行登陆中的 职责划分

一、🔧 专业角度解释:JWT + Session 结合模式中的职责划分

✅ 1. JWT(JSON Web Token)用来做什么?

  • 作用:用户身份标识与认证凭证
  • 常用于:前端和后端之间的身份验证(特别是前后端分离)
  • 存储位置:客户端(通常是浏览器的 localStoragecookie

特点:

  • 无需服务器记录状态(无状态认证)
  • 每次请求都携带 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,进行权限判断
举报

相关推荐

0 条评论