刷新后如何使以前的 JWT 令牌无效

Posted

技术标签:

【中文标题】刷新后如何使以前的 JWT 令牌无效【英文标题】:How to invalidate previous JWT token after refresh 【发布时间】:2017-05-19 23:52:44 【问题描述】:

在我们的应用程序中,每次用户发送请求时,都会在 cookie 中返回新的 JWT 令牌,即使之前的生命周期仍然很长。如果用户在短时间内发出多个请求,则每个都存在多个有效令牌几乎整个生命周期。浏览器当然是用最新的,但还是有人用旧的来冒充用户。

有没有办法在分派新令牌时使前一个令牌无效,或者只有在最后一个令牌的生命周期不多时才分派新令牌的唯一选择?

【问题讨论】:

【参考方案1】:

“无效”令牌的唯一方法是有状态地跟踪它们。

这通常意味着执行一些操作,例如保留有效和无效令牌的键/值缓存,并针对每个请求的这些列表检查传入的请求令牌。

这样做的缺点是您失去了 JWT 的许多“无状态”优势(因为您仍在检查集中式存储的令牌有效性),但好处是您可以更“安全”通过立即撤销您不再需要服务的令牌。

一种解决方法是让您的访问令牌寿命极短(5 分钟左右),以尽量减少任何滥用。

【讨论】:

如何将客户端IP嵌入到令牌中,并将即将到来的请求IP与验证令牌的IP进行比较?这将防止恶意用户使用被盗令牌获取敏感数据(尽管他仍然可以通过欺骗他的 IP 进行 POST,如果他也可以获得 CSRF 令牌) 你可以试试这个,但 IPS 不是唯一标识符。特别是在公共网络上(手机、办公室 wifi 等)。如果您正在构建安全敏感的应用程序,我不会这样做。 很公平,NAT 也可能有问题 Spring 带有一个 JWT-token-store,可以通过配置轻松使用。它允许使刷新令牌无效。因此,对访问令牌使用足够短的有效时间不会完全失去无状态性。无论如何,您都必须检查您的身份验证服务以刷新访问令牌。

以上是关于刷新后如何使以前的 JWT 令牌无效的主要内容,如果未能解决你的问题,请参考以下文章

如何在某人更改密码后使用户的 JWT 令牌无效

Laravel JWT 令牌在身份验证 JWT 方法中刷新后无效

如何使 JWT 令牌 PHP 无效

使用刷新令牌时 Spring Boot JWT 令牌无效签名

刷新令牌如何比长寿命的 JWT 更安全?

AzureAD JWT 令牌受众声明前缀使 JWT 令牌无效