jwt需要存redis吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jwt需要存redis吗相关的知识,希望对你有一定的参考价值。

参考技术A

JWT是JSON WEB TOKEN的缩写,它是基于 RFC 7519 标准定义的一种可以安全传输的的JSON对象,由于使用了数字签名,所以是可信任和安全的。

JWT的组成

    JWT token的格式:header.payload.signature

    header中用于存放签名的生成算法

    "alg": "HS512"Copy to clipboardErrorCopied

    payload中用于存放用户名、token的生成时间和过期时间

    "sub":"admin","created":1489079981393,"exp":1489684781Copy to clipboardErrorCopied

    signature为以header和payload生成的签名,一旦header和payload被篡改,验证将失败

    //secret为加密算法的密钥 String signature = HMACSHA512(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)

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

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

【讨论】:

以上是关于jwt需要存redis吗的主要内容,如果未能解决你的问题,请参考以下文章

JWT 吊销信息在哪里存储,mongoDB 还是 Redis?

drf中的jwt使用与手动签发token校验用户

SpringSecurity注解鉴权(整合springboot,jwt,redis)

如果使用 JWT,我需要 CSRF 吗?

我需要为每个用户单独管理 jwt 密钥吗?

如果我使用 Ejabberd 身份验证和 JWT,我不需要注册用户吗?