所以这是我的场景,我生成了一个jwt令牌并将该令牌存储在带有1小时TTL的redis中。 现在我看到大多数教程都使用jwt.verify来验证令牌..
我知道他们正在验证令牌是否真实
为什么我需要使用jwt.verify ..为什么我不能使用redis.exists来检查令牌是否真实..
大多数人都说,我们可以使用jwt主要功能,无需使用db来检查用户和到期日期。
但在我的场景中,我无法将所有内容存储在令牌中。所以我使用redis来存储带有会话信息的令牌。
问题是 所以我不应该在这种情况下使用jwt。 2.我可以跳过jwt.verify吗?
我是节点新手..
答案 0 :(得分:2)
JWT可以帮助您快速检索有关调用者的信息,而无需访问数据库(redis也是一个数据库)。 使用客户端应用程序/外部服务使用的JWT时,您必须始终验证它们,以确保您是生成它们并且未被篡改的那些。
存储在JWT中的常见信息包括用户名,真实姓名,组等。在您的方案中,您可以使用JWT存储包含所需信息的redis密钥。可能是你总是会点击redis来获取你想要的信息,所以JWT不会为你的情况增加很多价值,但可能是你可以使用JWT编写更聪明的代码在某些情况下redis例如。如果用户有这个权利,或者我们是否在redis中存储了关于此用户的内容(从JWT令牌中丢失了redis密钥)
你是唯一可以评估你的场景和JWT的用处的人,但不要急于解雇它们,因为它们提供了开箱即用的良好性能/安全性改进。
答案 1 :(得分:1)
假设Redis服务器是安全的并且您自己生成JWT(这里似乎是这种情况),您不需要验证它。创建之后,将其存储在缓存中并在以后检索它,您不需要再次验证它,因为您知道它在Redis缓存中无法被篡改。
只有在收到第三方生成的JWT时,您才需要验证它们是否真实。
另一方面,如果您将JWT分发给您无法控制的第三方应用程序和客户端,那么您必须确保一旦您将它们重播给您,它们就会通过验证签名而被篡改(或者与存储在Redis缓存中的二进制比较进行二进制比较)和(在使用时)检查exp
声明中的到期时间戳。
答案 2 :(得分:0)
如果没有任何验证,第三方可能会向您的API发送请求,并且在大多数情况下,请求可能会变成中间人攻击。保持服务器上生成的所有令牌的记录,然后对每个传入请求进行身份验证,这是一种很好的安全措施。