

# Cookie に基づいてコンテンツをキャッシュする
<a name="Cookies"></a>

デフォルトでは、CloudFront はリクエストとレスポンスを処理するとき、またはオブジェクトをエッジロケーションにキャッシュするときに Cookie を考慮しません。CloudFront が `Cookie` ヘッダーに含まれる内容以外は同一の 2 つのリクエストを受信した場合、デフォルトでは、CloudFront はリクエストを同一として扱い、両方のリクエストに対して同じオブジェクトを返します。

CloudFront でビューワーリクエストの一部またはすべて Cookie をオリジンに転送し、転送される Cookie 値に基づいてオブジェクトの別バージョンをキャッシュするように設定できます。これを行うと、CloudFront は、ビューワーリクエスト内の Cookie の一部またはすべて (転送するように設定されているものすべて) を使用して、キャッシュ内のオブジェクトを一意に識別します

たとえば、`locations.html` に対するリクエストに `country` Cookie が含まれており、その値が `uk` または `fr` であるとします。`country` Cookie の値に基づいてオブジェクトをキャッシュするように CloudFront を設定すると、CloudFront は `locations.html` に関するリクエストをオリジンに転送し、`country` Cookie とその値を含めます。オリジンは `locations.html` を返し、CloudFront は `country` Cookie の値が `uk` であるリクエスト用に 1 回、値が `fr` であるリクエスト用に 1 回、このオブジェクトをキャッシュします。

**重要**  
Amazon S3 および一部の HTTP サーバーは Cookie を処理しません。Cookie を処理しないオリジンや、Cookie に基づいてレスポンスを変化させないオリジンに Cookie を転送するように CloudFront を設定しないでください。これにより、CloudFront によって同じオブジェクトのオリジンに多くのリクエストが転送されるため、パフォーマンスが低下し、オリジンの負荷が増加する可能性があります。前の例を考慮すると、オリジンが `country` Cookie を処理しない場合や、`locations.html` Cookie の値に関係なく同じバージョンの `country` を CloudFront に返す場合は、その Cookie を転送するように CloudFront を設定しないでください。  
逆に、カスタムオリジンが特定の Cookie に依存しているか、Cookie に基づいて異なるレスポンスを送信する場合は、その Cookie をオリジンに転送するように CloudFront を設定してください。そのように設定しない場合、CloudFront はリクエストをオリジンに転送する前に Cookie を削除します。

Cookie 転送を設定するには、ディストリビューションのキャッシュ動作を更新します。キャッシュ動作の詳細については、「[キャッシュ動作の設定](DownloadDistValuesCacheBehavior.md)」の、特に「[cookie の転送](DownloadDistValuesCacheBehavior.md#DownloadDistValuesForwardCookies)」および「[許可リスト Cookie](DownloadDistValuesCacheBehavior.md#DownloadDistValuesAllowlistCookies)」セクションを参照してください。

各キャッシュ動作を設定して、次のいずれかを実行できます。
+ **オリジンにすべての Cookie を転送する - **CloudFront には、リクエストをオリジンに転送するときにビューワーが送信するすべての Cookie が含まれます。オリジンがレスポンスを返すと、CloudFront はビューワーリクエスト内の Cookie の名前と値を使用してレスポンスをキャッシュします。オリジンレスポンスに `Set-Cookie` ヘッダーが含まれている場合、CloudFront はリクエストされたオブジェクトと共にそれらのヘッダーをビューワーに返します。CloudFront は、オリジンから返されたオブジェクトと共に `Set-Cookie` ヘッダーもキャッシュし、すべてのキャッシュヒットでそれらの `Set-Cookie` ヘッダーをビューワーに送信します。
+ **指定した Cookie のセットを転送する - ** CloudFront は、リクエストをオリジンに転送する前に、アローリストにないビューワーが送信する Cookie をすべて削除します。CloudFront は、ビューワーリクエストのリストに登録された Cookie の名前と値を使用してレスポンスをキャッシュします。オリジンレスポンスに `Set-Cookie` ヘッダーが含まれている場合、CloudFront はリクエストされたオブジェクトと共にそれらのヘッダーをビューワーに返します。CloudFront は、オリジンから返されたオブジェクトと共に `Set-Cookie` ヘッダーもキャッシュし、すべてのキャッシュヒットでそれらの `Set-Cookie` ヘッダーをビューワーに送信します。

  Cookie 名でワイルドカードを指定する方法の詳細については、「[許可リスト Cookie](DownloadDistValuesCacheBehavior.md#DownloadDistValuesAllowlistCookies)」を参照してください。

  キャッシュ動作ごとに転送できる Cookie 名の数に関する現在のクォータについて、またはクォータの引き上げをリクエストするには、「[クエリ文字列のクォータ (従来のキャッシュ設定)](cloudfront-limits.md#limits-allowlisted-query-strings)」を参照してください。
+ **Cookie をオリジンに転送しない - **CloudFront は、ビューワーから送信された Cookie に基づくオブジェクトをキャッシュしません。さらに、CloudFront はリクエストをオリジンに転送する前に Cookie を削除し、レスポンスをビューワーに返す前にレスポンスから `Set-Cookie` ヘッダーを削除します。これはオリジンリソースの最適な使用方法ではないため、このキャッシュ動作を選択するときは、オリジンがデフォルトでオリジンレスポンスに Cookie を含めないようにする必要があります。

転送する Cookie を指定するときには、以下に注意してください。

**アクセスログ**  
Cookie をオリジンに転送しないように CloudFront を設定した場合や、特定の Cookie のみを転送するように CloudFront を設定した場合でも、リクエストと Cookie をログに記録するように CloudFront を設定すると、CloudFront ではすべての Cookie とすべての Cookie 属性がログに記録されます。CloudFront ログ記録の詳細については、「[アクセスログ (標準ログ)](AccessLogs.md)」を参照してください。

**大文字と小文字の区別**  
Cookie の名前と値は、大文字と小文字を区別します。例えば、CloudFront がすべての Cookie を転送するように設定されていて、同じオブジェクトに対する 2 つのビューワーリクエストに、大文字/小文字を除いて同一の Cookie がある場合、CloudFront はオブジェクトを 2 回キャッシュします。

**CloudFront による Cookie の並べ替え**  
CloudFront が Cookie (すべてまたはサブセット) を転送するように設定されている場合、CloudFront はリクエストをオリジンに転送する前に、Cookie 名の自然な順序で Cookie を並べ替えます。  
 `$` 文字で始まる Cookie 名はサポートされません。CloudFront は、このリクエストをオリジンに転送する前に Cookie を削除します。`$` 文字を削除するか、Cookie 名の先頭に別の文字を指定できます。

**`If-Modified-Since` および `If-None-Match` **  
`If-Modified-Since` と `If-None-Match` の条件付きリクエストは、CloudFront が Cookie (すべてまたはサブセット) を転送するように設定されている場合はサポートされません。

**標準の名前と値のペア形式が必要**  
CloudFront は、値が[標準の名前と値のペア形式](https://tools.ietf.org/html/rfc6265#section-4.1.1) (`"Cookie: cookie1=value1; cookie2=value2"` など) に準拠している場合のみ、Cookie ヘッダーを転送します。

**`Set-Cookie` ヘッダーのキャッシュの無効化**  
CloudFront が Cookie をオリジン (すべてまたは特定の Cookie にかかわらず) に転送するように設定されている場合、オリジンレスポンスで受信した `Set-Cookie` ヘッダーもキャッシュします。CloudFront は、元のビューワーへのレスポンスにこれらの `Set-Cookie` ヘッダーを含め、CloudFront キャッシュから提供される後続のレスポンスにも含めます。  
オリジンで Cookie を受信するが、CloudFront がオリジンのレスポンスで `Set-Cookie` ヘッダーをキャッシュしないようにする場合、フィールド名として `Cache-Control` を指定する `no-cache` ディレクティブを含む `Set-Cookie` ヘッダーを追加するようにオリジンを設定します。例: `Cache-Control: no-cache="Set-Cookie"`。詳細については、「*Hypertext Transfer Protocol (HTTP/1.1): Caching*」標準の「[Response Cache-Control Directives](https://tools.ietf.org/html/rfc7234#section-5.2.2)」を参照してください。

**Cookie 名の全体の長さ**  
特定の Cookie をオリジンに転送するように CloudFront を設定した場合、転送するように CloudFront を設定するすべての Cookie 名の合計バイト数は、512 から転送する Cookie の数を引いた値を超えることはできません。例えば、10 個の Cookie をオリジンに転送するように CloudFront を設定する場合は、10 個の Cookie 名の合計の長さが 502 バイト (512 - 10) を超えないようにしてください。  
すべての Cookie をオリジンに転送するように CloudFront を設定する場合は、Cookie 名の長さを考慮する必要はありません。

CloudFront コンソールを使用して、CloudFront で Cookie をオリジンに転送するようにディストリビューションを更新する方法については、「[ディストリビューションを更新する](HowToUpdateDistribution.md)」を参照してください。CloudFront API を使用してディストリビューションを更新する方法については、*Amazon CloudFront API リファレンス*の「[UpdateDistribution](https://docs.aws.amazon.com/cloudfront/latest/APIReference/API_UpdateDistribution.html)」を参照してください。