JWT 刷新和访问令牌
JWT refresh and access tokens
我在我的项目中使用了 jwt 令牌。用于验证受保护资源的长期刷新令牌和短期访问令牌。刷新令牌保存在 http-only cookie 中,以降低 xss 攻击的风险。访问令牌将仅存储在我前端的 vuex 存储中。如果用户更改密码,我应该更新我的刷新令牌吗?我不在我的数据库中存储刷新令牌,因为据我了解,jwts 的主要目的是我可以使用密码学来验证我传入的刷新令牌,而不必在我的数据库中查找它(然后我不必须使用 jwts)。
但是如何使已发送的刷新令牌无效,例如在其他设备或浏览器上?如果我不使用数据库来存储刷新令牌,则只要过期时间,令牌就有效。我很感激任何建议。
由于您没有将令牌存储在数据库中,因此您无法远程使它们失效。但是有一些常见的做法可以解决这个问题。
NOTE: These are not standards, Just a practice used by major
companies.
1.将令牌存储在缓存数据库中(不在主数据库中)
将 JWT tokens
存储在缓存数据库中,例如 Redis
或 Memcached
将使您能够更快地检索和验证令牌。要使令牌无效,您只需将其从缓存中删除即可。
2。使用短期访问和刷新令牌
很多安全提交中都提到了这一点。专家说要为访问和刷新令牌设置一个非常短的生命周期(以分钟为单位)。此外,每次获得新的访问令牌时都要交换刷新令牌。这个更新过程可以在后台进行(可能使用 worker)。所以你不需要使令牌失效,它会在几分钟后自动失效。
- 将您的刷新令牌存储在数据库中,具有足够的上下文来创建新的 JWT 令牌(也是到期日期,允许 IPs/regions/browsers ...等)该数据库将仅由您的身份验证服务使用,并且仅在管理身份验证(登录、注销、刷新访问令牌)时。
- 将 JWT 存储在数据库中会给您的微服务带来单点故障(假设您使用的是这种架构),如果您将 JWT 存储在某个地方,那么只使用会话 ID 和数据会是一个更简单的实现。
- 给每个 JWT 令牌一个 ID(它已经在默认声明中),然后 link 该 ID 给刷新令牌
- 当您使刷新令牌无效时,向您的所有服务广播一个事件,告诉它们任何带有 token.JwtId 的 JWT 都是无效的。这会使所有服务上由该令牌创建的所有 JWT 无效(您也可以通过令牌上下文使无效,例如:用户 ID 使在 X 之前创建的用户的所有令牌无效)
我在我的项目中使用了 jwt 令牌。用于验证受保护资源的长期刷新令牌和短期访问令牌。刷新令牌保存在 http-only cookie 中,以降低 xss 攻击的风险。访问令牌将仅存储在我前端的 vuex 存储中。如果用户更改密码,我应该更新我的刷新令牌吗?我不在我的数据库中存储刷新令牌,因为据我了解,jwts 的主要目的是我可以使用密码学来验证我传入的刷新令牌,而不必在我的数据库中查找它(然后我不必须使用 jwts)。
但是如何使已发送的刷新令牌无效,例如在其他设备或浏览器上?如果我不使用数据库来存储刷新令牌,则只要过期时间,令牌就有效。我很感激任何建议。
由于您没有将令牌存储在数据库中,因此您无法远程使它们失效。但是有一些常见的做法可以解决这个问题。
NOTE: These are not standards, Just a practice used by major companies.
1.将令牌存储在缓存数据库中(不在主数据库中)
将 JWT tokens
存储在缓存数据库中,例如 Redis
或 Memcached
将使您能够更快地检索和验证令牌。要使令牌无效,您只需将其从缓存中删除即可。
2。使用短期访问和刷新令牌
很多安全提交中都提到了这一点。专家说要为访问和刷新令牌设置一个非常短的生命周期(以分钟为单位)。此外,每次获得新的访问令牌时都要交换刷新令牌。这个更新过程可以在后台进行(可能使用 worker)。所以你不需要使令牌失效,它会在几分钟后自动失效。
- 将您的刷新令牌存储在数据库中,具有足够的上下文来创建新的 JWT 令牌(也是到期日期,允许 IPs/regions/browsers ...等)该数据库将仅由您的身份验证服务使用,并且仅在管理身份验证(登录、注销、刷新访问令牌)时。
- 将 JWT 存储在数据库中会给您的微服务带来单点故障(假设您使用的是这种架构),如果您将 JWT 存储在某个地方,那么只使用会话 ID 和数据会是一个更简单的实现。
- 给每个 JWT 令牌一个 ID(它已经在默认声明中),然后 link 该 ID 给刷新令牌
- 当您使刷新令牌无效时,向您的所有服务广播一个事件,告诉它们任何带有 token.JwtId 的 JWT 都是无效的。这会使所有服务上由该令牌创建的所有 JWT 无效(您也可以通过令牌上下文使无效,例如:用户 ID 使在 X 之前创建的用户的所有令牌无效)