我正在使用ExpressJS,Mongodb(Mogoose)构建应用程序。应用程序包含用户在访问之前必须进行身份验证的路由。
目前我已经编写了一个快速中间件来做同样的事情。在JWT令牌的帮助下,我正在进行mongodb查询以检查用户是否经过身份验证。但是觉得这可能会对我的数据库加载不必要的请求。
如果我对此有更深入的了解,我应该将redis集成到这个特定的任务中吗? 它会改善API性能吗?或者应该继续现有的 mongodb方法?
将会有所帮助。
答案 0 :(得分:22)
TLDR:如果您希望能够在某个时刻撤销令牌,是的,请将其存储在像Redis一样快的地方。
使用JWT的一个明显缺点是,如果用户需要注销或令牌已被泄露,则没有简单的方法来撤销令牌。撤销令牌意味着在一些存储中查找它然后决定下一步该做什么。由于JWT的一个要点是避免往返db,所以一个很好的折衷方案是将它存储在比rdbms更少的东西中。这对Redis来说是一个完美的工作。
正如评论中所建议的那样,一个好的方法是使列表成为黑名单(即无效令牌列表)。在每次请求时,您都会查找列表以确保令牌不存在。通过使用概率算法存储令牌,您可以在查找步骤中进一步改善内存空间和性能。一个简单的实现是不将整个令牌存储在redis黑名单中。只需存储令牌的前几个字符。然后,您可以使用更持久的解决方案(文件系统,rdbms等)存储更全面的黑名单。这是一个乐观的查找,仍然会很快告诉您黑名单中不存在令牌(这是更常见的情况)。如果正在查找的令牌碰巧匹配redis黑名单中的项目(因为它的前几个字符匹配),则转移到持久性存储上的额外查找。为此实现算法的另一个更有效和相对简单的是称为布隆过滤器。
答案 1 :(得分:0)
您可以使用Redis存储jwt标签。 Redis更快速,更方便地存储这些数据。对Redis的请求不应该对性能产生很大影响。您可以尝试使用库jwt-redis