JWT-token 无感刷新
1. 整体架构
核心流程:
• 无感刷新:通过 Refresh Token 自动获取新的 Access Token。
• 黑名单机制:将需要失效的 Token(如用户主动登出后的旧 Token)存入 Redis,并在验证时检查黑名单。技术栈:
• JWT(Access Token + Refresh Token)
• Redis(存储黑名单和 Refresh Token)
• 后端框架(如 Node.js/Express、Spring Boot 等)
2. 实现步骤
2.1 服务器端设计
(1) 登录接口
用户登录成功后,生成并返回 Access Token 和 Refresh Token,同时将 Refresh Token 存入 Redis。
1 | // Node.js + Express 示例 |
(2) 刷新接口
通过 Refresh Token 获取新的 Access Token,并验证 Redis 中的有效性。
1 | app.post("/refresh-token", async (req, res) => { |
(3) 黑名单机制
用户登出或需要撤销 Token 时,将旧 Access Token 加入 Redis 黑名单。
1 | app.post("/logout", async (req, res) => { |
(4) 中间件:验证 Access Token
在每次请求中验证 Access Token 是否在黑名单中。
1 | const authMiddleware = async (req, res, next) => { |
2.2 客户端设计
客户端需在 Access Token 过期前自动刷新,并在登出时触发黑名单机制。
1 | // 示例:Axios 请求拦截器(React/Vue) |
3. Redis 黑名单优化
- 自动清理:通过设置
EX
参数,让 Redis 自动删除过期的黑名单 Token。 - 内存管理:定期清理无效数据,避免内存占用过多。
- 分片存储:使用
blacklist:${token}
的键名格式,避免单个 Key 过大。
4. 安全性增强
- Refresh Token 存储:
• 使用httpOnly
Cookie 存储 Refresh Token,防止 XSS 攻击。
• 每次刷新后生成新的 Refresh Token,旧 Token 立即失效(需更新 Redis)。 - Token 轮换:
• 每次刷新 Access Token 时,生成新的 Refresh Token 并替换 Redis 中的旧值。 - 密钥管理:
• 使用强随机密钥(如ACCESS_TOKEN_SECRET
和REFRESH_TOKEN_SECRET
)。
• 定期轮换密钥,降低泄露风险。
5. 流程图
1 | 用户登录 |