Amazon CloudFront
开发人员指南 (API 版本 2016-09-29)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用签名 Cookie

当您不希望更改当前 URL,或者希望提供对多个限制文件(例如,网站订户区域中的所有文件)的访问权限时,可使用 CloudFront 签名 Cookie 控制能够访问内容的人员。本主题介绍了使用签名 Cookie 时的注意事项,并介绍了如何使用标准策略和自定义策略设置签名 Cookie。

为签名 Cookie 选择标准策略或自定义策略

创建签名 Cookie 时,以 JSON 格式编写指定签名 Cookie 限制的策略声明,例如,URL 的有效期。可以使用标准策略或自定义策略。下表比较了标准策略和自定义策略:

描述 标准策略 自定义策略

可对多个文件重复使用策略声明。要重复使用策略声明,您必须在 Resource 对象中使用通配符。有关更多信息,请参阅 在使用自定义策略的签名 Cookie 的策略声明中指定的值。)

可指定用户开始访问内容的日期和时间

是(可选)

可指定用户无法再访问内容的日期和时间

可指定能够访问内容的用户的 IP 地址或 IP 地址范围

是(可选)

有关使用标准策略创建签名 Cookie 的信息,请参阅使用标准策略设置签名 Cookie

有关使用自定义策略创建签名 Cookie 的信息,请参阅使用自定义策略设置签名 Cookie

签名 Cookie 的工作方式

下面概述了如何为签名 Cookie 配置 CloudFront,以及在用户提交包含签名 Cookie 的请求时 CloudFront 如何响应。

  1. 在 CloudFront 分配中,您可指定一个或多个可信签署人,即,您希望其有权创建签名 URL 和签名 Cookie 的 AWS 账户。

    有关更多信息,请参阅 指定可创建签名 URL 和签名 Cookie 的 AWS 账户 (可信签署人)

  2. 您开发应用程序,以确定用户是否应对您的内容拥有访问权限,如果是,则向查看器发送三个 Set-Cookie 标头。(每个 Set-Cookie 标头只能包含一个名称值对,CloudFront 签名 Cookie 需要使用三个名称值对。) 必须先向查看器发送 Set-Cookie 标头,查看器才能请求私有内容。如果对 Cookie 设置一个较短的过期时间,您可能还需要发送另外三个 Set-Cookie 标头以响应后续请求,从而确保用户继续拥有访问权限。

    通常情况下,CloudFront 分配至少拥有两个缓存行为,一个不需要身份验证,另一个则需要。站点安全部分的错误页面包含一个指向登录页面的重定向器或链接。

    如果将分配配置为根据 Cookie 缓存文件,CloudFront 则不会基于签名 Cookie 中的属性缓存单独的文件。

  3. 用户登录您的网站,为内容付费或满足一些其他访问要求。

  4. 应用程序在响应中返回 Set-Cookie 标头,查看器存储名称值对。

  5. 用户请求文件。

    用户的浏览器或其他查看器获取第 4 步中的名称值对,并将它们添加到请求的 Cookie 标头中。这就是签名 Cookie。

  6. CloudFront 使用公有密钥验证签名 Cookie 中的签名并确认该 Cookie 未被篡改。如果签名无效,则请求将被拒绝。

    如果 Cookie 中的签名有效,CloudFront 将查看 Cookie 中的策略声明 (如果使用标准策略,则构造一个),以确认该请求仍然有效。例如,如果为 Cookie 指定了开始和结束日期及时间,CloudFront 会确认用户是否是在您希望允许访问的时间段尝试访问内容。

    如果请求满足策略声明中的要求,CloudFront 将像提供不受限制的内容那样提供内容:确定文件是否已在边缘缓存中,必要时将请求转发到源,然后向用户返回文件。

如果您在 Domain 标头中指定 Set-Cookie 参数,请尽可能指定最精确的值,以限制具有相同根域名的某些人的潜在访问。例如,apex.example.com 优于 example.com,尤其是在 example.com 不由您控制时。这有助于防止他人从 nadir.example.com 访问内容。

为帮助防止此类攻击,请执行以下操作:

  • 排除 ExpiresMax-Age Cookie 属性,以便 Set-Cookie 标头创建会话 Cookie。当用户关闭浏览器时,系统会自动删除会话 Cookie,这降低了其他人非法访问内容的可能性。

  • 包括 Secure 属性,以便在查看器将 Cookie 包含在请求中时对 Cookie 进行加密。

  • 如果可能,请使用自定义策略并包含查看器的 IP 地址。

  • CloudFront-Expires 属性中,根据您希望用户对内容拥有访问权限的时间长度指定最短合理过期时间。

为了确定签名 Cookie 是否仍然有效,CloudFront 会在发出 HTTP 请求时检查 Cookie 中的过期日期和时间。如果客户端刚好在过期时间之前开始下载大型文件,即使在下载过程中到了过期时间,该下载也应该完成。如果 TCP 连接断开,并且客户端试图在过期时间到期后重新开始下载,则下载将会失败。

如果客户端使用 Range GET 来获取较小的文件,在过期时间到期后发生的任何 GET 请求将会失败。更多有关 Range GET 的信息,请参阅 CloudFront 如何处理对象的部分请求(Range GET)

示例代码和第三方工具

私有内容的示例代码仅显示如何为签名 URL 创建签名。不过,为签名 Cookie 创建签名的过程非常相似,因此示例代码中的很多内容仍然有用。有关更多信息,请参阅以下主题:

有关支持私有内容的第三方工具的信息,包括创建签名 URL,请参阅 配置私有内容的工具和代码示例