【问题标题】:With CORS, why do servers declare which clients may trust it, instead of clients declaring what servers they trust? [duplicate]使用 CORS,为什么服务器声明哪些客户端可以信任它,而不是客户端声明它们信任哪些服务器? [复制]
【发布时间】: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:当然。但是对于跨域请求,客户端(请求)端这种隐含的信任声明显然是不够的。请求数据的站点需要确认客户端(请求者)可以将其响应呈现给正在运行的应用程序。我不明白为什么服务器会做出决定。
  • 是的,听起来很正确。

标签: html ajax cors trust


【解决方案1】:

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

例如,如果您告诉客户您有两个域,以便让您的资源被您的第二个网站使用,您并没有说我信任您作为客户。

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

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

【讨论】:

  • 问题是滥用术语“客户端”来表示“托管包含导致客户端发起请求的 JavaScript 的页面的网站”
  • 您说 CORS 实际上是为了保护被要求产生响应的服务器,而不是发出请求的客户端。但这对我来说没有意义。为什么需要 CORS? HTTP 服务器可以简单地查看谁发出了请求,然后发送2xx/3xx 状态码或(例如)401 Unauthorized。但是对于 CORS,我认为服务器无论如何都会产生响应,但带有一个标题,让客户端浏览器决定是否/如何处理响应。鉴于我的理解是正确的,CORS 如何通过简单的401 响应添加服务器保护?
  • 好的,您认为您永远不想在您拥有的 2 个不同域之间共享您的资源吗?如果是这样的话,CORS 不适合你。 CORS 可以帮助您绕过共享限制。
  • @HankyPanky:我今天一定特别密集,但我看不出你最后的评论与我之前的评论有什么关系。如果我拥有并控制两个域 A 和 B,并且 A 向 B 发出请求,那么 B 可以简单地检查请求是来自 A 还是来自其他域 X。如果请求来自 X,那么 B 会产生一个 @ 987654325@回复。如果它来自 A,它将产生积极的反应。我不明白 CORS 与它有什么关系,或者为什么需要它以便我自己的两个域可以交换数据。
  • 顺便说一句,Web 服务器不知道 AJAX 请求是从当时加载到客户端计算机上的哪个站点发出的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-09
  • 2010-09-13
  • 1970-01-01
  • 2012-12-26
  • 2011-09-05
  • 2012-03-01
  • 1970-01-01
相关资源
最近更新 更多