我读到,使用 JWT 时,无需防范 CSRF 攻击,例如:“由于您不依赖 cookie,因此无需防范跨站请求”。
但是,我不明白的是:如果我将令牌存储在
localStorage
中(正如我在同一网站的教程上建议的那样),什么可以防止攻击者通过读取我的localStorage
来伪造恶意请求我的饼干?由于它是在服务器端生成的,我不明白如何在客户端请求中使用令牌而不将其存储在客户端的某个位置。
本文。
但是,有很多移动部件需要考虑。首先,HTML5 存储和 cookie 在 JavaScript 访问方面的范围存在细微差别。
HTML5 存储是:
http://example.com
HTML5 存储中存储的项目无法通过在
https://example.com
上运行的 JavaScript 访问。
http://example.com
HTML5 存储中的项目无法通过在
http://sub.example.com
上运行的 JavaScript 访问(不过,您可以使用一些技巧 来解决这个问题)。
example.com
的 cookie 将同时发送至
http://example.com
和
https://example.com
除非它具有属性
secure
,在这种情况下,它将仅发送至
https
。
example.com
,那么它将被发送到
example.com
和
sub.example.com
。 (这是 cookie“规范”中最令人困惑的部分,不幸的是,请参阅这篇文章)。
secure
cookie 标志),则 JavaScript 可以读取 cookie除非 cookie 具有
httpOnly
属性,在这种情况下 JavaScript 将无法读取读一下。
无论发起请求的页面的域是什么。
最后一部分是CSRF攻击是如何完成的(同源策略的帮助有限)。 CSRF 上的 OWASP 页面是了解此类攻击如何运作的良好资源。
将身份验证令牌存储在本地存储中并手动将其添加到每个请求中可以防止 CSRF 的原因是关键字:手动。由于浏览器不会自动发送该身份验证令牌,因此如果我访问 evil.example
POST http://example.com/delete-my-account
,它将无法发送我的身份验证令牌,因此该请求将被忽略。
考虑到上述情况,是使用 cookie 还是 HTML5 存储就变成了一系列的权衡:将身份验证令牌存储在 HTML5 存储中意味着:
(-)
(+)
(-)
httpOnly
和
secure
的 cookie 中,则:
(+)
(-)
您的身份验证令牌是否保护与金钱有关的任何内容?您可能需要 cookie
httpOnly
secure
选项。
实施 CSRF 保护所需的努力是否不值得其保护的资产?那么 HTML5 存储可能是正确的地方。
虽然这种方法不会受到
csrf
攻击,但它很容易受到 xss
攻击。
最小的改进是使用
session storage
而不是 local storage
,因为
session storage
数据在用户关闭选项卡/浏览器后被清除。