JWT 刷新和访问令牌

Posted

技术标签:

【中文标题】JWT 刷新和访问令牌【英文标题】:JWT refresh and access tokens 【发布时间】:2021-12-14 18:35:02 【问题描述】:

我在我的项目中使用 jwt 令牌。用于对受保护资源进行身份验证的长期刷新令牌和短期访问令牌。刷新令牌保存在仅限 http 的 cookie 中,以降低 xss 攻击的风险。访问令牌将仅存储在我前端的 vuex 存储中。如果用户更改密码,我应该更新我的刷新令牌吗?我不在我的数据库中存储刷新令牌,因为据我所知,jwts 的主要目的是我可以使用密码学来验证我传入的刷新令牌,而不必在我的数据库中查找它(然后我不需要必须使用jwts)。

但是如何使已发送的刷新令牌无效,例如在其他设备或浏览器上?如果我不使用数据库来存储刷新令牌,只要过期时间是,令牌就会有效。我很感激任何建议。

【问题讨论】:

您只能将列入黑名单的刷新令牌存储在 Redis 等数据库中,因此您可以查找那些不应更新的令牌,并在其访问令牌过期并要求更新时使它们失效。理想情况下,您应该在每次更新过期的访问令牌时发出一对新的访问令牌和刷新令牌。只需确保为访问令牌设置较短的到期时间。根据您的用例,2 到 15 分钟之间的任何时间都足够了。 【参考方案1】: 将您的刷新令牌存储在数据库中,并具有足够的上下文来创建新的 JWT 令牌(还有到期日期、允许的 IP/区域/浏览器 ...等)此数据库将仅由您的 Auth 服务使用,并且仅在以下情况下使用管理身份验证(登录、注销、刷新访问令牌)。 将 JWT 存储在数据库中会为您的微服务引入单点故障(假设您使用的是此架构),如果您将 JWT 存储在某处,那么仅使用会话 ID 和数据将是一种更简单的实现方式。 为每个 JWT 令牌提供一个 ID(它已在默认声明中),并将该 ID 链接到刷新令牌 当您使刷新令牌无效时,向您的所有服务广播一个事件,告诉他们任何带有 token.JwtId 的 JWT 都是无效的。这会使该令牌在所有服务上创建的所有 JWT 无效(您也可以通过令牌上下文使之无效,例如:用户 ID 使在 X 之前创建的用户的所有令牌无效)

【讨论】:

【参考方案2】:

由于您没有将令牌存储在数据库中,因此您无法远程使它们无效。但是有一些常见的做法可以解决这个问题。

注意:这些不是标准,只是主要使用的一种做法 公司。

1.将令牌存储在缓存数据库中(不在主数据库中)

JWT tokens 存储在缓存数据库中,例如RedisMemcached,可以让您更快地检索和验证令牌。要使令牌无效,您只需将其从缓存中删除即可。

2。使用短期访问和刷新令牌

很多安全提交中都提到了这一点。专家说要为访问和刷新令牌设置一个非常短的生命周期(以分钟为单位)。此外,每次获得新的访问令牌时都要交换刷新令牌。这个更新过程可以在后台发生(可能使用工人)。所以你不需要使令牌失效,它会在几分钟后自动失效。

推荐你看这个:https://www.youtube.com/watch?v=rCkDE2me_qk

【讨论】:

以上是关于JWT 刷新和访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

JWT 刷新和访问令牌

JWT 访问令牌和刷新令牌安全性

JWT 是不是总是需要访问令牌和刷新令牌?

使用刷新令牌和访问令牌如何比仅使用 1 个 JWT 更“安全”?

如何基于使用 Oauth2 协议的身份验证改进 JWT 访问令牌和刷新令牌?

在 Django REST 框架中使用 JWT 时,刷新令牌和访问令牌存储在哪里?