JWT 无状态失效难题:密码修改后旧 Token 仍有效?Redis 黑名单+版本号校验
公司的一个用户改了密码,但改了之后发现手机上的 App 还是登录状态,能正常操作。查了半天发现是 JWT 的问题——旧 Token 还没过期,拿着旧密码签发的 Token 照样能通过验证。用户以为改密码后旧设备上的登录会失效,实际上 JWT 根本不关心密码是否被改过。 这就是 JWT 无状态设计带来的副作用。服务端不存任何 Token 状态,所以也没法"让它失效"。今天聊聊怎么在保持 JWT 无状态优势的前提下,解决"主动失效"的需求。 问题:为什么旧 Token 还能用 JWT 的验证逻辑只看三样东西: Token 的签名是否正确(证明它没被篡改) Token 是否过期(exp 字段) Token 的签发者是否正确(iss 字段) 它不看"这个用户的密码有没有被改过"。因为 JWT 的哲学是"服务端不记状态"——Token 自包含所有信息,验证时不需要查数据库。 这意味着一旦 Token 签发出去,在它自然过期之前,没有任何办法让它失效——除非你再往里加一个"失效机制"。 方案一:Redis 黑名单(最直观) 把需要失效的 Token 放进 Redis 黑名单里,验证时先查....