为什么在使用会话 cookie 时需要 csrf 令牌?

Why is a csrf token needed when a session cookie is used?

假设我通过 opendID 连接提供商登录并被重定向到我的回调 www.mysite.com/auth/callback。然后我创建一个 httponly cookie,其中包含一个引用我收到的令牌的 id,该 id 在 wwww.mysite.com/ 传递给浏览器。另一个站点将如何提交包含相同会话 cookie 的请求?浏览器是否只传递请求域的 cookie。那么如果www.evil.com试图向www.mysite.com/api/endpoint发出请求,会不会没有通过session cookie,使得伪造的请求无效?

我是不是漏掉了一些基本的东西??

当 Web 浏览器向不同的域发送请求时,它们会首先检查它们是否已经有该域的 cookie,如果有,然后将它们与请求一起发送。因此,如果您在 Web 应用程序上尝试向您的应用程序发送请求,它会将该请求与您的 cookie 一起发送。防伪令牌背后的想法是,即使网络浏览器发送了所有这些信息,如果令牌与您根据应用程序提交的合法请求创建的令牌不匹配,它也会失败。

如果您不希望通过跨站点请求发送您的 cookie,您可以为您的 cookie 使用 samesite 标志。在这里,您可以在 Strict 和 Lax 模式之间做出选择。在严格模式下,您永远不会通过跨站点请求发送站点 cookie,因此您无需关心发送的会话 cookie。这里的问题是,如果你从不同的站点重定向,例如,如果你在这里,并尝试去 facebook(如果 facebook 使用严格模式),你的 cookie 将不会被发送,你需要再次进行身份验证(这可能是一个烦人的功能,也可能是一个很好的功能,具体取决于您的应用程序和您的用户群)。 Lax 模式非常相似,但在这种模式下,您只会通过安全的 HTTP 动词(GET、HEAD、OPTIONS 和 TRACE)发送您的 cookie,因此您仍然可以免受 POST/PUT XSRF 攻击,并且您对 GET 请求没有烦人的行为。您可以自行决定哪一款更适合您的应用。

有关 XSRF 和同站点 cookie 的更多信息:http://arnoldcer.com/2017/03/14/cross-site-request-forgery-what-it-is-how-to-exploit-it-and-how-to-defend-against-it/