JWT退出登录如何实现服务端彻底失效?

1 人参与

用户点击“退出登录”后,即使浏览器删除了 JWT,只要服务端仍接受旧凭证,这次退出就没有使其失效。原因在于:JWT 的签名验证只能证明凭证未被篡改,不能证明持有人仍处于登录状态。要实现服务端即时失效,鉴权过程就必须增加撤销状态校验。

一种做法是为访问凭证设置 JTI。服务端处理退出请求时,将该凭证的 JTI 记入撤销名单,保留至凭证原定过期;此后每次受保护请求,在验证签名等条件后,还要查询撤销名单,命中即拒绝访问。只在退出接口写入名单、却没有让网关或鉴权中间件逐次检查,无法达到撤销效果。

JWT退出登录如何实现服务端彻底失效?

另一种做法是缩短 Access Token 的有效期,并在退出时吊销服务端保存的 Refresh Token。这能阻断后续换发,却不能让已签发的 Access Token 立即失效。如果业务要求点击退出后旧凭证马上不可用,就需要同时撤销当前 Access Token,而不能仅依赖它自行过期。

还应先明确退出范围:“退出当前设备”只应撤销当前设备的凭证;“退出所有设备”则需要使该账号各设备的相关凭证失效。验收时,不要只看页面是否跳回登录页。应在退出后,用事先保存的旧凭证请求只读的受保护资源,并检查服务端是否拒绝访问;多端场景下,还要分别验证另一设备的凭证是否符合预定的退出范围。

参与讨论

1 条评论
  • 夜之涟漪

    每次请求查黑名单,并发高了Redis压力大吗?

    回复