跨源资源共享 (CORS)

转到示例

同源政策是在客户端网络应用(比如网络浏览器)上实施的安全策略,用于防止来自不同来源的资源之间发生交互。虽然这种安全措施可用于防止恶意行为,但也可能会阻止已知来源之间开展的合法交互。例如,App Engine 上托管的页面(网址为 example.appspot.com)中的脚本可能需要使用存储在 Cloud Storage 存储分区(网址为 example.storage.googleapis.com)中的资源。但是,由于浏览器会将它们视为两个不同的来源,因此不允许来自 example.appspot.com 的脚本从 example.storage.googleapis.com 提取资源。

跨源资源共享 (CORS) 规范是由万维网联盟 (W3C) 制定的,该规范旨在克服这一限制。 Cloud Storage 支持此规范,这意味着,它允许您将存储分区配置为支持 CORS。在上述示例中,您可以配置 example.storage.googleapis.com 存储分区,以便浏览器可以与来自 example.appspot.com 的脚本共享该存储分区的资源。

如需详细了解 CORS 配置元素,请参阅设置存储分区 CORS

CORS 的工作原理

CORS 请求分为两种类型:简单和预检。简单请求可以被直接启动。预检请求必须向服务器发送初步“预检”请求以获得许可,然后才可以继续发出主请求。如果满足以下任何一种情况,系统将对请求执行预检:

  • 请求使用的是 GETHEADPOST 以外的方法。
  • 请求使用的 POST 方法具有的 Content-Type 不是 text/plainapplication/x-www-form-urlencodedmultipart/form-data
  • 请求设置了自定义标头。

当浏览器向 Cloud Storage 发出简单请求时,会发生以下过程:

  1. 浏览器将 Origin 标头添加到请求中。Origin 标头包含相应资源(该资源在寻求共享另一个网域的资源,例如 Origin:http://www.example.appspot.com 网域)的来源。

  2. Cloud Storage 将请求的 HTTP 方法以及 Origin 标头的值与目标存储分区的 CORS 配置中的方法来源信息进行比较,以查看是否存在匹配项。如果存在匹配项,Cloud Storage 将在响应中包含 Access-Control-Allow-Origin 标头。Access-Control-Allow-Origin 标头包含初始请求的 Origin 标头的值。

  3. 浏览器接收响应并检查 Access-Control-Allow-Origin 值是否与原始请求中指定的网域匹配。如果它们匹配,则请求成功。如果它们不匹配,或者响应中不存在 Access-Control-Allow-Origin 标头,则请求失败。

预检请求首先执行以下步骤。如果成功,则它将执行与简单请求相同的过程:

  1. 浏览器发送一个 OPTIONS 请求(包含主请求的 Requested MethodRequested Headers)。

  2. 服务器在响应中包含目标资源允许的 HTTP 方法和标头的值。如果预检请求中的任何方法或标头值未包含在目标资源允许的方法和标头集合中,请求将失败,并且不会发送主请求。

上文是对 CORS 进行的精简介绍。要查看更完整的说明,请参阅跨源资源共享规范。

Cloud Storage CORS 支持

Cloud Storage 仅允许您在存储分区级别设置 CORS 配置。 您可以使用 gsutil 命令行工具、XML APIJSON API 为存储分区设置 CORS 配置。

不同的 Cloud Storage 端点会通过以下方式处理 CORS 请求:

  • 无论目标存储分区上采用何种 CORS 配置,JSON API 端点都允许执行 CORS 请求。
  • XML API 端点基于目标存储分区上的 CORS 配置接受 CORS 请求。
  • 向基于身份验证的浏览器下载端点 storage.cloud.google.com 发出的请求不允许 CORS 请求。请注意,Cloud Console 会为每个对象的公开网址链接提供此端点。

您可以使用以下任一 XML API 请求网址,从 Cloud Storage 获取包含 CORS 标头的响应:

storage.googleapis.com/[BUCKET_NAME]
[BUCKET_NAME].storage.googleapis.com

如需了解 XML API 请求网址,请参阅请求端点

客户端 CORS 支持

大多数浏览器使用 XMLHttpRequest 对象来发出跨域请求。XMLHttpRequest 负责插入正确的标头以及处理与服务器进行的 CORS 交互。您不必添加任何新代码即可在 Cloud Storage 存储分区上支持配置 CORS。

后续步骤