Json Web 令牌安全 [Node JS]

Posted

技术标签:

【中文标题】Json Web 令牌安全 [Node JS]【英文标题】:Json Web Token security [ Node JS ] 【发布时间】:2020-11-13 16:26:09 【问题描述】:

这篇文章只是想知道我的方法/代码是否没有引入任何开销并且在安全性方面是否足够Technology used: NodeJS, JWT, ExpressJS, mongoose(mongoDB)

以下是用户模式:

const userSchema = mongoose.Schema(
email: 
    type: String,
    required: true
,
password: 
    type: String,
    required: true
,
accessToken: 
    type: String

);

现在我的代码实现了以下内容:

每次用户登录他的帐户时,生成的访问令牌(JWT)都会保存到用户帐户(在数据库中)。每当请求需要身份验证时,例如:GET /api/user/myprofile JWT 在 Authorization 标头中与此请求一起发送,并使用已保存在数据库中的令牌进行检查(正如我之前提到的),因此没有其他人访问旧的有效 JWT 可以访问用户帐户。除此之外,经过身份验证的路由还有一个中间件功能,可以验证 JWT,这是必不可少的。

同样的检查也对/logout 端点进行。如果 Authorization 标头中的令牌(JWT)与用户数据库中的令牌不同,则会引发 403 错误,因此具有有效令牌的攻击者无法连续注销用户。

就令牌管理而言,这足以提供安全性吗?有什么我遗漏的强制性内容吗?

谢谢。

【问题讨论】:

【参考方案1】:

我相信您的应用程序...有一点改进的潜力。看:

    您不应该将 JWT 令牌存储在数据库中。如果您可以信任该令牌,您应该验证 JWT 令牌的签名。 通过将所有令牌存储在数据库中,您会遇到单点故障。一旦你的数据库被黑,每个人都会被黑。 注销端点不应该需要身份验证或令牌。您是否希望将带有无效令牌的用户重定向到登录页面,以便他可以注销?

请阅读如何使用 JWT 令牌:https://jwt.io/introduction/

完成后,看看关于 JWT 令牌最常见的安全问题是什么:https://cheatsheetseries.owasp.org/cheatsheets/JSON_Web_Token_for_Java_Cheat_Sheet.html

【讨论】:

以上是关于Json Web 令牌安全 [Node JS]的主要内容,如果未能解决你的问题,请参考以下文章

使用 jwt decode 来解码 react js 中的令牌是不是安全?

通过安全令牌进行 API 身份验证的最佳实践(Node.js 服务器和移动应用程序)

如何以安全的方式为客户提供 JSON Web 令牌(JWT)?

验证使用 JSON Web 加密 (JWE) 加密的安全令牌的颁发者?

关于 JSON Web 令牌 (JWT) 的安全性和可靠性问题

如何使用 express 在用户浏览器的响应标头 cookie 中查找 JSON Web 令牌 (JWT) 来制作 node.js?