在 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 令牌的标准做法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何在spring oauth使用redis令牌存储中获取jwt令牌的解码详细信息