Access-Control-Allow-Credentials标头到底具有什么作用?

Nat*_*ate 144 http-headers cors

我试图了解如何使用CORS,并对Access-Control-Allow-Credentials标题的作用感到困惑.

文件

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

但我不明白"暴露"的反应意味着什么.

任何人都可以解释这个标题被设置为true(与设置为true的凭证标志一起)实际上是什么?

mon*_*sur 238

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

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

客户端代码必须withCredentialsXMLHttpRequestto 上设置属性true才能授予权限.

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

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

请注意,无论您是在进行同源请求还是跨域请求,都需要保护您的站点免受CSRF的影响(特别是如果您的请求包含cookie).

  • 只想添加一点来评论"暴露"的含义.对于GET请求,规范不需要预先飞行(额外的往返来检查服务器是否允许凭据).浏览器将不再进行预检,而是始终发出请求,如果设置了`withCredentials`则发送cookie,但是当它收到响应时,如果设置了withCredentials,它将仅在响应时将结果传递/暴露给调用javascript具有Access-Control-Allow-Credentials标头集.如果没有标题,它不会暴露响应,实际上是黑洞. (25认同)
  • 由于这是一个非常受欢迎的答案,我将添加一条更重要的信息:除了正确配置您的请求和响应标头之外,您还需要确保您的浏览器不阻止第三方Cookie,如果您希望跨源凭证请求起作用.请参见http://stackoverflow.com/a/16634887/2970321 (7认同)
  • 这是一个非常明确的答案,任何人第一次阅读它都可以理解和修复他们的代码似乎不能很好地与cookie.谢谢! (5认同)
  • @ heavyi5ide,是的,即使浏览器没有公开对客户端代码的响应,仍然会发送带有cookie的请求(对于非预先请求的请求).所以CSRF仍然会完成. (3认同)
  • 将此应用于授权标头吗? (3认同)
  • 这个答案,更具体地说是以下段落,已经过时/具有误导性:_为了减少 CORS 中 CSRF 漏洞的机会,CORS 要求服务器和客户端都确认可以在请求中包含 cookie。_ 尝试打开在此页面上浏览器的“控制台”选项卡并运行 `fetch('//example.com', {include: 'credentials', mode: 'no-cors'})`。您的浏览器将发出跨域凭据请求,无需为 CORS 配置“https://example.com”。 (2认同)