我正在使用 NextJS 和 Spring Boot 开发一个应用程序。我在 Spring Security 中使用 JWT 身份验证,因此我创建了一个端点来接受用户的凭据并在成功登录尝试后返回 JWT 令牌。
但是,现在我想知道在前端存储令牌的最佳方式是什么,我应该使用刷新令牌机制吗?
我读过很多关于这方面的文章,每次读另一篇文章时我都会更加困惑,以下是我的想法:
毕竟,我读到将其存储在本地存储中可能会导致 XSS 攻击,但是 NextJS 是否已经清理了来自 XSS 攻击的用户输入?那么我的方法足够安全吗?
无法在浏览器中安全地存储 JWT,这就是为什么您不应该使用 JWT 作为会话的原因之一。
JWT 不应该分发给浏览器,因为您已经看到它们可以通过 XSS 攻击被窃取,您无法注销用户,您无法注销所有设备,令牌可以在中间人攻击中被窃取,用于 CSRF 攻击,这样的例子不胜枚举。
仅仅因为您可以免受 XSS 攻击,并不意味着您可以免受其他攻击。
而且,仅仅因为你现在安全了,并不意味着明天你也会安全。如果第三方依赖项存在漏洞怎么办?那不是你的代码。
真正的安全性在前端和后端之间使用 cookie,然后将 cookie 交换为后端微服务之间内部使用的令牌。
遗憾的是,大多数在浏览器中使用 JWT 的人/教程从未构建过真正的安全性。