提问人:Nate 提问时间:7/11/2014 最后编辑:AbdullNate 更新时间:1/16/2018 访问量:185351
Access-Control-Allow-Credentials 标头究竟有什么作用?
What exactly does the Access-Control-Allow-Credentials header do?
问:
我正在尝试了解如何使用 CORS,但对标头的作用感到困惑。Access-Control-Allow-Credentials
文档说
指示是否可以公开对请求的响应 当 credentials 标志为 true 时。
但我不明白“暴露”的回应是什么意思。
谁能解释一下这个标头被设置为true(与被设置为true的凭据标志一起)实际上做了什么?
答:
412赞
monsur
7/11/2014
#1
默认情况下,CORS 在跨域请求中不包含 Cookie。这与其他跨域技术(如 JSON-P)不同。JSON-P 始终在请求中包含 cookie,这种行为可能会导致一类称为跨站点请求伪造或 CSRF 的漏洞。
为了减少 CORS 中出现 CSRF 漏洞的可能性,CORS 要求服务器和客户端都承认在请求中包含 cookie 是可以的。这样做可以使 cookie 成为一种主动决策,而不是在没有任何控制的情况下被动地发生。
客户端代码必须在 to 上设置属性才能授予权限。withCredentials
XMLHttpRequest
true
但是,仅此标头是不够的。服务器必须使用标头进行响应。使用此标头进行响应意味着服务器允许在跨域请求中包含 Cookie(或其他用户凭据)。Access-Control-Allow-Credentials
true
如果您希望跨域凭据请求正常工作,您还需要确保您的浏览器没有阻止第三方 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 标头?
下一个:如何在本地删除分支?
评论