我应该用redis存储JWT令牌吗?

man*_*eer 14 mongodb redis node.js express jwt

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

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

我应该将redis集成到这个特定的任务中吗?
它会改善API性能吗?还是应该继续使用现有的mongodb方法?

如果我对此有更深入的了解,将会有所帮助.

Mic*_*oka 25

TLDR:如果你想要在某些时候撤销令牌的能力,是的,将它存储在像Redis这样快速的东西中.

使用JWT的一个明显缺点是,如果用户需要注销或令牌已被泄露,则没有简单的方法来撤销令牌.撤销令牌意味着在一些存储中查找它然后决定下一步该做什么.由于JWT的一个要点是避免往返db,所以一个很好的折衷方案是将它存储在比rdbms更少的东西中.这对Redis来说是一个完美的工作.

正如评论中所建议的那样,一个好的方法是使列表成为黑名单(即无效令牌列表).在每次请求时,您都会查找列表以确保令牌不存在.通过使用概率算法存储令牌,您可以在查找步骤中进一步改善内存空间和性能.一个简单的实现是不将整个令牌存储在redis黑名单中.只需存储令牌的前几个字符.然后,您可以使用更持久的解决方案(文件系统,rdbms等)存储更全面的黑名单.这是一个乐观的查找,仍然会很快告诉您黑名单中不存在令牌(这是更常见的情况).如果正在查找的令牌碰巧匹配redis黑名单中的项目(因为它的前几个字符匹配),则转移到持久性存储上的额外查找.为此实现算法的另一个更有效且相对简单的是称为布隆过滤器.

  • @manishkeer这不是一个非常好的方法,这是你有很多用户,这个列表会有点不大.相反,如果您保留黑名单,则只需要保留被撤销访问权限的用户,并且只有在令牌过期之后,您才能从黑名单中删除该令牌.另外,为什么要使用令牌存储using id?该信息应该已经在令牌内..这就是JWT的重点. (3认同)

小智 5

您可以使用 Redis 来存储 jwt 标签。Redis 在存储此类数据方面更快、更方便。对Redis的请求应该不会对性能产生很大的影响。你可以试试库jwt-redis