Ita*_*Ale 5 javascript security jwt single-page-application
该应用程序是一个SPA,该SPA托管在静态存储上(虽然与S3相似,尽管不是S3,但在概念上类似于S3),并且根本没有后端服务器。假设这是https://static.example.com/app.html
用户访问页面时,他们可以通过外部提供程序(如Auth0和Azure AD)进行身份验证。它们完成了身份验证流程,并带有id_token
URL片段上的发送回SPA 。例如,https://static.example.com/app.html#id_token=XX
。这id_token
用于调用在Bearer
授权标头中传递的外部API服务器。
问题是将JWT存储在客户端的位置。
sessionStorage
可能会导致令牌被XSS攻击(或在依赖项中添加恶意代码等)窃取。HttpOnly
或其中至少一部分的 Cookie中(请参阅“ Cookie拆分”部分)。但是,在我的情况下,这是不可行的,因为没有后端服务器,并且经过身份验证的用户将直接重定向到SPA,因此无法创建HttpOnly
Cookie。OWASP建议使用HttpOnly
我看到了两种不同的选择,它们都有严重的或潜在的严重缺陷:
sessionStorage
假设以XSS攻击(或通过NPM注入恶意依赖关系)可能导致会话被盗的风险,以任何方式存储令牌。可以通过将令牌的寿命设置得较短(例如1小时)来缓解这种情况。虽然我正在使用的应用程序没有存储关键信息(它不是银行信息或类似信息),但允许通过XSS窃取会话的代码错误并不好。我想念什么?
安全性是一种妥协——您可以选择接受 XSS 风险,或者承担后端服务器的负担以获得更高的安全性,或者牺牲用户体验以获得可能介于两者之间的安全级别。你不可能拥有一切。
一种常见的解决方案是在 sessionStorage 中使用非常短暂的令牌,并使用 httpOnly cookie 供身份提供者在需要时获取新令牌。这种窃取会话令牌的方式为攻击者提供的价值较小,并且由于 XSS 需要用户交互,因此攻击者有时可能很难获得新的令牌(或者很容易,具体取决于 XSS 所在的位置)。此外,此解决方案需要更优雅的错误处理,并导致代码稍微复杂一些。
归档时间: |
|
查看次数: |
303 次 |
最近记录: |