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

use*_*499 4 api token local-storage node.js jwt

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

背景:

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

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


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

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

我的主要问题是:

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

谢谢!

Joã*_*elo 8

二者LocalStorageSessionStorage在所定义的相同的规格和它们之间的差别仅仅是关于数据的寿命,其放置在每个商店.

从安全角度来看,它们大多相当.您可以争辩说,由于SessionStorage用户终止会话的生命周期较短且自动清理,因此它更安全,但就是这样.另请注意,关闭浏览器可能不会破坏会话存储的内容; 会话存储与浏览上下文的生命周期相关联.

规范明确指出:

一个浏览器上下文的使用期限可以是无关的实际用户代理过程本身的寿命,为用户代理可以支持重启后恢复会话.

(重点是我的)

您已根据具体要求排除了cookie,但如果您想了解更多关于存储令牌客户端的安全注意事项,您应该阅读存储令牌的位置?饼干VS令牌:权威指南.


关于如果攻击者获得对令牌的访问权限所发生的事情,如果令牌是所谓的承载令牌,那么授权请求所需的唯一内容就是知道令牌.这意味着服务器将接受来自具有令牌的任何人的请求.因此,建议令牌的使用寿命较短,以尽量减少泄漏的影响.