1. 为什么需要Token吊销机制?
在分布式系统中,JSON Web Token(JWT)因其无状态特性广受欢迎,但这也带来了一个致命缺陷——一旦签发就无法主动废止。上周我们生产环境就遭遇了这样的危机:一个已离职员工利用未过期的访问令牌持续调用敏感API,直到三天后令牌自然过期才停止。这暴露出传统JWT方案在安全管控上的重大短板。
关键事实:标准的JWT实现中,服务端仅验证签名和有效期,无法感知令牌是否被主动撤销。这意味着一旦令牌泄露,在有效期内都将成为系统的"万能钥匙"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 黑名单方案的架构设计
2.1 核心组件交互流程
我们设计的WeClaw Token吊销系统包含三个关键组件:
- 令牌验证服务:拦截所有API请求,执行JWT标准验证后查询黑名单
- 黑名单存储:采用Redis集群存储被吊销令牌ID(jti)和过期时间
- 管理接口:提供吊销令牌的RESTful API,供管理员调用
mermaid复制graph TD
A[客户端请求] --> B{携带JWT?}
B -->|是| C[验证签名/有效期]
C --> D{在黑名单?}
D -->|否| E[允许访问]
D -->|是| F[返回401]
B -->|否| G[返回403]
2.2 性能优化关键点
为实现50ms内的响应延迟,我们做了以下优化:
- 内存存储:选择Redis而非数据库,读取延迟<2ms
- 短过期时间:设置jti记录自动过期(略长于JWT有效期)
- 批量预加载:服务启动时预热高频访问令牌的黑名单状态
3. 具体实现步骤
3.1 JWT签发时注入唯一标识
在生成令牌时强制包含jti字段,作为吊销时的定位依据:
java复制public String generateToken(User user) {
return Jwts.builder()
.setId(UUID.randomUUID().toString()) // 关键jti字段
.setSubject(user.getId())
.setIssuedAt(new Date
