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

帮助我们改进Amazon SDK for JavaScript版本 3 (V3) 文档,方法是使用反馈链接,或者在上创建议题或拉取请求GitHub.

这些区域有:Amazon SDK for JavaScriptV3 API 参考指南详细描述了Amazon SDK for JavaScript版本 3 (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。在这种情况下,CORS 仍用于 Amazon S3 以外的服务。

为 Amazon S3 存储桶配置 CORS

您可以配置 Amazon S3 存储桶,使其使用 Amazon S3 控制台中的 CORS。

如果你正在配置 CORSAmazonWeb 服务管理控制台,您必须使用 JSON 来创建 CORS 配置。新的AmazonWeb 服务管理控制台仅支持 JSON CORS 配置。

重要

在新的AmazonWeb 服务管理控制台,CORS 配置必须是 JSON。

  1. 在Amazon在 Web 服务管理控制台中,打开 Amazon S3 控制台,找到要配置的存储桶并选中其复选框。

  2. 在打开的窗格中,选择Permissions (权限).

  3. 在存储库的许可选项卡上,选择CORS 配置.

  4. CORS 配置编辑器,然后选择Save(保存).

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

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

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

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

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

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以允许开发工具包读取从 Amazon S3 返回的响应标头。例如,请阅读ETag标题来自PUT或者分段上传,你需要包含ExposeHeader在配置中使用的标签,如上一个示例中所示。开发工具包只能访问通过 CORS 配置公开的标头。如果您在对象上设置元数据,则将值作为标头返回并带有 x-amz-meta- 前缀,例如 x-amz-meta-my-custom-header,并且也必须通过相同的方式公开。