JWT 双 Token 机制(通常指 Access Token + Refresh Token)的核心目的只有一句话: 👉 在保证安全性的前提下,让用户“尽量少重新登录”。
下面我从单 Token 的问题 → 双 Token 如何解决 → 实际优势 → 适用场景,一步一步说明「为什么要用双 Token」。
一、先看单 Token(只有 Access Token)的问题
如果系统只用一个 JWT(Access Token),你会遇到几个矛盾点:
1️⃣ Token 有效期长 → 安全性差
- Token 一旦泄露
- 攻击者可以长期使用
- 无法主动失效(JWT 是无状态的)
2️⃣ Token 有效期短 → 用户体验差
- 比如 15 分钟过期
- 用户频繁被踢下线
- 前端要反复登录
⚠️ 本质冲突: 安全 = 短有效期 体验 = 长有效期
单 Token 无法同时满足。
二、双 Token 是怎么解决这个矛盾的?
双 Token 结构
| Token 类型 | 作用 | 有效期 | 使用频率 |
|---|---|---|---|
| Access Token | 接口鉴权 | 短(10~30 分钟) | 高频 |
| Refresh Token | 换新 Access Token | 长(7~30 天) | 低频 |
流程示意
登录
↓
返回:
- access_token(短期)
- refresh_token(长期)
请求接口
↓
access_token 过期?
↓ 是
用 refresh_token 换新的 access_token
三、双 Token 的核心优势(重点)
✅ 1. Access Token 泄露,风险可控
- Access Token 有效期很短
-
就算被截获:
-
最多只能用十几分钟
- 无法无限期调用接口
📌 安全性大幅提升
✅ 2. Refresh Token 可控、可失效
Refresh Token 通常:
- 只存服务端(数据库 / Redis)
-
可以做到:
-
手动吊销
- 用户退出登录即失效
- 异地登录踢下线
refresh_token 是“有状态”的
access_token 是“无状态”的
📌 弥补了 JWT 无法主动失效的缺陷
✅ 3. 用户几乎无感知续期(体验好)
- Access Token 自动刷新
- 用户不需要重新登录
- 前端可以拦截 401 → 自动 refresh
// 典型前端逻辑
if (res.status === 401) {
await refreshToken()
retryRequest()
}
📌 体验接近 Cookie Session,但更适合前后端分离
✅ 4. 减少 Token 被长期滥用的可能
对比一下:
| 方案 | Token 泄露后 |
|---|---|
| 单 Token(30 天) | 攻击者 30 天随便用 |
| 双 Token | 攻击者最多用 10~30 分钟 |
📌 这是双 Token 最大的安全收益
✅ 5. 更符合实际安全分级
双 Token 本质是 权限分层:
- Access Token: 👉 “我现在能不能访问接口?”
- Refresh Token: 👉 “我有没有资格继续登录?”
📌 类似「临时工证 + 身份证」
四、为什么 Refresh Token 一般不用 JWT?
很多系统会这样设计:
- Access Token:JWT
- Refresh Token:随机字符串(UUID)
原因:
| 原因 | 说明 |
|---|---|
| 可控性 | 能随时吊销 |
| 安全 | 不暴露用户信息 |
| 防重放 | 可绑定设备 / IP |
📌 Refresh Token 一定要可失效
五、双 Token vs Session(你可能会关心)
| 对比项 | Session | 双 Token |
|---|---|---|
| 前后端分离 | ❌ | ✅ |
| 无状态扩展 | ❌ | ✅ |
| 移动端支持 | 一般 | 很好 |
| 安全性 | 高 | 高(设计好) |
| 微服务 | 一般 | 非常适合 |
六、什么时候“没必要”用双 Token?
❌ 以下情况可以不复杂化:
- 内部后台系统
- 短期工具
- 只在可信内网
- 用户量很小
✅ 适合双 Token 的场景:
- Web + App
- 前后端分离
- 微服务
- 对安全有要求的业务
七、总结一句话
JWT 双 Token 机制的优势在于: 用短期 Token 保证安全,用长期 Token 保证体验,同时弥补 JWT 无法失效的缺陷。
Comments !