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

文档上说

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

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

有人能解释一下这个头被设置为真(连同凭据标志被设置为真)实际上是做什么的吗?


当前回答

缺省情况下,CORS不包括跨源请求的cookie。这与其他交叉起源技术(如JSON-P)不同。JSON-P总是在请求中包含cookie,这种行为可能导致一类称为跨站请求伪造(cross-site request伪造,CSRF)的漏洞。

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

客户端代码必须将XMLHttpRequest上的withCredentials属性设置为true,以便给予权限。

然而,光有这个标头是不够的。服务器必须响应Access-Control-Allow-Credentials报头。将此报头响应为true意味着服务器允许跨源请求包含cookie(或其他用户凭证)。

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

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

其他回答

缺省情况下,CORS不包括跨源请求的cookie。这与其他交叉起源技术(如JSON-P)不同。JSON-P总是在请求中包含cookie,这种行为可能导致一类称为跨站请求伪造(cross-site request伪造,CSRF)的漏洞。

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

客户端代码必须将XMLHttpRequest上的withCredentials属性设置为true,以便给予权限。

然而,光有这个标头是不够的。服务器必须响应Access-Control-Allow-Credentials报头。将此报头响应为true意味着服务器允许跨源请求包含cookie(或其他用户凭证)。

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

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