在 sessionStorage 中存储 JWT 是否安全?

信息安全 Web应用程序 饼干 jwt 本地存储
2021-08-15 09:25:01

来自 Auth0 的这篇文章建议将 JWT 本地存储在本地存储(或 cookie)中。但是OWASP 的这篇文章建议不要在本地存储任何敏感数据(甚至是 sessionStorage)

那么,在本地存储 JWT 令牌是否安全?

2个回答

多么奇怪!大约一个月前,我问了基本相同的问题。

最后,我们决定为 JWT 令牌使用 localstorage 是可以的,只要我们还在 HTTP 级别上执行以下操作:

  • 确保通过 HTTPS 提供整个站点
  • 确保使用HSTS
  • 确保一旦生效,只有实际的重定向 URL 包含在 Auth0 规则中,以及我们的源代码
    • 我们使用 Angular CLI。事实证明,尽管 WebPack 提供了 tree-shaking,但未使用的变量仍然出现在编译的源代码中,例如localhost:4200
    • 确保Auth0 上实际上没有localhost URl(在允许的重定向页面上,对于您的客户端)。创建一个单独的 Auth0 帐户进行测试
  • X-Frame-Options标头添加到每个 HTTP 响应,并将其设置为Deny
  • X-XSS-Protection设置为1
  • X-Content-Type-Options设置为nosniff
  • 确保Content-Security-Policy仅限于您自己的域名,以及您可能从中提取脚本的任何 CDN
  • Referrer-Policy设置为同源
  • 将 Auth0 的 JWT 到期时间限制为 1 小时

以上将在securityheaders.io上为您提供 A/A+ ,并将防止最常见的攻击(例如,有人将您的网站嵌入 iframe,并从本地存储中提取数据)。

这要看情况。如果您的应用程序中存在 XSS 漏洞,攻击者可以从您的本地存储中提取和使用 JWT。

我使用过的一种方法,我认为 Auth0 指示是使用 cookie 作为 JWT 存储并使用标志HTTP Only 和 Secure如果您有 XSS 漏洞,则无法读取 cookie,只能以安全方式传输。如今,CSRF 的风险较小,因为所有现代框架都包含 CSRF 缓解措施。

这意味着验证从服务器端的 cookie 中提取 JWT 以进行验证。我个人的观点是使用 cookie 作为存储,因为与具有较大攻击面的 XSS 攻击相比,CSRF 更容易找到和缓解。