20、JWT、Session、Cookie、Token 关系一图讲清
这是前端/后端面试里非常高频、也非常容易混淆的一组概念。
很多人会把它们混着说,其实它们不是同一层的东西。
最核心的一句话是:
Cookie 是存储/传输方式,Session 是服务端会话机制,Token 是认证凭证,JWT 是 Token 的一种具体实现格式。
如果你先把这句话说出来,面试官会觉得你思路很清晰。
一、先用一张“关系图”讲清
用户登录
|
v
服务端认证用户身份
|
+-----------------------------+
| |
| 方案一:Session 方案 | 方案二:Token 方案
| |
v v
服务端创建 Session 服务端签发 Token
并保存用户会话数据 (JWT 是 Token 的一种)
| |
v v
把 SessionID 发给浏览器 把 Token 发给浏览器
| |
v v
浏览器通常用 Cookie 存 SessionID 浏览器可用 Cookie / 内存 / Storage 存 Token
| |
v v
后续请求携带 SessionID 后续请求携带 Token
| |
v v
服务端查 Session 服务端校验 Token
| |
v v
确认用户身份 确认用户身份
二、四者分别是什么
1. Cookie 是什么
Cookie 是浏览器提供的一种客户端存储机制,同时它还有一个重要特点:
浏览器会在后续同源请求中自动携带 Cookie。
所以 Cookie 的本质是:
- 一种浏览器存储方式
- 一种请求自动携带机制
它不是认证方案本身
Cookie 只是一个“容器”,里面可以放:
- SessionID
- Token
- 其他业务字段
常见特点
- 存储在浏览器
- 容量小,一般约 4KB
- 可以设置过期时间
- 可以设置:
HttpOnlySecureSameSite
2. Session 是什么
Session 是一种服务端会话机制。
意思是:
用户登录后,服务端创建一份会话数据保存在服务端,然后给客户端一个会话标识
SessionID。
客户端后续请求带着SessionID,服务端根据它找到对应的会话数据。
Session 的关键点
- 用户信息主要存在服务端
- 浏览器通常只保存一个
SessionID - 这个
SessionID常常放在 Cookie 里
所以 Session 模式通常是:
服务端存用户登录状态
客户端存 SessionID
3. Token 是什么
Token 是一种身份认证凭证。
你可以把它理解为:
服务端签发给客户端的一张“通行证”,客户端后续请求时带上它,服务端校验它来识别用户身份。
Token 的关键点
- 它是“认证信息”
- 常用于前后端分离、移动端、微服务
- 一般由客户端主动放在请求头里,例如:
Authorization: Bearer xxxxx
注意
Token 不是某一种固定格式,它只是一个统称。
比如:
- 随机字符串可以是 Token
- JWT 也可以是 Token
4. JWT 是什么
JWT 全称是:
JSON Web Token
它是 Token 的一种具体格式标准。
也就是说:
JWT 属于 Token,但 Token 不一定是 JWT。
JWT 的特点
JWT 通常由三部分组成:
Header.Payload.Signature
例如:
xxxxx.yyyyy.zzzzz
三部分含义
Header:头部,说明算法、类型Payload:载荷,保存用户信息、过期时间等Signature:签名,防止内容被篡改
JWT 最大特点
- 自包含
- 服务端不一定需要保存会话数据
- 只要校验签名即可
所以 JWT 常用于:
- 无状态认证
- 前后端分离
- 分布式系统
三、它们之间到底是什么关系
这是最关键的部分。
1. Cookie 和 Session 的关系
很多传统 Web 登录机制是这样工作的:
登录成功
-> 服务端创建 Session
-> 服务端生成 SessionID
-> 把 SessionID 放到 Cookie 返回给浏览器
-> 浏览器以后自动带上 Cookie
-> 服务端根据 SessionID 找到 Session
所以你可以说:
Session 是服务端的会话数据,Cookie 是客户端保存 SessionID 的载体。
2. Cookie 和 Token 的关系
Token 本身不是存储方式,它需要找个地方存起来。
Cookie 可以作为 Token 的存储位置之一。
比如:
- 服务端把 Token 写进 Cookie
- 浏览器自动带上
但也可以不用 Cookie,改成:
- 放内存
- 放
sessionStorage - 放
localStorage - 然后手动加到
Authorization请求头
所以:
Cookie 可以存 Token,但 Cookie 不等于 Token。
3. Token 和 JWT 的关系
这个最好理解:
JWT 是 Token 的一种具体实现格式。
就像:
- “水果”是大类
- “苹果”是其中一种
那么:
Token是大类JWT是其中一种
4. Session 和 Token 的关系
它们都是“认证方案”,但思路不同。
Session 方案
- 状态保存在服务端
- 客户端只存
SessionID
Token 方案
- 身份信息或认证信息保存在 Token 中
- 客户端持有 Token
- 服务端通过校验 Token 识别身份
所以:
Session 和 Token 是两种不同的认证思路。
四、再用一张对比图讲清
Cookie -> 浏览器存储机制 / 自动携带机制
Session -> 服务端会话机制
Token -> 身份认证凭证
JWT -> Token 的一种标准格式
再换一种更容易背的表达:
Cookie:装东西的“盒子”
Session:服务端保存的“会话档案”
Token:发给客户端的“通行证”
JWT:长得有固定格式的一种“通行证”
这个类比很适合面试说。
五、两套主流认证流程,一次讲清
方案一:Session + Cookie
这是传统 Web 最经典的认证方式。
流程图
1. 用户登录,提交用户名密码
2. 服务端验证成功
3. 服务端创建 Session,并保存用户信息
4. 服务端把 SessionID 写入 Cookie 返回给浏览器
5. 浏览器后续请求自动携带 Cookie
6. 服务端根据 SessionID 找到 Session
7. 识别用户身份,返回数据
特点
- 服务端保存登录状态
- 浏览器自动携带 Cookie
- 适合传统服务端渲染应用
优点
- 可控性强
- 服务端可随时销毁 Session
- 安全管理相对集中
缺点
- 服务端有状态
- 分布式系统下要考虑 Session 共享
- 扩展性不如纯 Token 方案灵活
方案二:Token / JWT 方案
前后端分离里很常见。
流程图
1. 用户登录,提交用户名密码
2. 服务端验证成功
3. 服务端签发 Token(常见是 JWT)
4. 客户端保存 Token
5. 客户端后续请求在请求头里携带 Token
6. 服务端校验 Token
7. 识别用户身份,返回数据
常见请求头
Authorization: Bearer <token>
特点
- 服务端可以更“无状态”
- 不依赖传统 Session
- 更适合前后端分离、移动端、微服务
优点
- 跨服务更方便
- 分布式扩展性更好
- 客户端控制更灵活
缺点
- 一旦泄露,风险较大
- 主动注销、踢下线、续签设计更复杂
- JWT 过大时会增加传输成本
六、面试中最容易混淆的点
1. Cookie 不是 Session
很多人会误以为 Cookie 就是 Session。
其实不是。
正确说法是:
Session 在服务端,Cookie 在客户端。
Cookie 通常只是用来保存 SessionID。
2. Token 不等于 JWT
正确说法:
Token 是认证凭证的统称,JWT 是 Token 的一种格式。
3. JWT 不一定放在 localStorage
JWT 只是一个字符串格式,它可以存放在:
- 内存
- Cookie
- sessionStorage
- localStorage
所以不要把“JWT”和“localStorage”绑死。
4. Cookie 不只是用来存 Session
Cookie 也可以存:
- Token
- 偏好设置
- 追踪标识
但现代开发里,Cookie 更多用于和服务端交互相关的状态。
七、怎么从“安全角度”把它们串起来
这部分很加分。
Session + Cookie 方案的风险点
- 主要关注 CSRF
- 因为 Cookie 会自动携带
防护措施
SameSite- CSRF Token
SecureHttpOnly
Token / JWT 方案的风险点
- 如果 Token 存在 JS 可读位置,主要关注 XSS
- 因为恶意脚本可能直接读取 token
防护措施
- 不把敏感长期凭证暴露给 JS
HttpOnly Cookie- 短效 access token
- refresh token 机制
- CSP
- 输入过滤
八、一句话理解“有状态”和“无状态”
面试很喜欢问。
Session:偏有状态
因为服务端要保存用户会话数据。
JWT:偏无状态
因为认证信息放在 token 里,服务端主要做校验,不一定保存会话。
但你也可以补一句更严谨的话:
JWT 常被称为无状态认证,但在真实项目中,为了支持注销、黑名单、续签等能力,服务端往往还是会保留部分状态,所以“无状态”并不是绝对的。
这句很高级。
九、面试高分回答模板
你可以直接这样答:
这几个概念其实不在同一层。
Cookie是浏览器的存储和自动携带机制;Session是服务端保存用户会话的一种认证方案;Token是身份认证凭证;JWT则是 Token 的一种标准格式。如果是传统登录方式,通常是用户登录成功后,服务端创建 Session,把 SessionID 放到 Cookie 里返回给浏览器,浏览器后续请求自动带上 Cookie,服务端再根据 SessionID 找到对应的 Session。
这时 Cookie 是载体,Session 是服务端会话。如果是前后端分离场景,更常见的是 Token 方案。用户登录成功后,服务端签发 Token,客户端后续请求通过
Authorization头携带它,服务端通过校验 Token 来识别用户身份。
而 JWT 只是 Token 的一种具体实现,它把用户信息、过期时间等内容编码进 token 里,并通过签名防止篡改。所以它们的关系可以总结成一句话:
Cookie 是容器,Session 是服务端状态,Token 是凭证,JWT 是 Token 的一种格式。
十、2 分钟背诵版
JWT、Session、Cookie、Token 这几个概念经常一起出现,但它们其实不是同一个层面的东西。
我的理解是:Cookie是浏览器端的存储和自动携带机制,Session是服务端会话机制,Token是身份认证凭证,而JWT是 Token 的一种标准格式。传统 Web 登录一般是 Session + Cookie 模式。用户登录成功后,服务端会创建一份 Session,保存用户登录状态,然后把一个 SessionID 返回给浏览器,浏览器通常会把它存到 Cookie 里。后续请求时浏览器自动带上 Cookie,服务端根据 SessionID 找到对应的 Session,从而识别用户身份。
所以在这个模式里,Session 是服务端保存的数据,Cookie 只是客户端保存 SessionID 的载体。而在前后端分离场景里,更常见的是 Token 认证。用户登录成功后,服务端签发一个 Token,客户端后续请求通过
Authorization请求头携带这个 Token,服务端校验后确认身份。这里的 Token 是一个统称,不一定是 JWT,也可以是普通随机字符串。
JWT 则是 Token 的一种具体格式,通常由 Header、Payload、Signature 三部分组成,特点是自包含、可校验,常用于无状态认证。所以总结来说:
Cookie解决的是“客户端怎么存、怎么带”的问题;Session和Token解决的是“服务端怎么识别用户”的问题;JWT解决的是“Token 长什么样”的问题。
这四者经常组合使用,但不能混为一谈。
十一、30 秒精简版
Cookie是浏览器存储和自动携带机制,Session是服务端会话,Token是身份凭证,JWT是 Token 的一种格式。
传统登录一般是 Session + Cookie:服务端存会话,客户端 Cookie 存 SessionID。
前后端分离一般是 Token/JWT:服务端签发 Token,客户端后续请求携带它。
所以一句话总结就是:Cookie 是容器,Session 是服务端状态,Token 是凭证,JWT 是 Token 的一种实现。
十二、最后送你一个“万能类比”
你在面试里可以这样类比:
- Cookie:像钱包,负责装东西
- Session:像酒店前台保存的入住档案
- Token:像门禁卡,证明你有权限
- JWT:像一种标准格式的电子门禁卡,上面写了身份信息和签名
这个类比很容易让面试官觉得你表达能力强。
更多推荐




所有评论(0)