使用 JWT 的正确方法是啥?

Posted

技术标签:

【中文标题】使用 JWT 的正确方法是啥?【英文标题】:What is the correct way to use JWT?使用 JWT 的正确方法是什么? 【发布时间】:2020-11-03 04:37:50 【问题描述】:

历史

Sessions-Cookies Age:据我所知,JWT 用于减少数据库请求。会话通常存储在数据库中,所有请求都需要查询以验证请求。在小型网站和网络应用中这不是问题,但在大型应用中性能非常重要。

JWT 崛起:使用 JWT,您可以跳过此步骤(查询 DB 进行身份验证),并且可以使用与您的服务器签名的有效 JWT。您应该在标头中的所有请求中发送 JWT 令牌,但如果此令牌被盗,小偷可以使用它来永久进行身份验证。

为了保护这一点,您可以在 JWT 中添加过期时间,但在过期时间之前,小偷可以像用户一样使用它。现在您可以减少过期时间(例如 10 分钟)以保护用户,但在令牌过期后,真实用户应该使用用户名和密码登录,这是一场噩梦。

刷新令牌诞生:现在我们可以将 JWT 与 cookie 概念混合使用。刷新令牌存储在数据库中,您可以通过登录和注销来控制它。在访问令牌(使用期限短的 JWT 令牌)过期后,客户端向某个端点发送请求以刷新该端点中的访问令牌服务器检查数据库并搜索刷新令牌。如果在白名单中(或不在黑名单中)刷新令牌,则服务器生成新的访问令牌并返回给客户端。现在您可以将访问令牌存储在内存中并在本地存储中刷新令牌或类似的东西。

XSS 攻击:本地存储不安全,黑客可以通过 XSS 攻击窃取您的本地存储。

httpOnly cookie:您可以将 JWT 令牌存储在 httpOnly cookie 中。从服务器和客户端设置的 httpOnly cookie 无法从 JS 访问。

CSRF 攻击:httpOnly cookie 的新问题是 CSRF 攻击。 CSRF 攻击来自 session-cookie 时代。

我的方法

刷新令牌与cookies非常相似,现在我们将cookie和JWT一起使用,访问令牌是传统的JWT令牌,刷新令牌是传统的会话令牌。每 10 分钟(在我的示例中为 JWT 年龄)我们使用刷新令牌(或会话令牌)登录,并且在它们之间我们使用访问令牌。

如果用户每 10 分钟发送 100 个请求,我的数据库身份验证请求将减少 100 倍

现在我的问题

我了解如何使用 JWT 吗?

【问题讨论】:

【参考方案1】:

很好的解释,我想你理解得很好。

为了增加您的解释,您可能希望轮换刷新令牌:在使用刷新令牌获取新的访问令牌后,返回新的刷新令牌并使旧的刷新令牌无效。这将阻止获得旧刷新令牌访问权限的人使用它。

【讨论】:

以上是关于使用 JWT 的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

JWT身份验证中刷新令牌的正确实现是啥

生成 JWT 的正确方法

使用 express 执行 jwt 刷新令牌的正确方法

在 React Redux 应用程序中使用 JWT 身份验证令牌的正确方法

如何使用 passport-jwt 正确检查令牌有效负载?

在 HTTP 数据包(Cookie、标头或 JSON)中包含 JWT 令牌的正确方法