NodeJS:JWT验证与redis查询性能比较



我已经实现了JWT令牌,用于对我的API进行身份验证,该API使用node.js.提供服务

对于发送到服务器的每个请求,我都会执行jwt.verify(),但我想知道这是否比在Redis中存储令牌和检索userId更占用CPU,因此可扩展性更低。

示例:

const jwt = require('jsonwebtoken')
const app = require('express')
app.get('/user',(req, res) => {
const { headers: { authorization } } = req
let token = null
if (authorization && authorization.split(' ')[0] === 'Bearer') {
token = authorization.split(' ')[1]
}
jwt.verify(token, process.env.TOKEN_SECRET, (err, decoded) => {
if(err || !decoded){
return res.json({success: false, message: `Not valid token`})
}
//
// Continue with my logic
//
})
})

所以我想知道是否有人知道jwt.verify()redis.get()在性能方面是否更好?

我认为这是一个有争议的话题,但答案在很大程度上取决于你试图实现的目标/你使用的硬件/你计划如何扩展(正如你提到的可扩展性(

TL;DR如果jwt.verify()不会导致当前负载的性能问题,我会坚持使用它

  1. 对于使用HS256算法创建的常规JWT令牌,jwt.verify()不是在<在现代CPU 上1ms

  2. 对于Redis案例,我们需要考虑两种情况

    • 我们在同一台机器上运行Redis实例,这样我们就不必进行网络调用,也不必在延迟上浪费时间或处理网络错误的风险。但我们无论如何都会引入延迟,因为两个独立的进程必须相互通信,但这将是相同的<1ms

    • 我们有一个全球Redis服务器/集群,用于存储我们的JWT代币,我们必须处理网络问题,并将延迟增加到30-50ms,甚至更多

  3. 此外,当我们将Redis引入我们的系统时,我们为我们的系统创建了一个额外的复杂性层,必须对其进行维护等。

尽管Redis带来了额外的复杂性,但它更倾向于面向Node.js的理念是尽可能地使一切异步,并且不会用繁重的任务锁定CPU(EventLoop(。

但是使用Redis方法,我们有点失去了JWT本身的优势(我们的userId已经在令牌中加密(,也许我们需要考虑使用会话来存储userId而不是JWT的解决方案。在大多数情况下,当令牌过期时,我们需要将JWT存储在某个地方,并且我们需要访问刷新令牌来创建新的JWT。

因此,我认为最好的方法是坚持使用jwt.verify(),如果它不会导致当前负载的性能问题(比如你的服务器没有一直处于峰值水平,但这是另一个需要讨论的问题和主题(

第页。S.您可以使用像process.hrtime()这样的节点API来简单地测量运行代码的性能

最新更新