使用已簽署的 Cookie - Amazon CloudFront

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

使用已簽署的 Cookie

CloudFront 簽章 Cookie 可讓您控制當您不想變更目前URLs或想要提供對多個限制檔案的存取權時,誰可以存取您的內容,例如網站訂閱者區域中的所有檔案。本主題說明使用已簽章的 Cookie 時的注意事項,並介紹如何使用標準和自訂政策設定已簽章的 Cookie。

決定使用已簽章 Cookie 的固定或自訂政策

當您建立已簽署的 Cookie 時,您會以指定已簽署 Cookie 限制的JSON格式撰寫政策陳述式,例如 Cookie 的有效期限。您可以使用標準政策或自訂政策。下表比較了標準和自訂政策:

描述 標準政策 自訂政策

您可以重複使用多個檔案的政策聲明。要重複使用政策聲明,您必須在 Resource 物件中使用萬用字元。如需詳細資訊,請參閱 您在政策陳述式中為已簽章 Cookie 的自訂政策指定的值)。

您可以指定使用者可以開始存取您的內容的日期和時間

是 (選用)

您可以指定使用者無法再存取您的內容的日期和時間

您可以指定可以存取您的內容的使用者的 IP 地址或 IP 地址範圍

是 (選用)

如需有關使用標準政策建立已簽章的 Cookie 的詳細資訊,請參閱 使用固定政策設定已簽署 Cookie

如需有關使用自訂政策建立已簽章的 Cookie 的詳細資訊,請參閱 使用自訂政策設定已簽署 Cookie

已簽署 Cookie 的工作方式

以下是您如何 CloudFront 設定已簽署 Cookie 的概觀,以及使用者提交包含已簽署 Cookie 的請求時如何 CloudFront 回應。

  1. 在 CloudFront 分發中,指定一或多個信任的金鑰群組,其中包含 CloudFront 可用於驗證URL簽章的公有金鑰。您可以使用對應的私有金鑰來簽署 URLs。

    如需詳細資訊,請參閱指定可以建立已簽署URLs和已簽署 Cookie 的簽署者

  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 參數,請指定可能的最精確值,以降低具有相同根網域名稱之人員的存取可能性。例如,app.example.com 優於 example.com,尤其是當您無法控制 example.com 時。這有助於防止他人從 www.example.com 存取您的內容。

要協助避免發生這種類型的攻擊,請執行下列動作:

  • 排除 ExpiresMax-Age 的屬性,以便 Set-Cookie 標頭建立工作階段 Cookie。工作階段 Cookie 會在使用者關閉瀏覽器時自動刪除,以降低有人未經授權存取您的內容的可能性。

  • 包含 Secure 屬性,以便檢視器在請求中包含該 Cookie 時,將對其進行加密。

  • 如果可能,請使用自訂政策,並包含檢視器的 IP 地址。

  • CloudFront-Expires 屬性中,根據您希望使用者訪問您的內容的時間長度,指定最短的合理到期時間。

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

如果用戶端使用 Range GETs 取得較小的檔案,在過期時間過後發生的任何GET請求都會失敗。如需範圍 的詳細資訊GETs,請參閱 如何 CloudFront 處理物件 (範圍GETs) 的部分要求

範例程式碼和第三方工具

私有內容的範例程式碼只會顯示如何建立已簽署 的簽章URLs。但是,針對已簽章的 Cookie 建立簽章的程序非常類似,因此大部分範本程式碼仍然相關。如需詳細資訊,請參閱下列主題: