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

カスタムポリシーを使用した署名付き Cookie の設定

カスタムポリシーを使用する署名付き Cookie を設定するには、以下の手順を実行します。

カスタムポリシーを使用して署名付き Cookie を設定するには

  1. .NET または Java を使用して署名付き URL を作成しており、キーペアのプライベートキーをデフォルトの .pem 形式から .NET または Java 対応の形式に変更していない場合は、それを変換します。詳細については、「CloudFront プライベートキーの形式を変更する(.NET および Java のみ)」を参照してください。

  2. 承認されたビューアに 3 つの Set-Cookie ヘッダーを送信するアプリケーションをプログラムします。各 Set-Cookie ヘッダーには名前と値のペアを 1 つだけ含めることができ、CloudFront 署名付き Cookie では 3 つの名前と値のペアが必要であるため、3 つの Set-Cookie ヘッダーが必要です。名前と値のペアは、CloudFront-PolicyCloudFront-Key-Pair-Id、および CloudFront-Signature です。アクセスを制御するオブジェクトに対してユーザーが最初のリクエストを行う前に、値がビューアに存在している必要があります。

    Note

    一般的に、Expires 属性と Max-Age 属性を除外することをお勧めします。これにより、ユーザーがブラウザを閉じたときに、ブラウザで Cookie が削除されるため、ユーザーがコンテンツに不正アクセスする可能性が低くなります。詳細については、「署名付き Cookie の悪用の防止」を参照してください。

    Cookie の属性の名前では、大文字と小文字が区別されます

    改行は、属性を判読しやすくするためにのみ含まれています。

    Set-Cookie: 
    Domain=optional domain name; 
    Path=/optional directory path; 
    Secure; 
    HttpOnly; 
    CloudFront-Policy=base64 encoded version of the policy statement
    
    Set-Cookie: 
    Domain=optional domain name; 
    Path=/optional directory path; 
    Secure; 
    HttpOnly; 
    CloudFront-Signature=hashed and signed version of the policy statement
    
    Set-Cookie: 
    Domain=optional domain name; 
    Path=/optional directory path; 
    Secure; 
    HttpOnly; 
    CloudFront-Key-Pair-Id=active CloudFront key pair Id for the key pair that you are using to generate the signature
    (オプション)Domain

    リクエストされたオブジェクトのドメイン名。Domain 属性を指定しない場合、デフォルト値は URL のドメイン名で、指定されたドメイン名にのみ適用され、サブドメインには適用されません。Domain 属性を指定する場合、サブドメインにも適用されます。ドメイン名の先頭のドット(たとえば、Domain=.example.com)はオプションです。さらに、Domain 属性を指定する場合は、URL のドメイン名と Domain 属性の値が一致している必要があります。

    CloudFront がディストリビューションに割り当てたドメイン名(d111111abcdef8.cloudfront.net など)を指定することはできますが、*.cloudfront.net をドメイン名として指定することはできません。

    URL で代替ドメイン名(example.com など)を使用する場合は、Domain 属性を指定するかどうかにかかわらず、代替ドメイン名をディストリビューションに追加する必要があります。詳細については、トピック「ウェブディストリビューションを作成または更新する場合に指定する値」の「代替ドメイン名(CNAME)」を参照してください。

    (オプション)Path

    リクエストされたオブジェクトのパス。Path 属性を指定しない場合、デフォルト値は URL のパスです。

    安全性

    リクエストを送信する前に、ビューアが Cookie を暗号化することを要求します。Cookie の属性を中間者攻撃から保護するために、HTTPS 接続で Set-Cookie ヘッダーを送信することをお勧めします。

    HttpOnly

    ビューアが HTTP または HTTPS リクエストでのみ Cookie を送信することを要求します。

    CloudFront-Policy

    空白文字が削除され、base64 エンコードされた、JSON 形式のポリシーステートメント。詳細については、「カスタムポリシーのポリシーステートメントの作成」を参照してください。

    ポリシーステートメントは、署名付き Cookie でユーザーに与えられるアクセス権限を制御します。これには、ユーザーがアクセスできるオブジェクト、有効期限の日時、URL が有効になるオプション日時、およびオブジェクトへのアクセスが許可されるオプションの IP アドレスや IP アドレス範囲が含まれます。

    CloudFront-Signature

    ハッシュ化され、署名された base64 エンコードバージョンの JSON ポリシーステートメント。詳細については、「カスタムポリシーを使用する署名付き Cookie の署名の作成」を参照してください。

    CloudFront-Key-Pair-Id

    アクティブな CloudFront キーペアの ID(APKA9ONS7QCOWEXAMPLE など)。CloudFront キーペア ID は、署名付き Cookie の検証に使用するパブリックキーを CloudFront に指示します。CloudFront は、署名内の情報をポリシーステートメント内の情報と比較して、URL が改ざんされていないことを確認します。

    CloudFront 署名付き Cookie に含めるキーペア ID は、該当のキャッシュ動作に対するいずれかの信頼された署名者の AWS アカウントに関連付けられる必要があります。

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

    CloudFront キーペアを更新している間にキーペアを無効にした場合、いずれかの信頼された署名者の新しい有効なキーペアを使用するようにアプリケーションを更新する必要があります。キーペアの更新の詳細については、「CloudFront キーペアを更新する」を参照してください。

オブジェクトの URL のディストリビューションに関連付けられたドメイン名を使用する場合の、1 つの署名付き Cookie の Set-Cookie ヘッダーの例

Set-Cookie: Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly; CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__
Set-Cookie: Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly; CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_
Set-Cookie: Domain=d111111abcdef8.cloudfront.net; Path=/; Secure; HttpOnly; CloudFront-Key-Pair-Id=APKA9ONS7QCOWEXAMPLE

オブジェクトの URL に代替ドメイン名 example.org を使用している場合の、1 つの署名付き Cookie の Set-Cookie ヘッダーの例:

Set-Cookie: Domain=example.org; Path=/; Secure; HttpOnly; CloudFront-Policy=eyJTdGF0ZW1lbnQiOlt7IlJlc291cmNlIjoiaHR0cDovL2QxMTExMTFhYmNkZWY4LmNsb3VkZnJvbnQubmV0L2dhbWVfZG93bmxvYWQuemlwIiwiQ29uZGl0aW9uIjp7IklwQWRkcmVzcyI6eyJBV1M6U291cmNlSXAiOiIxOTIuMC4yLjAvMjQifSwiRGF0ZUxlc3NUaGFuIjp7IkFXUzpFcG9jaFRpbWUiOjE0MjY1MDAwMDB9fX1dfQ__
Set-Cookie: Domain=example.org; Path=/; Secure; HttpOnly; CloudFront-Signature=dtKhpJ3aUYxqDIwepczPiDb9NXQ_
Set-Cookie: Domain=example.org; Path=/; Secure; HttpOnly; CloudFront-Key-Pair-Id=APKA9ONS7QCOWEXAMPLE

URL で代替ドメイン名(example.com など)を使用する場合は、Domain 属性を指定するかどうかにかかわらず、代替ドメイン名をディストリビューションに追加する必要があります。詳細については、トピック「ウェブディストリビューションを作成または更新する場合に指定する値」の「代替ドメイン名(CNAME)」を参照してください。

カスタムポリシーを使用する署名付き Cookie のポリシーステートメントの作成

カスタムポリシーのポリシーステートメントを作成するには、以下の手順を実行します。さまざまな方法でオブジェクトへのアクセスを制御するポリシーステートメントのいくつかの例については、「カスタムポリシーを使用する署名付き Cookie のポリシーステートメントの例」を参照してください。

カスタムポリシーを使用する署名付き Cookie のポリシーステートメントを作成するには

  1. 以下の JSON 形式を使用してポリシーステートメントを構築します。

    {
       "Statement": [
          {
             "Resource":"URL of the object",
             "Condition":{
                "DateLessThan":{"AWS:EpochTime":required ending date and time in Unix time format and UTC},
                "DateGreaterThan":{"AWS:EpochTime":optional beginning date and time in Unix time format and UTC},
                "IpAddress":{"AWS:SourceIp":"optional IP address"}
             }
          }
       ]
    }

    次の点に注意してください。

    • UTF-8 文字エンコードを使用します。

    • すべての句読点およびパラメーター名を、指定されたとおりに正確に含めます。パラメーター名の省略形は受け付けられません。

    • Condition セクションのパラメーターの順序は問題ではありません。

    • ResourceDateLessThanDateGreaterThan、および IpAddress の値については、「署名付き Cookie のカスタムポリシーのポリシーステートメントで指定する値」を参照してください。

  2. ポリシーステートメントからすべての空白文字(タブと改行文字を含む)を削除します。アプリケーションコード内の文字列にエスケープ文字を含めることが必要になる場合があります。

  3. MIME base64 エンコーディングを使用してポリシーステートメントを Base64 エンコードします。詳細については、『RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies』の「Section 6.8, Base64 Content-Transfer-Encoding」を参照してください。

  4. URL クエリ文字列内の無効な文字を有効な文字で置き換えます。次の表に無効な文字と有効な文字を示します。

    無効な文字(置換元)有効な文字(置換先)

    +

    -(ハイフン)

    =

    _(下線)

    /

    ~(チルダ)

  5. 結果の値を、Set-Cookie ヘッダーの CloudFront-Policy= の後に含めます。

  6. ポリシーステートメントのハッシュ化、署名、および base64 エンコードを行って、CloudFront-Signature 用に Set-Cookie ヘッダーの署名を作成します。詳細については、「カスタムポリシーを使用する署名付き Cookie の署名の作成」を参照してください。

署名付き Cookie のカスタムポリシーのポリシーステートメントで指定する値

カスタムポリシーのポリシーステートメントを作成する場合、以下の値を指定します。

リソース

クエリ文字列(存在する場合)を含むベース URL。

http://d111111abcdef8.cloudfront.net/images/horizon.jpg?size=large&license=yes

Caution

Resource パラメーターを省略した場合、ユーザーは、署名付き URL の作成に使用するキーペアに関連付けられたあらゆるディストリビューションに関連付けられるすべてのオブジェクトにアクセスできます。

Resource の日付形式は 1 つだけ指定できます。

次の点に注意してください。

  • プロトコル – 値は http://https://、または http*:// で始まっている必要があります。

  • クエリ文字列パラメーター – クエリ文字列パラメーターがない場合は、疑問符を省略します。

  • ワイルドカード – 0 個以上の文字に一致するワイルドカード文字 (*)、または 1 つの文字に一致するワイルドカード文字 (?) を使用できます。文字列のどこにでも含めることができます。次に例を示します。この値は、

    http*://d111111abcdef8.cloudfront.net/*game_download.zip*

    たとえば、次のすべてのオブジェクトを含みます。

    • http://d111111abcdef8.cloudfront.net/example_game_download.zip?license=yes

    • https://d111111abcdef8.cloudfront.net/example_game_download.zip?license=yes

    • http://d111111abcdef8.cloudfront.net/test_game_download.zip?license=temp

    • https://d111111abcdef8.cloudfront.net/test_game_download.zip?license=temp

  • 代替ドメイン名 – URL で代替ドメイン名(CNAME)を指定する場合は、ウェブページまたはアプリケーション内のオブジェクトを参照するときに代替ドメイン名を指定する必要があります。オブジェクトの Amazon S3 URL を指定しないでください。

DateLessThan

URL の有効期限切れ日時。Unix 時間形式(秒単位)および協定世界時(UTC)で指定します。値を引用符で囲まないでください。

たとえば、UTC の 2015 年 3 月 16 日午前 10 時 00 分は、UNIX 時間形式の 1426500000 に変換されます。

詳細については、「CloudFront が署名付き Cookie 内の有効期限切れ日時を確認するタイミング」を参照してください。

DateGreaterThan(オプション)

オプションの URL 開始日時。Unix 時間形式(秒単位)および協定世界時(UTC)で指定します。ユーザーは指定された日時よりも前にオブジェクトにアクセスすることを許可されません。値を引用符で囲まないでください。

IpAddress(オプション)

GET リクエストを実行するクライアントの IP アドレス。次の点に注意してください。

  • オブジェクトへのアクセスをすべての IP アドレスに許可するには、IpAddress パラメーターを省略します。

  • IP アドレスまたは IP アドレス範囲を 1 つ指定できます。たとえば、2 つの別々の範囲のどちらかにクライアントの IP アドレスが入っている場合にアクセスを許可するようなポリシーを設定することはできません。

  • 1 つの IP アドレスからのアクセスを許可するには、以下のように指定します。

    "IPv4 IP アドレス/32"

  • IP アドレス範囲は標準の IPv4 CIDR 形式(192.0.2.0/24 など)で指定する必要があります。詳細については、「RFC 4632、クラスレスインタードメインルーティング(CIDR): インターネットアドレスの割り当てと集約計画」(http://tools.ietf.org/html/rfc4632)を参照してください。

    Important

    IPv6 フォーマットの IP アドレス (例: 2001:0db8:85a3:0000:0000:8a2e:0370:7334) はサポートされていません。

    IpAddress を含むカスタムポリシーを使用する場合、ディストリビューションで IPv6 は有効にしません。一部のコンテンツへのアクセスを IP アドレスによって制限し、他のコンテンツで IPv6 リクエストをサポートする場合、2 つのディストリビューションを作成します。詳細については、トピック「ウェブディストリビューションを作成または更新する場合に指定する値」の「IPv6 を有効にする」を参照してください。

カスタムポリシーを使用する署名付き Cookie のポリシーステートメントの例

以下のポリシーステートメントの例は、特定のオブジェクト、ディレクトリ内のすべてのオブジェクト、またはキーペア ID に関連付けられたすべてのオブジェクトへのアクセスを制御する方法を示しています。また、この例は、個々の IP アドレスまたは IP アドレス範囲からのアクセスを制御する方法、および指定された日時以降にユーザーが署名付き Cookie を使用することを禁止する方法も示しています。

この例のいずれかをコピーして貼り付ける場合は、すべての空白文字を削除し(タブと改行文字を含む)、適用可能な値を独自の値で置き換えて、右中かっこ(})の後に改行文字を含めます。

詳細については、「署名付き Cookie のカスタムポリシーのポリシーステートメントで指定する値」を参照してください。

ポリシーステートメントの例: IP アドレス範囲から 1 つのオブジェクトにアクセスする

次の署名付き Cookie 内のカスタムポリシーの例は、UTC の 2013 年 1 月 1 日午前 10 時 00 分まで、範囲 192.0.2.0/24 の IP アドレスから、ユーザーがオブジェクト http://d111111abcdef8.cloudfront.net/game_download.zip にアクセスできることを指定しています。

{
   "Statement": [
      {
         "Resource":"http://d111111abcdef8.cloudfront.net/game_download.zip",
         "Condition":{
            "IpAddress":{"AWS:SourceIp":"192.0.2.0/24"},
            "DateLessThan":{"AWS:EpochTime":1357034400}
         }
      }
   ]
}

ポリシーステートメントの例: IP アドレス範囲からディレクトリ内のすべてのオブジェクトにアクセスする

以下のカスタムポリシーの例では、Resource パラメーターの * ワイルドカード文字が示すとおり、training ディレクトリ内のあらゆるオブジェクトを対象とする署名付き Cookie を作成できます。UTC の 2013 年 1 月 1 日午前 10 時 00 分まで、範囲 192.0.2.0/24 の IP アドレスから、ユーザーはオブジェクトにアクセスできます。

{ 
   "Statement": [
      { 
         "Resource":"http://d111111abcdef8.cloudfront.net/training/*", 
         "Condition":{ 
            "IpAddress":{"AWS:SourceIp":"192.0.2.0/24"}, 
            "DateLessThan":{"AWS:EpochTime":1357034400}
         }
      }
   ] 
}

このポリシーを使用する各署名付き Cookie には、たとえば次のように、特定のオブジェクトを識別するベース URL が含まれます。

http://d111111abcdef8.cloudfront.net/training/orientation.pdf

ポリシーステートメントの例: キーペア ID に関連付けられたすべてのオブジェクトに 1 つの IP アドレスからアクセスする

以下のカスタムポリシーの例では、Resource パラメーターの * ワイルドカード文字が示すとおり、あらゆるディストリビューションに関連付けられたあらゆるオブジェクトを対象とする署名付き Cookie を設定できます。ユーザーは IP アドレス 192.0.2.10/32 を使用する必要があります。(CIDR 表記の値 192.0.2.10/32 は 1 つの IP アドレス 192.0.2.10 を参照します)。オブジェクトは、UTC の 2013 年 1 月 1 日午前 10 時 00 分から UTC の 2013 年 1 月 2 日午前 10 時 00 分まで使用できます。

{ 
   "Statement": [
      { 
         "Resource":"http://*",
         "Condition":{ 
            "IpAddress":{"AWS:SourceIp":"192.0.2.10/32"},
            "DateGreaterThan":{"AWS:EpochTime":1357034400},
            "DateLessThan":{"AWS:EpochTime":1357120800}
         } 
      }
   ] 
}

このポリシーを含める各署名付き Cookie には、たとえば次のように、特定の CloudFront ディストリビューション内の特定のオブジェクトを識別するベース URL が含まれます。

http://d111111abcdef8.cloudfront.net/training/orientation.pdf

署名付き Cookie にはキーペア ID も含まれます。キーペア ID は、ベース URL に指定されたディストリビューション(d111111abcdef8.cloudfront.net)内の信頼された署名者に関連付けられる必要があります。

カスタムポリシーを使用する署名付き Cookie の署名の作成

カスタムポリシーを使用する署名付き Cookie の署名は、ハッシュ化、署名、および base64 エンコードが行われたバージョンのポリシーステートメントです。

ポリシーステートメントのハッシュ化、署名、およびエンコードを行う方法の詳細および例については、以下の各資料を参照してください。

カスタムポリシーを使用して署名付き Cookie の署名を作成するには

  1. カスタムポリシーを使用する署名付き URL のポリシーステートメントを作成するには」の手順で作成した JSON ポリシーステートメントを、SHA-1 ハッシュ関数と RSA を使用してハッシュ化し、署名します。空白文字が含まれていないが、まだ base64 エンコードされていないバージョンのポリシーステートメントを使用します。

    ハッシュ関数で必要とされるプライベートキーについては、該当する有効な信頼済み署名者に関連付けられたプライベートキーを使用します。

    Note

    ポリシーステートメントをハッシュ化および署名するための方法は、プログラミング言語およびプラットフォームによって異なります。サンプルコードについては、「署名付き URL の署名を作成するためのコード例」を参照してください。

  2. ハッシュ化および署名された文字列から、空白文字(タブや改行文字を含む)を削除します。

  3. MIME base64 エンコーディングを使用して文字列を Base64 エンコードします。詳細については、『RFC 2045, MIME (Multipurpose Internet Mail Extensions) Part One: Format of Internet Message Bodies』の「Section 6.8, Base64 Content-Transfer-Encoding」を参照してください。

  4. URL クエリ文字列内の無効な文字を有効な文字で置き換えます。次の表に無効な文字と有効な文字を示します。

    無効な文字(置換元)有効な文字(置換先)

    +

    -(ハイフン)

    =

    _(下線)

    /

    ~(チルダ)

  5. 結果の値を、CloudFront-Signature= の名前と値のペアの Set-Cookie ヘッダーに含めて、「カスタムポリシーを使用して署名付き Cookie を設定するには」に戻り、CloudFront-Key-Pair-IdSet-Cookie ヘッダーを追加します。