node.js - JWT - 将它们存储在 LocalStorage 与 SessionStorage 中

标签 node.js api local-storage token jwt

感谢您花时间阅读我的问题!我今天一直在研究 JWT。最初我认为现代共识是 JWT 对两种主要类型的攻击开放,除非存储在 httpOnly cookie 中(只能由服务器发布)。

背景:

但是,我今天了解到,只要您不在 JWT 负载中放置任何 secret 用户信息,黑客就可以访问 token 并对其进行反编码,因为它最多可能只是显示一个用户的唯一 ID。一旦服务器验证了 JWT 并获取了负载子 key 中的 ID,我就可以处理获取服务器上的用户密码和其他 secret 信息。

尽管如此,我仍然不是 100% 清楚如果黑客拦截 token MID 请求/响应并且 token 永不过期会发生什么。据我了解,黑客将能够访问用户帐户并在用户页面上乱搞,并且没有真正的方法可以从黑客那里撤销 token ,即使用户重置了他或她的密码,因为黑客仍然拥有 token ,但服务器不够智能,无法意识到它不是预期用户。


无论如何,我意识到我不能使用 httpOnly cookie 或任何 cookie,因为我只将后端服务器用作 API,它不能跨服务器向我的前端面向客户端的程序(例如 React ).

在这种情况下,似乎只有两个地方可以存储您的身份验证 JWT:LocalStorage 或 SessionStorage...我猜大多数人会选择 LocalStorage,因为关闭浏览器不会破坏 token 。

我的主要问题是:

由于 LocalStorage 或 SessionStorage 是存储 JWT 的唯一“合理”位置,一个比另一个更安全,为什么?

谢谢!

最佳答案

LocalStorageSessionStorage 都在 same specification 中定义它们之间的区别仅在于放置在每个存储上的数据的生命周期。

从安全的角度来看,它们基本相同。您可能会争辩说,由于 SessionStorage 的生命周期较短,并且在用户终止 session 时会自动清理,因此它在某种程度上更安全​​,但仅此而已。另请注意,关闭浏览器可能不会破坏 session 存储的内容; session 存储与浏览上下文的生命周期相关。

规范明确指出:

The lifetime of a browsing context can be unrelated to the lifetime of the actual user agent process itself, as the user agent may support resuming sessions after a restart.

(重点是我的)

由于您的特定要求,您已经排除了 cookie,但如果您想了解更多关于在客户端存储 token 的安全注意事项,您应该阅读 Where to Store Tokens? 部分Cookies vs Tokens: The Definitive Guide .


关于如果攻击者获得对 token 的访问权会发生什么,您所说的大部分是正确的,如果 token 是所谓的不记名 token ,那么授权请求所需的唯一事情就是知道 token 。这意味着服务器将接受来自任何拥有 token 的人的请求。因此,建议 token 的生命周期较短,以尽量减少泄漏的影响。

关于node.js - JWT - 将它们存储在 LocalStorage 与 SessionStorage 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40230338/

相关文章:

node.js - 如何使用nodemailer和smtp传输发送邮件?

javascript - Node.js GET 请求 ETIMEDOUT & ESOCKETTIMEDOUT

用于从数据库生成 Postgres SQL 脚本的 Java 库

javascript - 获取 js localstorage 项目不区分大小写

html - 在 React 应用程序中存储大量数据时我应该更喜欢什么?

python - 将 numpy 数组从 python 传递到 javascript

node.js - 较新的 Firebase Node.js SDK 初始化不起作用 - 旧版本可以

forms - HTML Post 表单的身份验证 header

c - Vista 和 XP 的区别 [C]

c - 为什么会出现堆栈溢出