Access-Control-Allow-Credentials标头到底是做什么的?


167

我试图了解如何使用CORS,并对Access-Control-Allow-Credentials标头的功能感到困惑。

该文件

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

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

谁能解释将此标头设置为true(与凭据标志设置为true一起)实际上是做什么的?


Answers:


264

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

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

客户代码必须将的withCredentials属性设置XMLHttpRequesttrue,以授予权限。

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

如果您希望跨源凭据请求有效,则还需要确保浏览器不会阻止第三方cookie

请注意,无论您发出的是同源请求还是跨域请求,都需要保护您的站点免受CSRF的影响(尤其是如果您的请求包含cookie)。


1
我澄清了答案以解决您的问题。基本上,JSON-P做错了,并且安全性较低。
monsur 2014年

28
只是想对此加一点以评论“暴露”的含义。规范不需要对GET请求进行事前检查(其他往返检查服务器是否将允许凭据)。浏览器将不执行预检,而是始终发出请求,如果withCredentials设置了cookie,则发送cookie ,但是当它接收到响应时(如果设置了withCredentials),则仅在响应具有Access的情况下才将结果传递/暴露给正在调用的javascript。 -Control-Allow-Credentials标头集。如果没有头,则不会公开响应,从而使响应无效。
heavi5ide 2015年

4
@ heavi5ide,是的,即使浏览器未将响应公开给客户端代码,也仍然发送了带有cookie的请求(对于未完成的请求)。因此CSRF仍将完成。
Pacerier '16

7
由于这是一个很受欢迎的答案,因此,我将添加一条重要的信息:除了正确配置请求和响应标头之外,您还需要确保浏览器不会阻止第三方cookie。希望跨域凭据请求有效。请参阅stackoverflow.com/a/16634887/2970321
alexw

5
这个答案很明确,任何人第一次阅读它都可以理解并修复他们的代码,这些代码似乎无法与Cookie很好地配合。谢谢!
asgs 2013年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.