【问题标题】:Where is safest to store Json Web Tokens JWTs in client side?在客户端哪里存储 Json Web Tokens JWT 最安全?
【发布时间】:2019-05-09 03:20:49
【问题描述】:

你好 stackoverflow 社区!

我们使用 nuxts.js 框架构建了一个 SPA 应用程序,并且我们已经达到了从我们的后端 API 服务存储 JWT 令牌的最安全方式的地步。

我们有两个选项 cookie 带有 httpOnly 标志和 localStorage。我阅读了大量关于这两个选项比较的文章,尽管一半的开发人员支持 cookie,一半的开发人员支持本地存储。

在我看来,cookie 在客户端存储 JWT 似乎比 localStorage 更安全,但我想知道是否有比上述选项更安全的方式。

所以我想到了一些事情。 Nuxt.js 框架为我们提供了存储环境变量的机会。将 JWT 令牌存储为环境变量是否更安全,或者与上述选项完全相同,或者更糟糕。

提前谢谢你!

【问题讨论】:

  • jwt 令牌是每个用户的。环境变量是每个服务器。我知道你想如何将它们用于 jwt 令牌..
  • @Aldarund 看看这个:nuxtjs.org/api/configuration-env。顺便问一下,您更喜欢使用 cookie 还是 localStorage 来存储 JWT?
  • 正如我所说的每个服务器的环境。你不能在那里存储单个用户令牌:)

标签: security jwt token nuxt.js


【解决方案1】:

您不能肯定地说 cookie 优于 localStorage。这实际上取决于您如何实现您的应用程序、您使用的框架以及您想要做什么。让我更准确地描述一下。

带有 httpOnly 的 Cookie:

Cookie 与 HttpOnly cookie 标志一起使用时,无法通过 JavaScript 访问。

当您将 jwt 令牌存储在 cookie 中并通过浏览器上的 http 请求 set-cookie 设置它时,浏览器将在每个请求上发送此凭据。当然,您可以通过为该 cookie 应用 httpOnlysecure 标志来保护它。这样没有 javascript 将访问它。但问题是您正在为CSRF 攻击打开机会。

当令牌存储在 cookie 中时,浏览器会自动将其与每个请求一起发送到同一个域,这仍然容易受到 CSRF 攻击。

本地存储:

另一方面,jwt 令牌在每个请求的 Authorization 标头中发送。因此浏览器不会在您的请求中自动设置它。它应该通过客户端的javascript在每个请求上设置。

所以基本上因为浏览器不会自动添加到每个请求中,默认情况下它不会受到 CSRF 的攻击。

但是当您的客户端代码容易受到XSS 的攻击时,问题就来了。在这种情况下,由于您将凭据存储在 localStorage 上,因此攻击者将完全控制客户端并且可以做任何事情。存储在 cookie 中的不同之处在于,攻击者不知道使用 httpOnly 标志存储的 cookie 的确切值。但他可以发送带有该 http 标头的请求。


所以我认为这取决于以下情况:

  • 您想将 jwt 令牌保存在 localStorage 中,请务必检查所有输入并验证它们。使用不易受到XSS 攻击的框架(当然不是框架可以声称,但至少使用最近没有报告 CVE 的框架)。还要始终更新您的客户端代码。实现所有安全概念,如csp 和... 还要注意您使用的是什么 CDN,并注意您使用的是哪个库。

  • 您更喜欢使用 cookie 并通过浏览器上的 Cookie 设置凭据。然后小心实施反csrf缓解技术。始终使用https 并设置secure 标志。小心存在于 cookie 上的攻击,例如子域攻击和中间人攻击。 Django 还使用两种很酷的方法来处理这种情况(read more about it here)

    • 双重提交 Cookie
    • 同步器令牌

最后说明:我认为这个话题没有通用的解决方案,任何人都可以根据它的实验和知识提出建议。 顺便说一下,我更喜欢 localStorage 来存储从 Rest API 收到的凭据。 但如果有人能纠正我以获得更好的解决方案,我真的很高兴。

【讨论】:

  • 哇,非常好的和详细的回答 Reza!就我个人而言,我更喜欢带有 httpFlag 的 cookie,因为您可以更轻松地防止 CSRF 攻击,我的意思是它更受控制,另一方面,XSS 它是一团糟,它并非全部都在控制之中,很好的例子就是您所说的来自 CDN 的外部脚本、广告脚本、用于营销目的的跟踪脚本以及易受攻击的一般脚本。无论如何取决于每个开发人员,但对我来说,规则永远不会信任 Javascript。 :) 祝你有美好的一天!
  • 总的来说,我可以说,如果您确定您的代码不会受到 XSS 的攻击并且框架已更新且尚未报告 xss,那么 localStorage 可能是最佳选择,但如果您有一点的可能性,然后使用 Cookie 但完全实现它。因为现在报告了很多新的攻击(检查黑帽谈话)
  • 很好的答案,我个人在存储机密方面有点偏执,针对 CSRF 很容易保护,但是针对 XSS 几乎是不可能的。我通常会选择饼干。
猜你喜欢
  • 2021-11-16
  • 2016-04-22
  • 2010-11-26
  • 2015-09-01
  • 2013-02-10
  • 1970-01-01
  • 2020-08-22
  • 2018-12-23
  • 2019-11-20
相关资源
最近更新 更多