Access-Control-Allow-Credentials 标头究竟有什么作用?

What exactly does the Access-Control-Allow-Credentials header do?

提问人:Nate 提问时间:7/11/2014 最后编辑:AbdullNate 更新时间:1/16/2018 访问量:185351

问:

我正在尝试了解如何使用 CORS,但对标头的作用感到困惑。Access-Control-Allow-Credentials

文档

指示是否可以公开对请求的响应 当 credentials 标志为 true 时。

但我不明白“暴露”的回应是什么意思。

谁能解释一下这个标头被设置为true(与被设置为true的凭据标志一起)实际上做了什么?

http-headers cors

评论

0赞 Weishi Z 5/28/2016
xhr.withCredential 文档在客户端 developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/...
0赞 Jens Mander 7/21/2021
这不是在谈论标头,而是在谈论 xhr。如果使用其他任何内容(如 Blazor WebAssembly),则不会从该说明中获得任何好处。我仍然不知道 Access-Control-Allow-Credentials 是否与 credentials: include 相同,也不知道如何在 Blazor wasm 中设置它。

答:

412赞 monsur 7/11/2014 #1

默认情况下,CORS 在跨域请求中不包含 Cookie。这与其他跨域技术(如 JSON-P)不同。JSON-P 始终在请求中包含 cookie,这种行为可能会导致一类称为跨站点请求伪造或 CSRF 的漏洞。

为了减少 CORS 中出现 CSRF 漏洞的可能性,CORS 要求服务器和客户端都承认在请求中包含 cookie 是可以的。这样做可以使 cookie 成为一种主动决策,而不是在没有任何控制的情况下被动地发生。

客户端代码必须在 to 上设置属性才能授予权限。withCredentialsXMLHttpRequesttrue

但是,仅此标头是不够的。服务器必须使用标头进行响应。使用此标头进行响应意味着服务器允许在跨域请求中包含 Cookie(或其他用户凭据)。Access-Control-Allow-Credentialstrue

如果您希望跨域凭据请求正常工作,您还需要确保您的浏览器没有阻止第三方 Cookie

请注意,无论您是发出同源请求还是跨源请求,您都需要保护您的网站免受 CSRF 的影响(尤其是当您的请求包含 Cookie 时)。

评论

50赞 heavi5ide 5/14/2015
只想补充一点,评论一下“暴露”的含义。该规范不需要对 GET 请求进行预检(额外的往返以检查服务器是否允许凭据)。浏览器不会进行预检,而是始终发出请求,如果设置了 cookie,但当它收到响应时,如果设置了 withCredentials,则只有在响应设置了 Access-Control-Allow-Credentials 标头时,它才会将结果传递/公开给调用的 javascript。如果没有标头,则不会公开响应,从而有效地将其黑洞化。withCredentials
4赞 Pacerier 1/26/2016
@heavi5ide,是的,即使浏览器没有向客户端代码公开响应,仍会发送带 cookie 的请求(对于非预检请求)。所以 CSRF 仍然会完成。
9赞 alexw 2/18/2016
由于这是一个非常受欢迎的答案,我将添加一条更重要的信息:除了正确配置请求和响应标头外,如果您希望跨域凭据请求正常工作,您还需要确保您的浏览器不会阻止第三方 cookie。查看 stackoverflow.com/a/16634887/2970321
12赞 asgs 6/22/2016
这是一个非常明确的答案,任何第一次阅读它的人都可以理解并修复他们的代码,这些代码似乎不能很好地与cookie一起使用。谢谢!
3赞 alvaropgl 2/11/2021
将其应用于 Authorization 标头?