文章目录
- JWT 和 Session
-
- 一、核心原理
-
- 1. Session
- 2. JWT
- 二、关键区别对比
- 三、结合你之前学的 RESTful
- 四、通俗比喻
- JWT
-
- 先把核心逻辑拆成3步(全程不查库、不存状态)
-
- 1. 登录时:服务器用**同一个秘钥**签发 JWT
- 2. 后续请求:客户端请求头带上 JWT
- 3. 服务器接收请求:只做「验签+解析」,不查库、不存会话
- 回答疑问:
-
- 1. 是不是服务器一把钥匙,所有用户共用?
- 2. 那怎么区分不同用户?
- 为什么不用查库、不用存状态?
- 补充一个关键点(避坑)
- 极简一句话总结
- 正规开发就是直接弃用 Session
-
- 为什么用了 JWT 就不需要 Session?
- 什么时候会两个一起用?
- 直白对比选型
- 一句话记住
JWT 和 Session
Session:状态存在服务器 JWT:状态存在客户端
一、核心原理
1. Session
👉 有状态:服务端要保存用户登录状态
2. JWT
👉 无状态:服务端不存用户信息,信息都藏在JWT里
二、关键区别对比
| 状态存储 | 存服务端 | 存客户端 |
| 是否无状态 | 有状态 | 天生无状态,契合RESTful |
| 服务器压力 | 集群要共享Session,麻烦 | 不用存,天生适合分布式、微服务 |
| 过期注销 | 服务端可控,随时销毁 | 令牌没过期就一直能用,无法主动作废 |
| 占用带宽 | 每次只传SessionID(很小) | JWT字符串较长,每次请求都带 |
| 跨域/移动端 | 依赖Cookie,跨域麻烦 | 放Header,天生适合APP、小程序、前后端分离 |
三、结合你之前学的 RESTful
- RESTful 要求无状态,所以优先用 JWT
- Session 是传统 JavaWeb 有状态方案,不符合 REST 无状态规范
四、通俗比喻
- Session:去网吧办会员卡,网吧后台记着你的身份,你只带卡号就行
- JWT:拿一张加密的身份通行证,纸上面写好你是谁、权限多少,店家不用记你,只验真伪
JWT
服务器手里有一把「万能密钥/密码」,所有用户都用这同一把密钥加解密、验签名;只是每个用户生成的JWT令牌内容不一样。
先把核心逻辑拆成3步(全程不查库、不存状态)
1. 登录时:服务器用同一个秘钥签发 JWT
流程:
👉 关键点: 所有用户的JWT,都是用服务器「同一个秘钥」签出来的
2. 后续请求:客户端请求头带上 JWT
前端每次接口请求,在请求头里放:
Authorization: Bearer 这一大串JWT字符串
3. 服务器接收请求:只做「验签+解析」,不查库、不存会话
服务器拿到JWT后做两件事:
- 校验通过:说明这串JWT没被篡改、不是伪造的
- 校验失败:直接拦截,401未授权
回答疑问:
1. 是不是服务器一把钥匙,所有用户共用?
是的 HS256 这种常用方式:
- 服务端配置一个固定 secretKey(比如:abc123456)
- 所有人的JWT都是用这一个密码签的
- 验签也只用这同一个密码
2. 那怎么区分不同用户?
钥匙是同一把,但「令牌里装的个人信息不一样」 好比:
- 学校统一用**同一个公章(秘钥)**开证明
- 每个人的证明纸张(JWT)内容不一样:姓名、班级、权限都写在上面
- 门卫只看:公章真不真(验签),不用去教务处查你是谁,看证明纸上内容就知道你是谁、能进哪栋楼
为什么不用查库、不用存状态?
因为用户身份、权限、过期时间,全部自己打包存在JWT令牌里了
- Session:服务器存用户数据,客户端只带一个 SessionID,必须查表
- JWT:用户数据自带在令牌里,服务器只要验真伪,拆开就能用
补充一个关键点(避坑)
极简一句话总结
服务器有唯一固定秘钥,给所有用户发通行证(JWT); 每次请求服务器只用这把秘钥验真伪、拆信息,不用存用户、不用查库,完美契合 RESTful 无状态。
正规开发就是直接弃用 Session
结论:做前后端分离、微服务、RESTful 接口,用 JWT 就完全不用 Session 了 而且正规开发就是直接弃用 Session。
为什么用了 JWT 就不需要 Session?
Session 是有状态 服务端要存会话、存 SessionID,集群还要做 Session 共享,麻烦、不适合分布式。
JWT 是无状态 用户信息、权限全塞在令牌里,服务端不用存、不用查表,完全符合 RESTful 无状态规范。
适用场景天然分开
- 传统 JSP/网页老项目:用 Session + Cookie
- 现在主流:前后端分离、Vue/React、APP、小程序、微服务:统一 只用 JWT,抛弃 Session
什么时候会两个一起用?
几乎没有正规项目这么干,纯属多此一举、画蛇添足。
- 没必要既在服务端存 Session,又在客户端带 JWT
- 占带宽、增加复杂度、还破坏无状态设计
直白对比选型
| 前后端分离、APP、小程序、微服务、REST接口 | 只用 JWT |
| 老式 JSP 项目、不分离的传统网页 | 用 Session |
一句话记住
新项目、接口开发、RESTful 风格:JWT 干掉 Session,彻底不用。 只有老旧遗留项目才继续用 Session。
顺带帮你串起来: HTTP无状态 → RESTful要求无状态 → 所以不用有状态的Session → 改用无状态的JWT。





