2. 令牌生命周期管理

在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进行下一次刷新。

令牌轮换的标准流程:

  1. 初始认证:用户登录后,服务端返回Access Token + Refresh Token(RT₁)。
  2. 首次刷新:Access Token过期,客户端使用RT₁请求刷新,服务端验证RT₁有效后,返回新Access Token + 新Refresh Token(RT₂),同时使RT₁失效。
  3. 二次刷新:客户端使用RT₂请求刷新,服务端验证RT₂有效后,返回新Access Token + 新Refresh Token(RT₃),同时使RT₂失效。
  4. 异常检测:若攻击者窃取了RT₁并尝试使用,但客户端已使用RT₁完成刷新,服务端检测到RT₁已被使用,判定为重放攻击,立即吊销该用户所有令牌。
令牌轮换机制流程 客户端 授权服务器 ① 初始认证 登录请求 AT + RT₁ ② 首次刷新 使用RT₁刷新 新AT + RT₂ ③ 二次刷新 使用RT₂刷新 新AT + 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重放 该用户所有令牌 自动吊销 + 安全告警通知
令牌吊销架构 吊销触发源 吊销端点 令牌存储 吊销请求 标记失效 吊销触发源 • 用户主动登出 • 密码修改事件 • 账号被盗标记 • 设备丢失报告 • 令牌重放检测 吊销策略 • 单令牌吊销 • 用户级批量吊销 • 客户端级吊销 • 令牌族吊销 • 全局紧急吊销 存储实现 • Redis黑名单 • 数据库状态标记 • 分布式缓存 • 令牌撤销列表 • 事件溯源日志

2.4 生命周期管理最佳实践

综合过期策略、轮换机制与吊销手段,以下是令牌生命周期管理的工程最佳实践:

  • 分层过期策略:Access Token短生命周期(5-15分钟),Refresh Token长生命周期(数小时至数天),设置绝对过期时间防止无限续期。
  • 强制令牌轮换:每次刷新操作必须返回新Refresh Token,旧Refresh Token立即失效,轮换窗口内禁止重复使用。
  • 服务端状态管理:Refresh Token必须在服务端维护状态(如Redis),支持快速查询、吊销和黑名单检查。
  • 吊销传播:令牌吊销事件需通过消息队列或事件总线传播到所有服务节点,确保吊销的最终一致性。
  • 审计日志:记录令牌的颁发、刷新、吊销全生命周期事件,便于安全审计和故障排查。
关键指标:令牌生命周期管理的三个核心SLA指标——令牌刷新成功率(目标>99.9%)、令牌吊销延迟(目标<1秒)、令牌泄露检测响应时间(目标<5秒)。