为什么不在跨源上发送 XSRF 令牌?

Why XSRF token is not being sent on cross-origin?

这是 github 上 Angularjs 1.6.4 中文件 http.js 的片段:

var xsrfValue = urlIsSameOrigin(config.url)
    ? $$cookieReader()[config.xsrfCookieName || defaults.xsrfCookieName]
    : undefined;
if (xsrfValue) {
    reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;
}

为什么仅当请求来自同一来源时才包含 XSRF 令牌?如果 Restful 后端与前端位于不同的主机上怎么办,难道不应该使用 XSRF 吗?

在这种情况下,XSRF 保护的工作原理是将 config.xsrfHeaderName header 中收到的令牌与作为 cookie config.xsrfCookieName 收到的令牌进行比较(参见 "double posting" 针对 xsrf 的保护). cookie 无论如何都不会发送到其他来源,因此发送 header.

没有意义

在这种情况下,另一个来源大概使用不依赖于浏览器自动添加到请求中的东西(即 cookie)的身份验证,但可能像大多数 API 一样基于令牌。在这种情况下,它不容易受到 xsrf 的攻击。