提问者:小点点

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


历史

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

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

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

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

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

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

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

我的做法

刷新令牌非常类似于cookie,现在我们使用cookie和JWT访问令牌是传统的JWT令牌,刷新令牌是传统会话的令牌。

如果用户每10分钟发送100个请求,我的DB认证请求减少100倍

现在我的问题

我明白如何使用JWT吗?


共1个答案

匿名用户

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

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