【从你按下登录按钮开始:服务器究竟是怎么知道“你是谁”的?——Session 与 JWT 认证机制解析 】
一、透过现象看本质:服务器如何识别用户?
HTTP 是无状态协议
也就是说:
服务器不知道你是谁
例如:
请求1:登录
请求2:查看订单
服务器其实无法知道:
这两个请求是不是同一个人
所以必须有一种机制:
让服务器识别用户身份
这就是:
登录态(Login State)
而 Session 和 JWT,本质上都是解决:
如何在多次请求中识别用户
二、Session 登录机制
传统的方式:Session
Session 登录流程
第一步:用户登录
客户端发送:
POST /login
username
password
服务器验证成功。
第二步:服务器创建 Session
服务器会生成一个:
sessionId
例如:
abc123xyz
然后服务器保存:
sessionId → 用户信息
存在:
服务器内存
Redis
数据库
例如:
abc123xyz → userId=1001
第三步:返回 Cookie
服务器返回:
Set-Cookie: sessionId=abc123xyz
浏览器自动保存。
第四步:后续请求
之后所有请求都会带上:
Cookie: sessionId=abc123xyz
服务器收到请求后:
查询 sessionId
找到:
userId=1001
于是知道:
这个用户是谁
Session 结构
本质是:
客户端
│
│ sessionId
▼
服务器
│
└ sessionId → 用户信息
核心特点:
用户信息存服务器
所以:
Session = 有状态认证
三、Session 的问题
Session 在 单机系统很好用。
但在互联网架构里会出现问题。
假设有三个服务器:
用户
│
▼
负载均衡
├─ server1
├─ server2
└─ server3
问题来了:
Session 在 server1
下一次请求可能到:
server2
server2 没有 Session。
用户就会:
登录失效
解决方案
有两个方案:
方案1:Session复制
server1 → server2 → server3
同步 Session。
缺点:
性能差
复杂
方案2:Session集中存储
例如使用:
:contentReference[oaicite:0]{index=0}
结构:
server → Redis → session
这样所有服务器都能访问 Session。
但问题是:
服务器仍然需要存状态
这就是:
Session 的核心问题
四、JWT 登录机制
JWT 的设计理念是:
服务器不要存登录状态
所以叫:
无状态认证
JWT 全称:
JSON Web Token
JWT 登录流程
第一步:用户登录
客户端发送:
username
password
服务器验证成功。
第二步:服务器生成 JWT
服务器生成一个 Token:
header.payload.signature
例如:
xxxxx.yyyyy.zzzzz
payload 里面直接包含:
userId
username
expireTime
例如:
{
userId:1001,
exp:1700000000
}
然后服务器用 密钥签名(HS256和RS256)
如下超链接是HS256和RS256的区分。
签名算法HS256和RS256
第三步:返回 Token
服务器返回:
token
客户端保存。
通常放在:
localStorage
或者:
Authorization header
第四步:后续请求
客户端请求:
Authorization: Bearer token
服务器收到后:
解析 token
验证签名
如果合法:
直接获取 userId
不需要查数据库。
五、JWT 的结构
JWT 结构:
客户端
│
│ token
▼
服务器
│
解析token
核心特点:
用户信息存在 Token 里
服务器:
不存任何登录状态
所以:
JWT = 无状态认证
六、Session vs JWT 核心区别
| 特点 | Session | JWT |
|---|---|---|
| 状态 | 有状态 | 无状态 |
| 数据存储 | 服务器 | Token |
| 扩展性 | 一般 | 非常好 |
| 服务端存储 | 需要 | 不需要 |
| 安全控制 | 容易 | 较复杂 |
| 失效控制 | 可以立即失效 | 较难 |
七、JWT 最大的问题
JWT 最大的问题是:
无法主动失效
例如:
用户退出登录
Session:
删除 session
JWT:
token 仍然有效
除非:
等待 token 过期
所以很多系统会使用:
JWT + Redis 黑名单
八、业务场景真实方案
很多大厂使用的是:
JWT + Redis
结构:
登录 → 返回JWT
↓
Redis存token
验证流程:
1 验证JWT签名
2 查询Redis是否存在
这样可以实现:
可扩展 + 可注销
更多推荐




所有评论(0)