同源政策是在客户端网络应用(比如网络浏览器)上实施的安全策略,用于防止来自不同来源的资源之间发生交互。虽然这种安全措施可用于防止恶意行为,但也可能会阻止已知来源之间开展的合法交互。例如,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 请求分为两种类型:简单和预检。简单请求可以被直接启动。预检请求必须向服务器发送初步“预检”请求以获得许可,然后才可以继续发出主请求。如果满足以下任何一种情况,系统将对请求执行预检:
- 请求使用的是
GET
、HEAD
或POST
以外的方法。 - 请求使用的
POST
方法具有的Content-Type
不是text/plain
、application/x-www-form-urlencoded
或multipart/form-data
。 - 请求设置了自定义标头。
当浏览器向 Cloud Storage 发出简单请求时,会发生以下过程:
浏览器将
Origin
标头添加到请求中。Origin
标头包含相应资源(该资源在寻求共享另一个网域的资源,例如Origin:http://www.example.appspot.com
网域)的来源。Cloud Storage 将请求的 HTTP 方法以及
Origin
标头的值与目标存储分区的 CORS 配置中的方法和来源信息进行比较,以查看是否存在匹配。如果存在匹配,Cloud Storage 将在响应中包含Access-Control-Allow-Origin
标头。Access-Control-Allow-Origin
标头包含初始请求的Origin
标头的值。浏览器接收响应并检查
Access-Control-Allow-Origin
值是否与原始请求中指定的网域匹配。如果它们匹配,则请求成功。如果它们不匹配,或者响应中不存在Access-Control-Allow-Origin
标头,则请求失败。
预检请求首先执行以下步骤。如果成功,则它将执行与简单请求相同的过程:
浏览器发送一个
OPTIONS
请求(包含主请求的Requested Method
和Requested Headers
)。服务器在响应中包含目标资源允许的 HTTP 方法和标头的值。如果预检请求中的任何方法或标头值未包含在目标资源允许的方法和标头集合中,请求将失败,并且不会发送主请求。
上文是对 CORS 进行的精简介绍。如需查看更完整的说明,请参阅跨源资源共享规范。
Cloud Storage CORS 支持
Cloud Storage 仅允许您在存储分区级别设置 CORS 配置。您可以使用 gsutil 命令行工具、XML API 或 JSON API 为存储分区设置 CORS 配置。
如需了解为存储分区设置 CORS 配置的更多信息,请参阅配置跨源资源共享 (CORS)。要详细了解 CORS 配置元素,请参阅设置存储分区 CORS。
您可以使用以下任一 XML API 请求网址,从 Cloud Storage 获取包含 CORS 标头的响应:
storage.googleapis.com/[BUCKET_NAME]
[BUCKET_NAME].storage.googleapis.com
有关 XML API 请求网址的信息,请参阅请求端点。
客户端 CORS 支持
大多数浏览器使用 XMLHttpRequest
对象来发出跨域请求。XMLHttpRequest
负责插入正确的标头以及处理与服务器进行的 CORS 交互。您不必添加任何新代码即可在 Cloud Storage 存储分区上支持配置 CORS。