2. 令牌生命周期管理:Access Token与Refresh Token的过期策略、令牌轮换机制、令牌吊销
在OIDC认证授权体系中,令牌生命周期管理是保障系统安全与用户体验平衡的核心环节。Access Token与Refresh Token承担不同职责,其过期策略、轮换机制与吊销手段共同构成了令牌的完整生命周期管控体系。本章将深入剖析这三项关键机制的设计原理与工程实践。
2.1 Access Token与Refresh Token的过期策略
Access Token用于访问受保护资源,Refresh Token用于获取新的Access Token。两者在过期策略上存在显著差异,直接决定了系统的安全水位与用户登录体验。
| 对比维度 | Access Token | Refresh Token |
|---|---|---|
| 生命周期 | 短(通常5-15分钟) | 长(通常数小时至数天) |
| 存储位置 | 客户端内存/浏览器内存 | 安全存储(HttpOnly Cookie / 服务端Session) |
| 传输频率 | 每次API请求携带 | 仅在令牌刷新时传输 |
| 泄露影响 | 有限时间窗口内可访问资源 | 可长期获取新Access Token |
| 过期后行为 | 返回401,触发刷新流程 | 返回invalid_grant,需重新认证 |
工程建议:Access Token过期时间建议设置为5-15分钟,平衡安全性与刷新频率。Refresh Token过期时间根据业务场景设定,移动端建议24小时,Web端建议8小时,金融类场景建议缩短至1小时。
过期策略的典型配置示例(OIDC Provider端):
// OIDC Provider令牌过期配置示例
{
"access_token_lifetime": 900, // 15分钟
"refresh_token_lifetime": 86400, // 24小时
"refresh_token_reuse_interval": 60, // 令牌轮换防重放窗口(秒)
"absolute_refresh_token_lifetime": 2592000 // 绝对过期时间(30天)
}
2.2 令牌轮换机制
令牌轮换(Token Rotation)是提升Refresh Token安全性的关键机制。每次使用Refresh Token获取新Access Token时,服务端同时返回一个新的Refresh Token,并使旧Refresh Token失效。这有效限制了令牌泄露后的攻击窗口。
核心原则:Refresh Token是一次性使用的。每次刷新操作后,旧的Refresh Token立即失效,客户端必须使用新返回的Refresh Token进行下一次刷新。
令牌轮换的标准流程:
- 初始认证:用户登录后,服务端返回Access Token + Refresh Token(RT₁)。
- 首次刷新:Access Token过期,客户端使用RT₁请求刷新,服务端验证RT₁有效后,返回新Access Token + 新Refresh Token(RT₂),同时使RT₁失效。
- 二次刷新:客户端使用RT₂请求刷新,服务端验证RT₂有效后,返回新Access Token + 新Refresh Token(RT₃),同时使RT₂失效。
- 异常检测:若攻击者窃取了RT₁并尝试使用,但客户端已使用RT₁完成刷新,服务端检测到RT₁已被使用,判定为重放攻击,立即吊销该用户所有令牌。
注意:令牌轮换机制要求客户端必须正确处理每次刷新后返回的新Refresh Token。若客户端在刷新过程中发生网络中断,可能导致新旧Refresh Token同时失效,用户被迫重新登录。建议在客户端实现刷新操作的幂等性重试逻辑。
2.3 令牌吊销
令牌吊销是令牌生命周期管理的最后一道防线。当用户主动登出、账号异常、设备丢失或安全事件发生时,系统需要立即使指定令牌或用户所有令牌失效。
OIDC规范定义了令牌吊销端点(RFC 7009),支持按令牌类型进行吊销操作:
// 令牌吊销请求示例
POST /revoke HTTP/1.1
Host: auth.example.com
Content-Type: application/x-www-form-urlencoded
token=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
&token_type_hint=refresh_token
&client_id=my-client-id
&client_secret=my-client-secret
令牌吊销的三种典型场景:
| 吊销场景 | 触发条件 | 吊销范围 | 实现方式 |
|---|---|---|---|
| 用户主动登出 | 用户点击"退出登录" | 当前会话的Refresh Token | 前端调用吊销端点 + 清除本地令牌 |
| 账号安全事件 | 密码修改、账号被盗、设备丢失 | 该用户所有Refresh Token | 服务端批量吊销 + 推送令牌黑名单 |
| 令牌轮换异常 | 检测到Refresh Token重放 | 该用户所有令牌 | 自动吊销 + 安全告警通知 |
2.4 生命周期管理最佳实践
综合过期策略、轮换机制与吊销手段,以下是令牌生命周期管理的工程最佳实践:
- 分层过期策略:Access Token短生命周期(5-15分钟),Refresh Token长生命周期(数小时至数天),设置绝对过期时间防止无限续期。
- 强制令牌轮换:每次刷新操作必须返回新Refresh Token,旧Refresh Token立即失效,轮换窗口内禁止重复使用。
- 服务端状态管理:Refresh Token必须在服务端维护状态(如Redis),支持快速查询、吊销和黑名单检查。
- 吊销传播:令牌吊销事件需通过消息队列或事件总线传播到所有服务节点,确保吊销的最终一致性。
- 审计日志:记录令牌的颁发、刷新、吊销全生命周期事件,便于安全审计和故障排查。
关键指标:令牌生命周期管理的三个核心SLA指标——令牌刷新成功率(目标>99.9%)、令牌吊销延迟(目标<1秒)、令牌泄露检测响应时间(目标<5秒)。