jwt需要存redis吗
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jwt需要存redis吗相关的知识,希望对你有一定的参考价值。
参考技术AJWT是JSON WEB TOKEN的缩写,它是基于 RFC 7519 标准定义的一种可以安全传输的的JSON对象,由于使用了数字签名,所以是可信任和安全的。
JWT的组成
JWT token的格式:header.payload.signature
header中用于存放签名的生成算法
"alg": "HS512"Copy to clipboardErrorCopiedpayload中用于存放用户名、token的生成时间和过期时间
"sub":"admin","created":1489079981393,"exp":1489684781Copy to clipboardErrorCopiedsignature为以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?