我一直在寻找具体的安全理由,说明为何添加这些原因。当我实施cors并且可以看到所有标题被返回但我无法通过javascript访问它时,这是一个WTH时刻。
答案 0 :(得分:79)
CORS以这样一种方式实现,即它不会破坏在CORS之前,同源的世界中做出的假设。
在CORS之前的世界中,客户端可以触发跨源请求(例如,通过脚本标记),但它无法读取响应头。
为了确保CORS不会破坏这一假设,CORS规范要求服务器为客户端提供显式权限以读取这些标头(通过Access-Control-Expose-Headers
标头)。这样,未经授权的CORS请求就像在CORS之前的世界中那样。
答案 1 :(得分:4)
这是一个非常好的问题。通过http://www.w3.org/TR/cors/#simple-response-header查看,您想要或不需要这样做的原因并不明显。
CORS规范非常重视你必须进行预请求握手的想法,其中客户端要求一种连接,服务器响应它允许它 - 所以这可能只是是另一个方面。
默认情况下,内容长度不允许标题,所以我遇到了同样的问题(稍后当我需要访问WebDAV并且必须修改允许的参数时)... CORS真的没有做到对我来说很有道理(对我而言)所以如果它的反复无常,那就不会让我感到惊讶。
答案 2 :(得分:1)
这是需要Access-Control-Expose-Headers的原因:
Access-Control-Expose-Headers(可选)- XMLHttpRequest 2对象具有getResponseHeader()方法,该方法返回特定响应头的值。在CORS请求期间,getResponseHeader()方法只能访问简单的响应头。简单的响应头定义如下:
如果希望客户端能够访问其他标头,则必须使用 Access-Control-Expose-Headers 标头。此标头的值是您要向客户端公开的响应标头的逗号分隔列表。
有关更多参考,请深入链接https://www.html5rocks.com/en/tutorials/cors/
编码愉快!!