哪个服务器需要返回 Access-Control-Allow-Origin 标头?

Posted

技术标签:

【中文标题】哪个服务器需要返回 Access-Control-Allow-Origin 标头?【英文标题】:Which server needs to return Access-Control-Allow-Origin header? 【发布时间】:2014-07-23 23:55:57 【问题描述】:

假设我有一个 html 页面,由 example.com 提供。它向 targetServer.com 发出 javascript ajax 请求

哪个服务器需要返回 Access-Control-Allow-Origin="(something)"?

是提供原始 HTML 页面(即 example.com)的 targetServer 还是服务器?

[我知道这可能很明显,但网络上的文档似乎暗示目标服务器必须发送“example.com”的allow-origin标头但如果这是一项安全功能,恶意的 targetServer.com 不会总是提供合适的 allow-origin 标头吗?除了 example.com 之外,example.com 还会为浏览器提供允许调用的服务器列表,这有点道理]

【问题讨论】:

我真的认为另一种方式会很危险:您的站点决定它可以在跨域模式下访问哪些域。保护需要在provider端设置。 【参考方案1】:

您误解了安全问题。

CORS 的目的是防止其他网站上的 Javascript 读取您网站上的敏感信息。

因此,您的网站必须明确说明允许哪些来源读取其数据。

【讨论】:

我想我差不多明白了,但在我的现实生活中,我拥有两台服务器。如果您说哪个服务器是假定的恶意服务器,您的答案会更清楚。 @MatthewMartin:恶意服务器是试图读取数据的服务器(或者更确切地说是客户端)。 Example.com 需要发送Access-Control-Allow-Origin 标头。该值应包含“targetServer.com”【参考方案2】:

目标服务器需要设置Access-Control-Allow-Origin 标头。

CORS 旨在保护服务器免受意外的跨域请求。在 CORS 存在之前的世界中,浏览器的 same-origin policy 保护服务器免受跨域请求的影响。如果 CORS 自动允许所有服务器使用,那么同源合约就会中断,服务器会收到意外请求。为了防止这种情况发生,CORS 规范作者让服务器负责规定允许哪些类型的跨域请求。

服务器不仅可以使用 Access-Control-Allow-Origin 标头,还可以使用 Access-Control-Allow-CredentialsAccess-Control-Allow-MethodsAccess-Control-Allow-HeadersAccess-Control-Expose-Headers 标头来执行此操作。这些不同的标头为服务器提供了对其 CORS 行为配置的细粒度控制。

因此,在您的示例中,恶意服务器可以设置这些标头,但标头不会自行执行任何操作。客户端需要做出有意识的决定才能向恶意服务器发送请求。实际上,客户端本身就是恶意的。

【讨论】:

以上是关于哪个服务器需要返回 Access-Control-Allow-Origin 标头?的主要内容,如果未能解决你的问题,请参考以下文章

哪个服务器需要返回 Access-Control-Allow-Origin 标头?

[Doc]MongoDB用户创建与启用access-control

Spring Security(三十):9.5 Access-Control (Authorization) in Spring Security

大厂面试冲刺,Java“实战”问题三连,你碰到了哪个?

axios 跨域请求允许带cookie,则服务器Access-Control-Allow-Origin应设置为具体域名,否则请求无法获得返回数据

使用 Spring Framework 为 OPTIONS 请求启用 CORS