在redis中存储jwt令牌的标准做法是什么?

9cbw7uwe  于 2021-06-09  发布在  Redis
关注(0)|答案(2)|浏览(488)

我应该在redis中将jwt令牌存储为密钥,将相应的用户信息存储为值,以便在有效的情况下通过令牌获取信息,还是应该在jwt本身中对用户数据进行编码,并仅将redis用于存储有效令牌?

ivqmmu1c

ivqmmu1c1#

jwt的全部思想是不需要每次调用都访问db(或redis),用户访问数据将被编码在令牌中。
也就是说,jwt的最大缺点是不能主动取消或取消验证令牌,唯一的方法是在每个用户调用上检查令牌的黑名单,这有点错过了不在每个调用上访问db的目的。
如果您需要一种主动取消令牌的方法,一个很好的折衷方法是使用一种快速验证方法,例如可以基于bloomfilter,为此您可能需要使用redisbloom。

q0qdq0h2

q0qdq0h22#

既然@guy korland已经介绍了jwts的基本思想,我将对您提到的两种方法进行评论。
我是否应该将jwt令牌作为密钥存储,并将相应的用户信息作为值存储在redis中,以便在有效的情况下通过令牌获取信息
如果您试图从redis中查找的只是用户的信息,那么这种方法就没有多大帮助。这是因为用户信息可以直接存储为 claimspayload 从而避免了redis对lookup的调用。如果 claim 包含敏感信息,可以始终加密jwt令牌,以确保非预期收件人不会访问它。
也就是说,根本不必命中缓存的缺点是不能使令牌失效/刷新。一般来说,建议您不要使用长寿命令牌,因为这是一个安全漏洞。
我应该在jwt本身中对用户数据进行编码,并且只使用redis来存储有效的令牌吗
这比前面的选项更好,如果用户的信息被编码为jwt令牌的一部分,那么它就可以工作。此外,您还可以将令牌的“context”存储为redis中的值(key是jwt本身)。这里的“上下文”是指最后一次使用令牌的时间(lastaccesstime)、到期时间间隔等。使用此“上下文”,您可以确定会话是否处于活动/非活动状态,以及是否使令牌无效并向客户端提供新的令牌。

相关问题