

# 使用签名 Cookie
<a name="private-content-signed-cookies"></a>

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

**Topics**
+ [决定为签名 Cookie 使用标准策略或自定义策略](#private-content-choosing-canned-custom-cookies)
+ [签名 Cookie 的工作方式](#private-content-how-signed-cookies-work)
+ [防止滥用签名 Cookie](#private-content-signed-cookie-misuse)
+ [CloudFront 何时检查签名 Cookie 中的过期日期和时间](#private-content-check-expiration-cookie)
+ [代码示例和第三方工具](#private-content-overview-sample-code-cookies)
+ [使用标准策略设置签名 Cookie](private-content-setting-signed-cookie-canned-policy.md)
+ [使用自定义策略设置签名 Cookie](private-content-setting-signed-cookie-custom-policy.md)
+ [使用 PHP 创建签名 Cookie](signed-cookies-PHP.md)

## 决定为签名 Cookie 使用标准策略或自定义策略
<a name="private-content-choosing-canned-custom-cookies"></a>

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


****  

| 说明 | 标准策略 | 自定义策略 | 
| --- | --- | --- | 
| 可对多个文件重复使用策略声明。要重复使用策略声明，您必须在 `Resource` 对象中使用通配符。有关更多信息，请参阅[在使用自定义策略的签名 Cookie 的策略声明中指定的值](private-content-setting-signed-cookie-custom-policy.md#private-content-custom-policy-statement-cookies-values)。 | 否 | 是 | 
| 可指定用户开始访问内容的日期和时间 | 否 | 是（可选） | 
| 可指定用户无法再访问内容的日期和时间 | 是 | 是 | 
| 可指定能够访问内容的用户的 IP 地址或 IP 地址范围 | 否 | 是（可选） | 

有关使用标准策略创建签名 Cookie 的信息，请参阅[使用标准策略设置签名 Cookie](private-content-setting-signed-cookie-canned-policy.md)。

有关使用自定义策略创建签名 Cookie 的信息，请参阅[使用自定义策略设置签名 Cookie](private-content-setting-signed-cookie-custom-policy.md)。

## 签名 Cookie 的工作方式
<a name="private-content-how-signed-cookies-work"></a>

下面概述了如何为签名 Cookie 配置 CloudFront，并概述了当用户提交包含签名 Cookie 的请求时 CloudFront 如何响应。

1. 在 CloudFront 分配中，指定一个或多个可信密钥组，这些密钥组包含 CloudFront 可用来验证 URL 签名的公有密钥。您可以使用相应的私有密钥对 URL 进行签名。

   有关更多信息，请参阅 [指定可以创建签名 URL 和签名 Cookie 的签署人](private-content-trusted-signers.md)。

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

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

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

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

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

1. 用户请求文件。

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

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

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

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

## 防止滥用签名 Cookie
<a name="private-content-signed-cookie-misuse"></a>

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

为帮助防止此类攻击，请执行以下操作：
+ 排除 `Expires` 和 `Max-Age` Cookie 属性，以便 `Set-Cookie` 标头创建会话 Cookie。当用户关闭浏览器时，系统会自动删除会话 Cookie，这降低了其他人非法访问内容的可能性。
+ 包括 `Secure` 属性，以便在查看器将 Cookie 包含在请求中时对 Cookie 进行加密。
+ 如果可能，请使用自定义策略并包含查看器的 IP 地址。
+ 在 `CloudFront-Expires` 属性中，根据您希望用户对内容拥有访问权限的时间长度指定最短合理过期时间。

## CloudFront 何时检查签名 Cookie 中的过期日期和时间
<a name="private-content-check-expiration-cookie"></a>

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

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

## 代码示例和第三方工具
<a name="private-content-overview-sample-code-cookies"></a>

私有内容的代码示例仅显示如何为签名 URL 创建签名。不过，为签名 Cookie 创建签名的过程非常相似，因此代码示例中的很多内容仍然有用。有关更多信息，请参阅以下主题：
+ [使用 Perl 创建 URL 签名](CreateURLPerl.md)
+ [使用 PHP 创建 URL 签名](CreateURL_PHP.md)
+ [使用 C\$1 和 .NET Framework 创建 URL 签名](CreateSignatureInCSharp.md)
+ [使用 Java 创建 URL 签名](CFPrivateDistJavaDevelopment.md)