在 Redis 中存储 JWT 令牌的标准做法是啥?

Posted

技术标签:

【中文标题】在 Redis 中存储 JWT 令牌的标准做法是啥?【英文标题】:What is the standard practice to store JWT tokens in Redis?在 Redis 中存储 JWT 令牌的标准做法是什么? 【发布时间】:2020-08-09 17:38:24 【问题描述】:

我是否应该将 JWT 令牌作为键存储并将相应的用户信息作为值存储在 Redis 中,以便我可以通过令牌获取信息(如果有效) 要么 我应该在 JWT 本身中对用户数据进行编码并仅使用 Redis 来存储有效令牌吗?

【问题讨论】:

【参考方案1】:

JWT 的所有想法是不需要在每次调用时访问 DB(或 Redis),并且用户访问数据将被编码在令牌中。

话说回来,JWT 最大的缺点就是你不能主动取消或取消验证令牌,唯一的办法就是在每次用户调用时检查令牌的黑名单,这有点错过了不是在每次通话时都访问数据库。

如果您需要一种主动取消令牌的方法,一个很好的折衷方案是使用快速验证方法,例如可以基于 Bloom Filter,为此您可能需要使用 RedisBloom。

【讨论】:

【参考方案2】:

由于@Guy Korland 已经介绍了 JWT 的基本概念,我将对您提到的两种方法进行评论。

我是否应该将 JWT 令牌存储为密钥并将相应的用户信息存储为 Redis 中的值,以便我可以通过令牌获取信息(如果有效)

如果您试图从 Redis 中查找的只是用户信息,那么这种方法不是很有帮助。这是因为用户信息可以直接存储为claims在JWT的payload部分,从而避免了从Redis调用lookup。如果claim 包含敏感信息,则始终可以对 JWT 令牌进行加密,以确保它不会被非预期的收件人访问。

话虽如此,根本不必访问缓存的缺点是您无法使令牌无效/刷新。一般来说,建议您不要使用长期存在的令牌,因为它是一个安全漏洞。

我是否应该在 JWT 本身中对用户数据进行编码并仅将 Redis 用于 存储有效令牌

这比前一个选项更好,如果用户的信息被编码为 JWT 令牌的一部分,它就可以工作。此外,您可以将令牌的“上下文”存储为 Redis 中的值(键是 JWT 本身)。此处的“上下文”是指上次使用令牌的时间(lastAccessTime)、到期间隔等。使用此“上下文”,您可以确定会话是否处于活动/非活动状态以及是否使令牌无效并提供新令牌给客户。

【讨论】:

以上是关于在 Redis 中存储 JWT 令牌的标准做法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为 WebSocket 连接更新令牌的最佳做法是啥

如何在spring oauth使用redis令牌存储中获取jwt令牌的解码详细信息

我应该/如何将我的 JWT 令牌存储在 redis 中以便我可以看到当前的用户会话?

在哪里存储 JWT 令牌?

我应该在哪里存储 JWT 令牌?

存储JWT令牌的位置?