JWT - 将它们存储在 LocalStorage 与 SessionStorage

Posted

技术标签:

【中文标题】JWT - 将它们存储在 LocalStorage 与 SessionStorage【英文标题】:JWT - Storing them in LocalStorage vs SessionStorage 【发布时间】:2017-03-06 22:25:32 【问题描述】:

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

背景:

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

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


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

在这种情况下,似乎只有两个地方可以存储您的 auth JWT:LocalStorage 或 SessionStorage...我想大多数人会使用 LocalStorage,因为关闭浏览器不会破坏令牌。

我的主要问题是:

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

谢谢!

【问题讨论】:

【参考方案1】:

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

从安全的角度来看,它们几乎是等效的。您可能会争辩说,由于SessionStorage 的生命周期较短,并且在用户终止会话时会自动清理,所以它更安全一些,但仅此而已。另请注意,关闭浏览器可能不会破坏会话存储的内容;会话存储与浏览上下文的生命周期相关。

规范清楚地指出了这一点:

浏览上下文的生命周期可能与实际用户代理进程本身的生命周期无关,因为用户代理可能支持在重启后恢复会话。

(重点是我的)

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


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

【讨论】:

以上是关于JWT - 将它们存储在 LocalStorage 与 SessionStorage的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS:在客户端将 JWT 存储在哪里? sessionStorage、localStorage 还是 cookie?

使用 Http 和 Secure 将 Jwt 令牌存储在 Cookie 中,而不是 Javascript 中的 LocalStorage

JWT LocalStorage 与 Cookie

如何在 localStorage 中破坏 JWT? [关闭]

AngularJS - 如何在 $localStorage 中存储 JWT 令牌

反应并将 jwt 令牌存储在本地存储中