感谢您抽出宝贵时间阅读我的问题!我今天一直在研究JWT。最初我认为现代的共识是,JWT对两种主要类型的攻击持开放态度,除非存储在httpOnly cookie中(只能由服务器发布)。
背景
但是,我今天了解到,只要您不在JWT有效负载中放置任何机密用户信息,如果黑客可以访问令牌并对其进行解码,则可以,因为在大多数情况下,它可能只显示用户的唯一ID。一旦服务器验证JWT并在有效负载的子密钥内抓取ID,我就可以处理服务器上的用户密码和其他机密信息。
尽管如此,如果黑客拦截例如令牌MID请求/响应,并且令牌永不过期,我仍然不会100%明白会发生什么。根据我的理解,黑客将能够访问用户的帐户并在用户的页面上乱七八糟,并且没有真正的方法从黑客中撤销令牌,甚至如果用户重置了他或她的密码,因为黑客仍然有令牌而服务器不够聪明,无法意识到它不是预期的用户。
无论如何,我意识到我不能使用httpOnly cookie或任何cookie,因为我只使用后端服务器作为API,它不能将服务器上的cookie交付给我面向前端客户端的程序(例如React) )。
在这种情况下,似乎只有两个地方存储您的身份验证JWT:LocalStorage或SessionStorage ...我猜大多数人都会使用LocalStorage,因为关闭浏览器不会破坏令牌。
我的主要问题是:
因为LocalStorage或SessionStorage是唯一合理的'存储JWT的地方,比另一个更安全,为什么?
谢谢!
答案 0 :(得分:8)
LocalStorage
和SessionStorage
都在same specification中定义,它们之间的差异仅与每个商店的数据生命周期有关。
从安全角度来看,它们大多相当于。您可能会争辩说,由于SessionStorage
的生命周期较短,并且在用户终止会话时会自动清理,因此它会更加安全,但这是关于它的。另请注意,关闭浏览器可能不会破坏会话存储的内容;会话存储与浏览上下文的生命周期相关联。
规范明确指出:
浏览上下文的生命周期可能与实际用户代理进程本身的生命周期无关,因为用户代理可能支持在重新启动后恢复会话。
(重点是我的)
由于您的特定要求,您已经排除了Cookie,但如果您想了解更多关于存储令牌客户端的安全注意事项,您应该阅读存储令牌的位置?部分Cookies vs Tokens: The Definitive Guide
关于如果攻击者获得对令牌的访问权限所发生的事情,如果令牌被称为承载令牌而不是授权请求所需的唯一内容就是知道令牌。这意味着服务器将接受来自具有令牌的任何人的请求。因此,建议令牌的使用寿命缩短,以尽量减少泄漏的影响。