JWT令牌泄露,如何让其失效?
因为 JWT 是无状态的 ,天生一旦签发出去,除非过期时间到了,否则服务器是无法单方面让它失效 的。
所以,所谓"旧的 JWT 令牌失效",一般要靠一些额外机制。
1. JWT 本身的问题
- 无状态:JWT 验证只依赖签名和过期时间,服务器不保存会话。
- 后果:一旦签发,JWT 在有效期内都能被用来访问,除非服务器主动检查并拒绝它。
2. 让旧 JWT 失效的常见做法
方法 1:缩短 JWT 的有效期 + Refresh Token
-
设计方式:
- Access Token(JWT):有效期很短(几分钟到几十分钟)。
- Refresh Token(通常存数据库):有效期较长(几天/几周),用于申请新 JWT。
-
好处:
- 如果 JWT 泄露,攻击者最多能用短时间。
- 服务端只要能废掉 Refresh Token(比如检测异常行为、用户注销),旧 JWT 很快就自然失效。
方法 2:黑名单 / 撤销列表
- 在服务器维护一个 黑名单 ,存放已撤销的 JWT(通常存
jti
字段或整个 token)。 - 验证请求时,除了校验签名,还要查询黑名单。
- 缺点:失去了 JWT 的"纯无状态"优势,要额外存储和查询。
方法 3:令牌版本号(Token Versioning)
-
在用户数据库里存一个
token_version
字段。 -
签发 JWT 时,把
token_version
写进 payload。 -
验证时对比数据库中的
token_version
:- 如果用户被强制登出或令牌被刷新,就把数据库的
token_version
+1。 - 旧 JWT 的
token_version
就和数据库不一致,立刻失效。
- 如果用户被强制登出或令牌被刷新,就把数据库的
-
优点:不需要存储所有旧 token,只需要一个版本号。
方法 4:重置密钥
- 如果极端情况下需要让所有现有 JWT 失效,可以直接更换签名密钥(secret / private key)。
- 所有旧 token 因签名不匹配而失效。
- 缺点:会影响所有用户。
3. 总结
旧 JWT 不会自己失效,必须靠额外机制。常见策略:
- 短期 Access Token + 长期 Refresh Token(最常用)。
- 黑名单(适合高安全要求系统)。
- 版本号机制(高效且常见)。