メニュー
Amazon CloudFront
開発者ガイド (API Version 2016-09-29)

署名付き Cookie の使用

CloudFront 署名付き Cookie によって、現在の URL を変更したくない場合や、複数の制限付きファイル(ウェブサイトの購読者の領域にあるすべてのファイルなど)へのアクセスを提供する場合に、コンテンツにアクセスできるユーザーを制御できます。このトピックでは、署名付き Cookie を使用する際の考慮事項と、既定ポリシーとカスタムポリシーを使用するように署名付き Cookie を設定する方法について説明します。

署名付き Cookie の既定ポリシーとカスタムポリシーの選択

署名付き Cookie を作成する場合、Cookie の有効期間など、署名付き Cookie で制限を指定する JSON 形式のポリシーステートメントを作成します。既定ポリシーまたはカスタムポリシーを使用できます。次の表では、既定ポリシーとカスタムポリシーを比較しています。

説明 既定ポリシー カスタムポリシー

ポリシーステートメントを複数のオブジェクト用に再利用できる。ポリシーステートメントを再利用するには、Resource オブジェクトでワイルドカード文字を使用する必要があります。詳細については、「署名付き Cookie のカスタムポリシーのポリシーステートメントで指定する値」を参照してください。

いいえ

はい

ユーザーがコンテンツへのアクセスを開始できる日時を指定できる

いいえ

はい(オプション)

ユーザーがコンテンツにアクセスできなくなる日時を指定できる

はい

はい

コンテンツにアクセスできるユーザーの IP アドレスまたは IP アドレス範囲を指定できる

いいえ

はい(オプション)

既定ポリシーを使用して署名付き Cookie を作成する方法については、「既定ポリシーを使用した署名付き Cookie の設定」を参照してください。

カスタムポリシーを使用して署名付き Cookie を作成する方法については、「カスタムポリシーを使用した署名付き Cookie の設定」を参照してください。

署名付き Cookie の仕組み

ここでは、署名付き Cookie 用に CloudFront を設定する方法と、ユーザーが署名付き Cookie を含むリクエストを送信した場合の CloudFront の応答の概要を示します。

  1. CloudFront ディストリビューションで、1 件以上の信頼された署名者を指定します。これは、署名付き URL および署名付き Cookie の作成権限が与えられる AWS アカウントです。

    詳細については、「署名付き URL と署名付き Cookie(信頼された署名者)の作成が可能な AWS アカウントの指定」を参照してください。

  2. ユーザーがコンテンツにアクセスできるかどうかを判断し、アクセスできる場合は、3 つの Set-Cookie ヘッダーをビューアに送信するアプリケーションを開発します(各 Set-Cookie ヘッダーには名前と値のペアを 1 つだけ含めることができ、CloudFront 署名付き Cookie では 3 つの名前と値のペアが必要です)。ビューアがプライベートコンテンツをリクエストする前に、ビューアに Set-Cookie ヘッダーを送信する必要があります。Cookie の有効期限を短く設定した場合、ユーザーがアクセスを続行できるように、以降のリクエストに対してさらに 3 つの Set-Cookie ヘッダーを送信することもできます。

    通常、CloudFront ディストリビューションには少なくとも 2 つのキャッシュ動作があります。認証を必要としないものと、認証を必要とするものです。サイトのセキュリティで保護された部分のエラーページには、ログインページへのリダイレクタまたはリンクが含まれます。

    Cookie に基づいてオブジェクトをキャッシュするようにディストリビューションを設定している場合、CloudFront は署名付き Cookie の属性に基づいて個別のオブジェクトをキャッシュしません。

  3. ユーザーがウェブサイトにサインインし、コンテンツに対して支払いをするか、またはその他のアクセスの要件を満たします。

  4. アプリケーションは、レスポンスで Set-Cookie ヘッダーを返し、ビューアは名前と値のペアを格納します。

  5. ユーザーがオブジェクトを要求します。

    ユーザーのブラウザまたはその他のビューアは、ステップ 4 の名前と値のペアを取得し、リクエストの Cookie ヘッダーに追加します。これが署名付き Cookie です。

  6. CloudFront はパブリックキーを使用して、署名付き Cookie の署名を検証し、Cookie が改ざんされていないことを確認します。署名が無効である場合、リクエストは拒否されます。

    Cookie の署名が有効である場合、CloudFront は Cookie のポリシーステートメントを参照して(または既定ポリシーを使用している場合はポリシーステートメントを作成して)、リクエストがまだ有効であることを確認します。たとえば、Cookie の開始日時と終了日時を指定した場合、CloudFront は、アクセスが許可されている期間にユーザーがコンテンツへのアクセスを試みていることを確認します。

    リクエストがポリシーステートメントの要件を満たしている場合、CloudFront は制限されていないコンテンツの場合と同様にコンテンツを供給します。つまり、オブジェクトがエッジキャッシュにすでに存在するかどうかを確認し、必要に応じてリクエストをオリジンに転送して、オブジェクトをユーザーに返します。

Set-Cookie ヘッダーで Domain パラメーターを指定する場合、同一ルートドメイン名を使用するユーザーによる潜在的なアクセスを制限できる、最も厳密な値を指定します。たとえば、apex.example.com は、特に example.com を制御しない場合は、example.com よりも優先されます。これによって、ユーザーが nadir.example.com のコンテンツにアクセスすることを防止できます。

この種類の攻撃を防ぐには、以下の作業を行います。

  • Set-Cookie ヘッダーでセッション Cookie が作成されるように、Expires および Max-Age Cookie 属性を除外します。セッション Cookie は、ユーザーがブラウザを閉じたときに自動的に削除されるため、ユーザーがコンテンツに不正アクセスする可能性が低くなります。

  • ビューアがリクエストに Cookie を含める場合に Cookie が暗号化されるように、Secure 属性を含めます。

  • 可能な場合、カスタムポリシーを使用してビューアの IP アドレスを含めます。

  • CloudFront-Expires 属性では、ユーザーがコンテンツにアクセスできるようにする期間に基づいて、最短で適切な有効期限の時刻を指定します。

署名付き Cookie がまだ有効であるかどうかを確認するために、CloudFront は HTTP リクエスト時に、Cookie の有効期限切れ日時を確認します。有効期限切れ時刻の直前にクライアントが大きなオブジェクトのダウンロードを開始した場合、ダウンロード中に有効期限切れ時刻が経過してもダウンロードは完了します。TCP 接続が中断し、有効期限切れ時刻が経過した後にクライアントがダウンロードを再開した場合、ダウンロードは失敗します。

クライアントが、オブジェクトを断片的に取得するレンジ GET を使用した場合、有効期限切れ時刻が経過した後に実行された GET リクエストは失敗します。レンジ GET の詳細については、「CloudFront がオブジェクトの部分的リクエスト(レンジ GET)を処理する方法」を参照してください。

サンプルコードおよびサードパーティツール

プライベートコンテンツ用のサンプルコードは、署名付き URL の署名を作成する方法のみを示しています。ただし、署名付き Cookie の署名を作成するプロセスは非常によく似ており、サンプルコードの多くの部分は関連しています。詳細については、次のトピックを参照してください。

署名付き URL を作成するその他のサンプルコードは、Amazon CloudFront のサンプルコード & ライブラリ ページで取得できます。

署名付き URL の作成を含め、プライベートコンテンツをサポートするサードパーティツールの詳細については、「プライベートコンテンツの設定ツールとコード例」を参照してください。