一、为什么 JWT 还需要 Redis?
很多人认为:
JWT 是无状态的,不需要 Redis。
理论上没错。
JWT:
用户信息
+
签名
↓
Token
服务器收到 Token 后:
验证签名
↓
解析用户信息
不需要查询数据库。
但是企业中仍然经常结合 Redis。
原因:
JWT 本身无法主动失效。
例如:
用户登录:
Token 有效期 7 天
第二天:
用户退出登录。
但是:
这个 Token 仍然有效。
因为服务器不知道用户退出了。
所以加入 Redis:
Token
↓
Redis
↓
控制有效状态
二、登录流程(企业方案)
流程:
用户登录
↓
验证用户名密码
↓
生成 JWT
↓
保存 Token 到 Redis
↓
返回 Token
例如:
Redis:
key:
token:user:1001
value:
jwt_xxxxx
TTL:
7200秒
三、请求验证流程
用户请求接口:
请求 Header
Authorization:
Bearer token
服务器:
第一步:
验证 JWT:
Token是否合法
第二步:
查询 Redis:
token:user:1001
存在:
继续访问。
不存在:
返回:
登录失效
四、退出登录如何实现?
JWT 最大问题:
无法主动删除。
Redis 解决:
退出:
删除 Redis 中 Token
流程:
用户点击退出
↓
删除 Redis Token
↓
Token立即失效
例如:
删除:
DEL token:user:1001
之后:
用户再次请求:
JWT验证通过
↓
Redis没有Token
↓
拒绝访问
五、Token 黑名单
场景:
管理员强制下线用户。
例如:
发现账号异常。
需要:
立即让 Token 失效。
方案:
建立黑名单:
Redis:
blacklist:token_xxx
value:
1
TTL:
剩余有效时间
请求:
检查Token
↓
是否在黑名单
↓
存在
↓
拒绝
六、单点登录(SSO)
什么是单点登录?
一个账号:
只能登录一个设备。
例如:
电脑登录:
Token A
手机登录:
Token B
新的登录:
删除旧 Token。
Redis:
user:1001:token
↓
Token B
旧 Token:
自动失效。
七、多端登录
有些系统允许:
电脑:
Token A
手机:
Token B
平板:
Token C
Redis:
使用 Set:
user:1001:tokens
TokenA
TokenB
TokenC
八、Redis Key 设计
企业常见:
保存登录 Token
token:user:{userId}
例如:
token:user:1001
保存登录设备
user:session:{userId}
Token 黑名单
token:blacklist:{token}
九、Token 续期
例如:
Token:
有效期:
2小时。
用户持续操作:
自动续期。
流程:
用户请求
↓
刷新 Redis TTL
↓
继续保持登录
例如:
EXPIRE token:user:1001 7200
十、为什么不用数据库保存 Token?
如果每次请求:
查询:
SELECT token
FROM user_token
WHERE user_id=1001;
问题:
- 数据库压力大
- 查询慢
- 高并发性能差
Redis:
GET token:user:1001
速度更快。
十一、企业登录架构
用户登录
↓
NestJS
↓
用户名密码验证
↓
生成 JWT
↓
Redis
保存 Token 状态
↓
返回客户端
请求:
客户端
↓
JWT
↓
Redis验证
↓
业务接口
十二、本章总结
| 功能 | Redis作用 |
|---|---|
| 保存 Token | 管理登录状态 |
| 退出登录 | 删除 Token |
| 强制下线 | Token 黑名单 |
| 单点登录 | 保存当前 Token |
| 多端登录 | 保存多个 Token |
| 续期 | 刷新 TTL |
本章一句话总结
JWT 负责身份认证,Redis 负责控制 Token 的有效状态,二者结合才能实现企业级登录管理。
思考题(精简回答)
-
JWT 已经包含用户信息,为什么企业还需要 Redis?
因为 JWT 本身无法主动失效。Redis 可以管理 Token 状态,实现:退出登录、强制下线、Token过期控制 -
用户退出登录时,为什么不能直接删除 JWT? 因为 JWT 保存在客户端,服务器无法直接删除。只能通过 Redis 删除 Token 状态,让该 Token 失效。
-
Redis 保存 Token 的 Key 应该如何设计?
推荐使用业务前缀:token:user:{userId} -
什么是 Token 黑名单?它解决什么问题?
Token 黑名单是保存已经失效 Token 的列表。用于解决:强制用户下线、Token泄露后立即失效问题 -
单点登录和多端登录在 Redis 中存储方式有什么区别?
单点登录:一个用户只保存一个 Token。新登录覆盖旧 Token。
多点登录:一个用户保存多个 Token。通常使用 Set。 -
为什么 Token 状态适合存 Redis,而不是 MySQL?
因为 Token 查询频繁,需要高速访问。