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

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

【问题讨论】:

    标签: express session redis jwt


    【解决方案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)、到期间隔等。使用此“上下文”,您可以确定会话是否处于活动/非活动状态以及是否使令牌无效并提供新令牌给客户。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-28
        • 1970-01-01
        • 2017-12-07
        • 2022-08-10
        • 1970-01-01
        • 2019-02-01
        • 2012-07-27
        • 2016-02-18
        相关资源
        最近更新 更多