【发布时间】:2017-01-07 20:42:47
【问题描述】:
Cross Origin Resource Sharing (CORS) 有一些我从未真正理解过的东西,即对于跨域 HTTP 请求,它不是客户端来决定它想要信任哪个服务器。相反,服务器声明(在Access-Control-Allow-Origin 响应标头中)一个或多个特定客户端(源)信任它。只有当服务器表示客户端信任服务器时,启用 CORS 的浏览器才会将服务器的响应传递给应用程序。这似乎是在两个 HTTP 方之间建立信任关系的相反方式。
对我来说更有意义的是类似于以下的机制:客户端声明它信任的来源列表;例如,通过<head> 中的一些虚构的<meta allow-cross-origin="https://another-site:1234"/> 元素。 (当然,浏览器必须确保这些元素是只读的,不能通过脚本删除、修改或扩充。)
我对 CORS 有什么误解?为什么客户端的可信来源声明不起作用?为什么服务器要确认哪些客户端(源)可以信任它的响应?谁实际上受到 CORS 的保护?它是保护服务器还是客户端?
(这些问题很多。我希望很清楚,我并不期待每个问题的答案,而只是指出我的基本误解的答案。)
【问题讨论】:
-
对于反对者,我希望能提示我的问题有什么问题。如果问题确实不合适,我很乐意对其进行编辑、进一步解释或撤回问题。
-
托管 JavaScript 的网站隐含声明它信任它试图通过首先从该 URL 请求数据来检索数据的网站。
-
“服务器声明(在 Access-Control-Allow-Origin 响应标头中)一个或多个特定客户端(来源)信任它” - 不,它声明它信任这些来源,而不是那个他们信任它。
-
@Quentin:当然。但是对于跨域请求,客户端(请求)端这种隐含的信任声明显然是不够的。请求数据的站点需要确认客户端(请求者)可以将其响应呈现给正在运行的应用程序。我不明白为什么服务器会做出决定。
-
是的,听起来很正确。