你好stackoverflow社区!
我们用nuxts.js框架构建一个SPA应用程序,我们到达了这一点,这是从我们的后端API服务存储JWT令牌的最安全的方法。
我们有两种选择……
你不能肯定地说cookie比localStorage更受欢迎。这实际上取决于您如何实施您的应用程序,您正在使用的框架以及您想要做什么。让我更准确地描述一下。
的 使用httpOnly的Cookie: 强>
当与HttpOnly cookie标志一起使用时,Cookie无法通过JavaScript访问。
将jwt令牌存储在cookie中并通过http请求设置时 set-cookie 在浏览器上,然后浏览器将在每个请求上发送此凭据。当然,你可以申请保护它 httpOnly 和 secure 该cookie的标志。所以没有javascript会访问它。但问题是你正在打开机会 CSRF 攻击。
set-cookie
httpOnly
secure
CSRF
当令牌存储在cookie中时,浏览器会自动将其与每个请求一起发送到同一域,这仍然容易受到CSRF攻击。
的 localStorage的: 强>
另一方面,jwt令牌在每个请求的Authorization标头中发送。因此浏览器不会在您的请求中自动设置它。它应该通过客户端的javascript在每个请求上设置。
因此,基本上因为浏览器不会自动添加到每个请求,所以默认情况下它不容易受到CSRF的攻击。
但是当您的客户端代码容易受到攻击时,问题就出现了 XSS 。在这种情况下,因为您将凭据存储在localStorage上,然后攻击者将完全控制客户端并可以执行任何操作。存储在cookie中的区别在于,攻击者不知道使用httpOnly标志存储的cookie的确切值。但是他可以用http标头发送请求。
XSS
所以我认为这取决于以下情况:
你想保存jwt令牌 的 localStorage的 强> ,请务必检查所有输入并验证它们。使用不易受攻击的框架 XSS (当然不是框架可以声称,但至少使用最近没有报告过的CVE)。还要始终更新客户端代码。实现所有安全概念 csp 和...... 还要注意您正在使用的CDN,并注意您使用的是哪个库。
csp
你喜欢用 的 曲奇饼 强> 并在浏览器上通过Cookie设置凭据。然后小心实施反csrf缓解技术。总是用 https 并设定 secure 旗。小心攻击存在于cookie上,如子域攻击和中间人攻击。 Django也使用两种很酷的方法来处理这种情况 (在这里阅读更多相关信息)
https
的 最后的说明: 强> 我不认为这个主题有一般的解决方案,任何人都可以根据它的实验和知识提出建议。 的 顺便说一句,我更喜欢localStorage存储从Rest API收到的凭据 强> 。 但是,如果有人能纠正我寻求更好的解决方案,我真的很高兴。