一尘不染

我应该将JWT令牌存储在Redis中吗?

redis

我正在使用ExpressJS,Mongodb(Mogoose)构建应用程序。应用程序包含访问用户之前必须对其进行身份验证的路由。

目前,我已经编写了一个快速的中间件来做同样的事情。在这里,借助JWT令牌,我正在进行mongodb查询以检查用户是否已通过身份验证。但是感觉这可能会在我的数据库上增加不必要的请求负载。

我应该针对此特定任务集成redis吗?
会改善API性能吗?还是应该继续使用现有的mongodb方法?

如果我对此有更多的见解会很有帮助。


阅读 1629

收藏
2020-06-20

共1个答案

一尘不染

TLDR:如果您想在某个时候撤销令牌,可以,将其存储在像Redis这样的快速存储器中。

使用JWT的有据可查的缺点之一是,没有简单的方法可以撤销令牌,例如,如果用户需要注销或令牌已被盗用。撤消令牌意味着要在某个存储中查找令牌,然后决定下一步要做什么。由于JWT的要点之一是避免往返于db,因此一个很好的折衷方案是将其存储在比rdbms少的负担下。对于Redis而言,这是一项完美的工作。

正如评论中所建议的那样,一种好的方法是使该列表成为黑名单(即,无效令牌的列表)。根据每个请求,您将查找列表,以确保其中没有令牌。通过使用概率算法存储令牌,可以在查找步骤中进一步改善内存空间和性能。一个简单的实现是不将整个令牌存储在redis黑名单中。只需存储令牌的前几个字符。然后,您可以使用更持久的解决方案(文件系统,rdbms等)存储黑名单的完整版本。这是一个乐观的查询,仍然可以快速告诉您黑名单中不存在令牌(这是更常见的情况)。如果要查找的令牌恰巧与redis黑名单中的一项匹配(因为其前几个字符匹配),然后转到持久性存储上的额外查找。另一个更有效且相对容易实现的算法称为布隆过滤器。

2020-06-20