跨源资源共享 (CORS) - Amazon SDK for JavaScript
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

我们已宣布即将终止对 Amazon SDK for JavaScript v2 的支持。建议您迁移到 Amazon SDK for JavaScript v3。有关日期、其他详细信息以及如何迁移的信息,请参阅链接的公告。

跨源资源共享 (CORS)

跨源资源共享(即 CORS)是一项现代 Web 浏览器的安全功能。它使得 Web 浏览器可以协商哪些域能够发出对外部网站或服务的请求。在使用 Amazon SDK for JavaScript 开发浏览器应用程序时,CORS 是一个重要的考虑因素,因为对资源的大部分请求发送到外部域,例如 Web 服务的端点。如果您的 JavaScript 环境实施 CORS 安全性,则必须对该服务配置 CORS。

CORS 根据以下条件,确定是否允许跨源请求中的资源共享:

  • 发出请求的特定域

  • 发出的 HTTP 请求的类型(GET、PUT、POST、DELETE 等等)

CORS 工作原理

在最简单的情况下,浏览器脚本从其他域中的服务器发出对某个资源的 GET 请求。根据该服务器的 CORS 配置,如果请求来自已授权提交 GET 请求的域,则跨来源服务器通过返回请求的资源做出响应。

如果请求域或者 HTTP 请求的类型未获得授权,则将拒绝请求。但是,CORS 实现了在实际提交请求之前进行预检。在这种情况下将提交预检请求,在其中发送 OPTIONS 访问请求操作。如果跨来源服务器的 CORS 配置授予对请求域的访问权限,则服务器发送回预检响应,其中列出请求域可以对所请求资源发出的所有 HTTP 请求类型。

CORS 请求的流程流

是否需要 CORS 配置

Amazon S3 桶需要 CORS 配置,然后才能在桶上执行操作。在某些 JavaScript 环境中,CORS 可能未实施,因此不需要配置 CORS。例如,如果您在 Amazon S3 桶中托管应用程序并访问 *.s3.amazonaws.com 或某个其它特定端点的资源,您的请求不会访问外部域。因此,此配置不需要 CORS。在这种情况下,Amazon S3 之外的服务仍使用 CORS。

为 Amazon S3 桶配置 CORS

您可以在 Amazon S3 控制台中配置 Amazon S3 桶,以使用 CORS。

  1. 在 Amazon S3 控制台中,选择您要编辑的桶。

  2. 选择权限选项卡,然后向下滚动到跨源资源共享(CORS)面板。

    Amazon S3 中的 CORS 配置编辑器,用于设置桶的 CORS 配置
  3. CORS 配置编辑器中,选择编辑,键入您的 CORS 配置,然后选择保存

CORS 配置是一个 XML 文件,在 <CORSRule> 中包含了一系列规则。一个配置最多可以有 100 个规则。规则由以下标签之一定义:

  • <AllowedOrigin>,指定您允许发出跨域请求的域源。

  • <AllowedMethod>,指定您允许在跨域请求中使用的请求类型(GET、PUT、POST、DELETE、HEAD)。

  • <AllowedHeader>,指定预检请求中允许的标头。

有关配置示例,请参阅《Amazon Simple Storage Service 用户指南》中的如何在我的桶上配置 CORS?

CORS 配置示例

以下 CORS 配置示例允许用户从域 example.org 查看、添加、删除或更新存储桶中的对象,不过建议您将 <AllowedOrigin> 的范围限定为您网站的域。您可以指定 "*" 以允许任意源。

重要

在新的 S3 控制台中,CORS 配置必须是 JSON。

XML
<?xml version="1.0" encoding="UTF-8"?> <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <CORSRule> <AllowedOrigin>https://example.org</AllowedOrigin> <AllowedMethod>HEAD</AllowedMethod> <AllowedMethod>GET</AllowedMethod> <AllowedMethod>PUT</AllowedMethod> <AllowedMethod>POST</AllowedMethod> <AllowedMethod>DELETE</AllowedMethod> <AllowedHeader>*</AllowedHeader> <ExposeHeader>ETag</ExposeHeader> <ExposeHeader>x-amz-meta-custom-header</ExposeHeader> </CORSRule> </CORSConfiguration>
JSON
[ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "HEAD", "GET", "PUT", "POST", "DELETE" ], "AllowedOrigins": [ "https://www.example.org" ], "ExposeHeaders": [ "ETag", "x-amz-meta-custom-header"] } ]

此配置不授权用户在存储桶上执行操作。它使浏览器的安全模型允许对 Amazon S3 的请求。必须通过存储桶权限或 IAM 角色权限来配置权限。

您可以使用 ExposeHeader,让 SDK 读取从 Amazon S3 返回的响应标头。例如,如果您希望从 PUT 或分段上传读取 ETag 标头,则需要在配置中包括 ExposeHeader 标签,如上例中所示。SDK 只能访问通过 CORS 配置公开的标头。如果您在对象上设置元数据,则将值作为标头返回并带有 x-amz-meta- 前缀,例如 x-amz-meta-my-custom-header,并且也必须通过相同的方式公开。