一、核心结论
JWT 无状态无法主动吊销 ,只能短时效;有状态 Token 可随时吊销,是企业级常用替代方案。
二、主流 Access Token 方案(非 JWT)
1. 数据库/缓存存储式 Token(最主流)
原理
- 下发随机字符串(UUID、雪花ID、随机串)作为 AccessToken
- 服务端存入 Redis/MySQL:
token -> 用户ID、权限、过期时间、设备信息 - 校验:请求带 token,服务端查缓存判断是否有效、是否拉黑
优点
- 支持主动吊销(删 Redis 键即可)
- 时效灵活,可长可短
- 权限可动态变更
缺点 - 每次请求需查缓存,有网络/IO开销
适用:后台管理、APP、小程序、电商、企业系统
2. OAuth2 标准令牌(原生非JWT)
标准 OAuth2 原生令牌就是随机字符串,不是 JWT:
- AccessToken:随机短串(缓存存状态)
- RefreshToken:长时效随机串
- 主流授权平台早期均为此方案,后来才兼容 JWT
3. Session 令牌(传统服务端会话)
原理
- Cookie 下发
SESSION_ID - 服务端 Session 池存储会话信息
优点 :最简、天然可注销
缺点:跨域、移动端适配差,多用于传统 Web 站点
4. PASETO(安全替代 JWT)
定位 :JWT 安全升级版,无状态
- 解决 JWT 签名漏洞、载荷明文风险
- 依旧无状态不能主动吊销,和 JWT 通病一致
- 只能缩短有效期缓解,不能根治吊销问题
5. Macaroon 令牌(分布式/权限细粒度)
去中心化可委派令牌,支持逐层授权,多用于云服务、分布式系统,小众但专业。
6. 加密二进制令牌(自研二进制Token)
二进制序列化+对称加密,体积更小、防篡改,私有业务自研常用。
三、解决 JWT 无法吊销的工业级通用方案
即使还用 JWT,搭配这套架构即可实现吊销:
- AccessToken(JWT) 极短有效期:5~15分钟
- RefreshToken 用【有状态随机串】:存入Redis,支持注销
- 登出/踢人:直接拉黑 RefreshToken,用户无法续期
- 维护黑名单 Redis:临时拉黑未过期 JWT(短时兜底)
四、选型对比
| 方案 | 无状态 | 可吊销 | 性能 | 适用场景 |
|---|---|---|---|---|
| 随机串+Redis | ❌ | ✅ | 中等 | 绝大多数业务首选 |
| JWT | ✅ | ❌ | 高 | 对外开放接口、高并发无注销场景 |
| PASETO | ✅ | ❌ | 高 | 追求安全无状态 |
| SessionId | ❌ | ✅ | 低 | 传统网页 |
五、最佳实践推荐
- 对内业务系统 / APP / 小程序
优先:随机字符串 AccessToken + Redis 存储,自由吊销、可控性最强 - 对外开放 API、高并发网关
短时效 JWT + 有状态 RefreshToken 组合架构 - 严禁长时效 JWT,最长不超过30分钟