为什么需要Access-Control-Expose-Headers?

105

我正在寻找为什么添加这个功能的具体安全原因。 当我正在实现 CORS 并且可以看到返回所有标头,但是无法通过 JavaScript 访问它们时,这是一种非常困惑的时刻。

3个回答

124

CORS的实现方式不会破坏在CORS之前,仅支持同源请求的假设。

在CORS之前的世界中,客户端可以通过脚本标签触发跨源请求,但它无法读取响应头。

为了确保CORS不会破坏这个假设,CORS规范要求服务器明确授权客户端读取这些头信息(通过Access-Control-Expose-Headers头)。这样,未经授权的CORS请求的行为就像在CORS世界以前一样。


2
我认为这个链接是这个答案的一个很好的例子: https://fetch.spec.whatwg.org/#example-cors-with-response-header - yusong
8
换句话说,“Access-Control-Expose-Headers”并不是用于安全性,而是为了兼容性?我们没有利用“Access-Control-Expose-Headers”来防范攻击? - DavidS
我发现 Access-Control-Expose-Headers 只在第一个请求中返回,相同CORS来源的连续请求不再获取它。你能帮我了解为什么吗? - Kanagavelu Sugumar

18
以下是为什么需要Access-Control-Expose-Headers的原因:
Access-Control-Expose-Headers(可选)-XMLHttpRequest 2对象具有getResponseHeader()方法,该方法返回特定响应标头的值。在CORS请求期间,getResponseHeader()方法只能访问简单响应标头。简单响应标头定义如下: • Cache-Control • Content-Language • Content-Type • Expires • Last-Modified • Pragma
如果您希望客户端能够访问其他标头,则必须使用Access-Control-Expose-Headers标头。该标头的值是要公开向客户端公开的响应标头的逗号分隔列表。
更多参考请访问链接https://www.html5rocks.com/en/tutorials/cors/ 愉快的编码!!

另外还有Content-Length,请参见https://developer.mozilla.org/en-US/docs/Glossary/CORS-safelisted_response_header。 - diachedelic

5

这是一个非常好的问题。浏览http://www.w3.org/TR/cors/#simple-response-header,并不明显为什么你想要或需要这样做。

CORS规范非常重视客户端和服务器之间进行预请求握手的概念,客户端请求连接类型,服务器响应允许连接类型,所以这可能只是其中的另一个方面。

默认情况下,Content-Length不是允许的标头,所以我遇到了同样的问题(后来需要访问WebDAV并需要修改允许的参数)... 对我来说,CORS一开始就没有多大意义,所以如果其中的大片内容是任性的,我也不会感到惊讶。


4
CORS 看起来有些难以捉摸,这正是因为规范的作者们认真思考过它。CORS 必须允许跨域请求,同时仍然保护浏览器的同源策略。需要平衡这两个(有时相互对立的)因素,这使得 CORS 规范难以理解。 - monsur
1
这个推荐链接是我这个月以来收到的最有用的指针。我知道Access-Control-Allow-Headers,但没有考虑过Access-Control-Expose-Headers,并且不明白为什么我的“Links”头部无法传递到我的Backbone Collection中。真是惊人。 - mcdave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接