单独使用访问令牌可以防止 CSRF 攻击,因为浏览器会阻止访问另一个站点的 cookies 吗?

Can using access token alone prevent CSRF attack, since browser prevents accessing cookies of another site?

我是网络安全新手,在了解 CSRF 时,我有一个非常简单的问题:

假设我们有这种情况:

  1. 在网络浏览器上,我访问了一个普通网站(称之为网站 A)并使用凭据登录。

  2. 我通过身份验证后,网站A会颁发一个访问令牌供我的浏览器存储。当我使用网站 A 时,我发出的任何后续 http 请求都会发送到 api 端点,并且身份验证令牌会附加到请求中。

  3. 现在我访问了一个邪恶的网站。当恶意网站的 html / javascript 前端代码在浏览器中加载时,它诱导我向网站 A 的 api 端点发出 HTTP 请求。

但是由于不同来源的资源(DOM、本地存储、cookies)在浏览器中是隔离的,所以恶意站点的前端代码是没有办法访问网站A的access token的。因此对网站 A 的 api 端点的诱导 HTTP 请求将不包含访问令牌。请求不会成功。

在我看来,仅使用身份验证令牌就可以防止 CSRF,只要不同来源的 cookie 被隔离并且不能跨来源访问,这在现代网络浏览器中是非常明确的。
一个网站的前端代码绝对不可能获取另一个网站的 cookies / DOM / 存储在浏览器中。

为什么还有其他所有防止 CSRF 的技术?

问题出在 cookie 上。如果令牌存储在 cookie 中,它将与请求一起发送给受害者,而不管请求是从哪里发送的。这意味着令牌 cookie 将被发送到 victim.com,即使发送请求的站点是 attacker.com.

现在有一个 new-ish cookie 属性 SameSite 可以防止这种情况的发生,目的是减轻 CSRF,而且还有更传统的方法来确保请求是在合法的应用来源(如同步器令牌、双重提交等)。

另请注意,如果令牌未作为 cookie 发送(但在请求 header 之类的内容中,或仅在请求 body 中),通常不需要进一步保护。虽然可能存在特殊的边缘情况,其他形式的身份验证会自动发送凭据,例如 http 基本身份验证或客户端证书,但这些很少用于人类交互的普通 Web 应用程序中。