我在我的项目中使用jwt令牌。用于身份验证的长期刷新令牌和用于受保护资源的短期访问令牌。刷新令牌保存在仅http的cookie中,以减少xss攻击的风险。访问令牌将只存储在我的前端的虚拟存储中。如果用户更改了密码,我应该更新我的刷新令牌吗?我没有在我的数据库中存储刷新令牌,因为正如我所理解的那样,jwts的主要目的是我可以使用加密技术来验证传入的刷新令牌,而不必在我的数据库中查找它(那么我根本不必使用jwts)。
但是我如何使已经发送的刷新令牌无效,例如在其他设备或浏览器上?如果我不使用数据库来存储刷新令牌,那么只要过期时间足够,令牌就会有效。谢谢你的建议。
由于不在数据库中存储令牌,因此无法远程使其无效。但是有一些常见的做法可以克服这个问题。
注意:这些不是标准,只是专业的惯例公司。
1。在缓存数据库中存储令牌(不在主数据库中)
将JWT tokens
存储在缓存数据库中,例如Redis
或Memcached
,将允许您更快地检索和验证令牌。要使令牌无效,您只需要从缓存中删除它。
2。使用短期访问和刷新令牌
这在许多安全性提交中都有提到。专家说,为访问和刷新令牌设置一个非常短的生命周期(以分钟为单位)。此外,每次获得新的访问令牌时都要交换刷新令牌。这个更新过程可以在后台进行(可能使用worker)。所以你不需要使令牌失效,它会在几分钟后自动失效。
建议你看这个: https://www.youtube.com/watch?v=rCkDE2me_qk
- 将您的刷新令牌存储在数据库中,具有足够的上下文来创建新的JWT令牌(也包括到期日期,允许的ip/地区/浏览器…等)此数据库将仅由您的Auth服务使用,并且仅在管理Auth(登录,注销,刷新访问令牌)时使用。
- 在数据库中存储JWT会给你的微服务带来单点故障(假设你正在使用这种架构),如果你将JWT存储在某个地方,那么只使用会话id和数据将是一个更简单的实现。
- 给每个JWT令牌一个ID(它已经在默认声明中),并将该ID链接到刷新令牌
- 当刷新令牌无效时,向所有服务广播一个事件,告诉它们任何带有令牌的JWT。JwtId无效。这会使该令牌在所有服务上创建的所有jwt无效(您也可以通过令牌上下文使其无效,例如:user id使在X之前创建的用户的所有令牌无效)