使用CORS,为什么服务器会声明哪些客户端可以信任它,而不是客户端声明他们信任的服务器?

问题描述:

关于Cross Origin Resource Sharing (CORS)有一些我从来没有真正理解的东西,也就是说,对于一个跨源HTTP请求,它不是客户端来决定它想要信任的服务器。相反,服务器声明(在Access-Control-Allow-Origin响应标头中)一个或多个特定客户(源)信任它。如果服务器说客户端信任服务器,启用CORS的浏览器只会将服务器的响应传递给应用程序。这似乎是在两个HTTP方之间建立信任关系的反向方式。使用CORS,为什么服务器会声明哪些客户端可以信任它,而不是客户端声明他们信任的服务器?

对我来说更有意义的机制是类似于以下的机制:客户端声明它所信任的源的列表;例如,通过<head>中的一些虚构的<meta allow-cross-origin="https://another-site:1234"/>元素。 (当然,浏览器必须确保这些元素是只读的,不能通过脚本进行删除,修改或增强。)

我对CORS有什么误解?为什么可信赖来源的客户端声明不起作用?为什么服务器需要确认哪些客户端(源)可以信任其响应?谁实际上受CORS保护谁?它是否保护服务器或客户端?

(这是一个很大的问题。我希望这是清楚的,我没想到的答案,每一种,而只是指出我的根本误解的答案。)

+0

对于这个downvoter,我会很感激提示我的问题有什么问题。我很高兴对它进行编辑,进一步解释,或者如果这个问题确实不合适,请将其撤回。 – stakx

+1

托管JavaScript的网站隐式声明,它首先通过从该URL请求数据来信任它试图从中检索数据的网站。 – Quentin

+1

“服务器声明(在Access-Control-Allow-Origin响应标头中)一个或多个特定客户(源)信任它” - 不,它声明它信任那些起源,而不是它们信任它。 – Quentin

客户无关用它。使用CORS标头,您可以告诉客户端我信任哪些其他服务器。那些可以分享您的资源和客户端不会介意。

例如,如果您有两个域名告诉客户,所以让您的资源被您的第二个网站使用,您不会说我相信您是客户。

所以你保护服务器,而不是客户端。您不希望AJAX API端点可以通过世界上任何地方托管的脚本访问。

客户没有任何收获/失去。它只是保护服务器,因为使用AJAX的所有URL对任何人都清晰可见,如果没有这种保护,任何人都可以继续使用API​​运行其前端,只有服务器不得不从此丢失,因此他们可以决定谁可以使用他们的资源。

+0

问题在于滥用术语“客户端”意思是“托管包含导致客户端发起请求的JavaScript的页面的网站” – Quentin

+0

您在说CORS实际上是为了保护要求产生响应的服务器,而不是提出请求的客户。但是这对我没有意义。为什么会需要CORS? HTTP服务器可以简单地查看谁发出请求,然后发送'2xx' /'3xx'状态码或(例如)'401 Unauthorized'。但是对于CORS,我认为服务器无论如何都会产生一个响应,但是头部可以让客户端浏览器决定是否/如何处理响应。鉴于我的理解是正确的,CORS如何通过简单的'401'响应添加服务器保护? – stakx

+0

好,所以你不认为你可能想分享你拥有的两个不同域名之间的资源?如果那是CORS不适合你的情况。 CORS有助于在您打算绕过绕过共享限制时。 –