在客户端将Json Web令牌JWT存储在哪里最安全?

时间:2018-12-07 10:59:55

标签: security jwt token nuxt.js

你好stackoverflow社区!

我们使用nuxts.js框架构建了一个SPA应用程序,并且到了最重要的方式来存储来自后端API服务的JWT令牌。

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

以我的观点,cookie似乎比localStorage在客户端存储JWT的方法更安全,但我想知道是否还有比上述选项更安全的方法。

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

提前谢谢!

1 个答案:

答案 0 :(得分:3)

您不能肯定地说cookie是localStorage的首选。这实际上取决于您如何实现应用程序,所使用的框架以及要执行的操作。让我更精确地描述它。

具有httpOnly的Cookie:

  

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

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

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

localStorage:

  

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

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

但是,当您的客户端代码容易受到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收到的凭据。 但是,如果有人可以纠正我的问题,我会很高兴。