

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用已簽署 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 的限制，例如 Cookie 的有效時間。您可以使用標準政策或自訂政策。下表比較了標準和自訂政策：


****  

| 描述 | 標準政策 | 自訂政策 | 
| --- | --- | --- | 
| 您可以重複使用多個檔案的政策聲明。要重複使用政策聲明，您必須在 `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` 的屬性，以便 `Set-Cookie` 標頭建立工作階段 Cookie。工作階段 Cookie 會在使用者關閉瀏覽器時自動刪除，以降低有人未經授權存取您的內容的可能性。
+ 包含 `Secure` 屬性，以便檢視器在請求中包含該 Cookie 時，將對其進行加密。
+ 如果可能，請使用自訂政策，並包含檢視器的 IP 位址。
+ 在 `CloudFront-Expires` 屬性中，根據您希望使用者訪問您的內容的時間長度，指定最短的合理到期時間。

## CloudFront 何時檢查已簽署 Cookie 中的到期日期和時間
<a name="private-content-check-expiration-cookie"></a>

若要判斷已簽署的 Cookie 是否仍然有效，CloudFront 在 HTTP 請求時會檢查 Cookie 中的到期日期和時間。如果用戶端在到期前一刻才開始下載大型檔案，則即使在下載期間過期了，下載也應該要完成。如果 TCP 連線中斷並且用戶端在到期時間過後嘗試重新啟動下載，則下載將失敗。

如果用戶端使用範圍 GET 以取得較小型的檔案，則到期時間過後發生的任何 GET 請求都將失敗。如需範圍 GET 的詳細資訊，請參閱 [CloudFront 如何處理物件的部分請求 (範圍 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 架構建立 URL 簽章](CreateSignatureInCSharp.md)
+ [使用 Java 建立 URL 簽章](CFPrivateDistJavaDevelopment.md)