既定ポリシーを使用して署名付き Cookie を設定する
既定ポリシーを使用して署名付き Cookie を設定するには、以下のステップを実行します。署名を作成するには、「既定ポリシーを使用する署名付き Cookie の署名を作成する」を参照してください。
既定ポリシーを使用して署名付き Cookie を設定するには
-
.NET または Java を使用して署名付き Cookie を作成しており、キーペアのプライベートキーをデフォルトの .pem 形式から .NET または Java 対応の形式に変更していない場合は、それを変換します。詳細については、「プライベートキーの形式を変更する (.NET および Java のみ)」を参照してください。
-
承認されたビューワーに 3 つの
Set-Cookie
ヘッダーを送信するアプリケーションをプログラムします。各Set-Cookie
ヘッダーには名前と値のペアを 1 つだけ含めることができ、CloudFront 署名付き Cookie では 3 つの名前と値のペアが必要であるため、3 つのSet-Cookie
ヘッダーが必要です。名前と値のペアは、CloudFront-Expires
、CloudFront-Signature
、およびCloudFront-Key-Pair-Id
です。アクセスを制御するファイルに対してユーザーが最初のリクエストを行う前に、値がビューワーに存在している必要があります。注記
一般的に、
Expires
属性とMax-Age
属性を除外することをお勧めします。これらの属性を除外すると、ユーザーがブラウザを閉じたときに、ブラウザで Cookie が削除されるため、ユーザーがコンテンツに不正アクセスする可能性が低くなります。詳細については、「署名付き Cookie の悪用を防止する」を参照してください。Cookie の属性の名前では、大文字と小文字が区別されます。
改行は、属性を判読しやすくするためにのみ含まれています。
Set-Cookie: CloudFront-Expires=
date and time in Unix time format (in seconds) and Coordinated Universal Time (UTC)
; Domain=optional domain name
; Path=/optional directory path
; Secure; HttpOnly Set-Cookie: CloudFront-Signature=hashed and signed version of the policy statement
; Domain=optional domain name
; Path=/optional directory path
; Secure; HttpOnly Set-Cookie: CloudFront-Key-Pair-Id=public key ID for the CloudFront public key whose corresponding private key you're using to generate the signature
; Domain=optional domain name
; Path=/optional directory path
; Secure; HttpOnly- (オプション)
Domain
-
リクエストされたファイルのドメイン名。
Domain
属性を指定しない場合、デフォルト値は URL のドメイン名で、指定されたドメイン名にのみ適用され、サブドメインには適用されません。Domain
属性を指定する場合、サブドメインにも適用されます。ドメイン名の先頭のドット (例えば、Domain=.example.com
) はオプションです。さらに、Domain
属性を指定する場合は、URL のドメイン名とDomain
属性の値が一致している必要があります。CloudFront がディストリビューションに割り当てたドメイン名 (d111111abcdef8.cloudfront.net など) を指定することはできますが、*.cloudfront.net をドメイン名として指定することはできません。
URL で代替ドメイン名 (example.com など) を使用する場合は、
Domain
属性を指定するかどうかにかかわらず、代替ドメイン名をディストリビューションに追加する必要があります。詳細については、トピック「ディストリビューション設定リファレンス」の「代替ドメイン名 (CNAME)」を参照してください。 - (オプション)
Path
-
リクエストされたファイルのパス。
Path
属性を指定しない場合、デフォルト値は URL のパスです。 Secure
-
リクエストを送信する前に、ビューワーが Cookie を暗号化することを要求します。Cookie の属性を中間者攻撃から保護するために、HTTPS 接続で
Set-Cookie
ヘッダーを送信することをお勧めします。 HttpOnly
-
ブラウザ (サポートされている場合) が Cookie 値とどのようにやり取りするかを定義します。
HttpOnly
では、Cookie 値は JavaScript からアクセスできません。この予防策は、クロスサイトスクリプティング (XSS) 攻撃の軽減に役立ちます。詳細については、「HTTP Cookie の使用」を参照してください。 CloudFront-Expires
-
有効期限切れ日時を Unix 時間形式 (秒単位) および協定世界時 (UTC) で指定します。たとえば、UTC の 2013 年 1 月 1 日午前 10 時 00 分は、Unix 時間形式の 1357034400 に変換されます。エポック時間を使用するには、日付に 2147483647 (2038 年 1 月 19 日 03:14:07 UTC) より前の 32 ビット整数を使用します。UTC の詳細については、RFC 3339, Date and Time on the Internet: Timestamps (https://tools.ietf.org/html/rfc3339
) を参照してください。 CloudFront-Signature
-
ハッシュ化され、署名された base64 エンコードバージョンの JSON ポリシーステートメント。詳細については、「既定ポリシーを使用する署名付き Cookie の署名を作成する」を参照してください。
CloudFront-Key-Pair-Id
-
CloudFront パブリックキーの ID (
K2JCJMDEHXQW5F
など)。パブリックキー ID は、署名付き URL の検証に使用するパブリックキーを CloudFront に通知します。CloudFront は、署名内の情報をポリシーステートメント内の情報と比較して、URL が改ざんされていないことを確認します。このパブリックキーは、ディストリビューションの信頼された署名者であるキーグループに属している必要があります。詳細については、「署名付き URL と署名付き Cookie を作成できる署名者を指定する」を参照してください。
- (オプション)
以下は、ファイルの URL のディストリビューションに関連付けられたドメイン名を使用する場合の、1 つの署名付き Cookie の Set-Cookie
ヘッダーの例です。
Set-Cookie: CloudFront-Expires=1426500000; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly Set-Cookie: CloudFront-Signature=yXrSIgyQoeE4FBI4eMKF6ho~CA8_; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=d111111abcdef8.cloudfront.net; Path=/images/*; Secure; HttpOnly
以下は、ファイルの URL に代替ドメイン名 example.org を使用している場合の、1 つの署名付き Cookie の Set-Cookie
ヘッダーの例です。
Set-Cookie: CloudFront-Expires=1426500000; Domain=example.org; Path=/images/*; Secure; HttpOnly Set-Cookie: CloudFront-Signature=yXrSIgyQoeE4FBI4eMKF6ho~CA8_; Domain=example.org; Path=/images/*; Secure; HttpOnly Set-Cookie: CloudFront-Key-Pair-Id=K2JCJMDEHXQW5F; Domain=example.org; Path=/images/*; Secure; HttpOnly
URL で代替ドメイン名 (example.com など) を使用する場合は、Domain
属性を指定するかどうかにかかわらず、代替ドメイン名をディストリビューションに追加する必要があります。詳細については、トピック「ディストリビューション設定リファレンス」の「代替ドメイン名 (CNAME)」を参照してください。
既定ポリシーを使用する署名付き Cookie の署名を作成する
既定ポリシーを使用する署名付き Cookie の署名を作成するには、次の手順を実行します。
既定ポリシーを使用する署名付き Cookie のポリシーステートメントを作成する
既定ポリシーを使用する署名付き Cookie を設定した場合、CloudFront-Signature
属性は、ポリシーステートメントのハッシュ化および署名されたバージョンです。カスタムポリシーを使用する署名付き Cookie とは異なり、既定ポリシーを使用する署名付き Cookie では、Set-Cookie
ヘッダーにポリシーステートメントを含めません。ポリシーステートメントを作成するには、以下の手順を実行します。
既定ポリシーを使用する署名付き Cookie のポリシーステートメントを作成するには
-
以下の JSON 形式および UTF-8 文字エンコードを使用してポリシーステートメントを構築します。すべての句読点および他のリテラル値を、指定されたとおりに正確に含めます。
Resource
およびDateLessThan
パラメータの詳細については、「署名付き Cookie の既定ポリシーのポリシーステートメントで指定する値」を参照してください。{ "Statement": [ { "Resource": "base URL or stream name", "Condition": { "DateLessThan": { "AWS:EpochTime": ending date and time in Unix time format and UTC } } } ] }
-
ポリシーステートメントからすべての空白 (タブと改行文字を含む) を削除します。アプリケーションコード内の文字列にエスケープ文字を含めることが必要になる場合があります。
署名付き Cookie の既定ポリシーのポリシーステートメントで指定する値
既定ポリシーのポリシーステートメントを作成する場合、以下の値を指定します。
- リソース
-
クエリ文字列 (存在する場合) を含むベース URL。以下に例を示します。
https://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes
Resource
の日付形式は 1 つだけ指定できます。次の点に注意してください。
-
プロトコル – 値は
http://
またはhttps://
で始まっている必要があります。 -
クエリ文字列パラメータ – クエリ文字列パラメータがない場合は、疑問符を省略します。
-
代替ドメイン名 – URL で代替ドメイン名 (CNAME) を指定する場合は、ウェブページまたはアプリケーション内のファイルを参照するときに代替ドメイン名を指定する必要があります。ファイルの Amazon S3 URL を指定しないでください。
-
- DateLessThan
-
URL の有効期限切れ日時。Unix 時間形式 (秒単位) および協定世界時 (UTC) で指定します。値を引用符で囲まないでください。
たとえば、UTC の 2015 年 3 月 16 日午前 10 時 00 分は、UNIX 時間形式の 1426500000 に変換されます。
この値は、
CloudFront-Expires
ヘッダーのSet-Cookie
属性の値と一致する必要があります。値を引用符で囲まないでください。詳細については、「CloudFront が署名付き Cookie の有効期限切れ日時を確認するタイミング」を参照してください。
既定ポリシーのポリシーステートメントの例
署名付き Cookie 内で以下のポリシーステートメントの例を使用すると、ユーザーは、UTC の 2015 年 3 月 16 日午前 10 時 00 分までファイル https://d111111abcdef8.cloudfront.net/horizon.jpg
にアクセスできます。
{ "Statement": [ { "Resource": "https://d111111abcdef8.cloudfront.net/horizon.jpg?size=large&license=yes", "Condition": { "DateLessThan": { "AWS:EpochTime": 1426500000 } } } ] }
既定ポリシーを使用する署名付き Cookie の署名を作成するためのポリシーステートメントに署名する
CloudFront-Signature
ヘッダーの Set-Cookie
属性の値を作成するには、「既定ポリシーを使用する署名付き Cookie のポリシーステートメントを作成するには」で作成したポリシーステートメントをハッシュ化して署名します。
ポリシーステートメントのハッシュ化、署名、およびエンコードを行う方法の詳細および例については、以下のトピックを参照してください。
既定ポリシーを使用して署名付き Cookie の署名を作成するには
-
「既定ポリシーを使用する署名付き Cookie のポリシーステートメントを作成するには」の手順で作成したポリシーステートメントを、SHA-1 ハッシュ関数と RSA を使用してハッシュ化し、署名します。空白を含まないバージョンのポリシーステートメントを使用します。
ハッシュ関数に必要なプライベートキーには、対応するパブリックキーがディストリビューション内のアクティブな信頼されたキーグループにあるものを使用してください。
注記
ポリシーステートメントをハッシュ化および署名するための方法は、プログラミング言語およびプラットフォームによって異なります。サンプルコードについては、「署名付き URL の署名を作成するためのコード例」を参照してください。
-
ハッシュ化および署名された文字列から、空白 (タブや改行文字を含む) を削除します。
-
MIME base64 エンコーディングを使用して文字列を Base64 エンコードします。詳細については、RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies の Section 6.8, Base64 Content-Transfer-Encoding
を参照してください。 -
URL クエリ文字列内の無効な文字を有効な文字で置き換えます。次の表に無効な文字と有効な文字を示します。
無効な文字 (置換元) 有効な文字 (置換先) +
- (ハイフン)
=
_ (下線)
/
~ (チルダ)
-
結果の値を、
Set-Cookie
の名前と値のペアのCloudFront-Signature
ヘッダーに含めます。次に、「既定ポリシーを使用して署名付き Cookie を設定するには」に戻り、Set-Cookie
のCloudFront-Key-Pair-Id
ヘッダーを追加します。