JWT 的正确使用方法是什么?

What is the correct way to use JWT?

历史

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

JWT Rise:使用 JWT,您可以跳过此步骤(查询数据库以进行身份​​验证),并可以使用与您的服务器签名的有效 JWT。您应该在 header 中的所有请求中发送 JWT 令牌,但如果此令牌被盗,小偷可以永远使用它进行身份验证。

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

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

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

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

CSRF 攻击:httpOnly cookie 的新问题是 CSRF 攻击。 CSRF 攻击来自 sessions-cookie age.

我的做法

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

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

现在我的问题

我了解如何使用 JWT 了吗?

很好的解释,我想你明白了。

为了补充您的解释,您可能需要轮换刷新令牌:在使用刷新令牌获取新的访问令牌后,return一个新的刷新令牌并使旧令牌无效。这将阻止获得旧刷新令牌访问权限的人使用它。