Cookie の属性

ウェブサーバーがリソースのリクエストに応答する場合、サーバーはレスポンスとともに Set-Cookie ヘッダーを含めることができます。このヘッダーは、ブラウザに Cookie を保存するよう指示します。(例: Set-Cookie:cat=tabby)。Cookie とはで、Cookie の仕組みについて説明しています。

Set-Cookie には、Cookie の名前と値を指定するだけでなく、Cookie の設定と有効期限を制御する属性を含めることができます。Cookie 属性はセミコロンで区切ります。次に例を示します。

    Set-Cookie:cat=tabby; Expires=Tue, 31 Dec 2999 23:59:59 GMT;

この記事では、最も重要な Cookie 属性について説明します。

HTTP Cookie の使用では、Cookie 属性について技術的な詳細を説明しています。

安全

👉? すべての Cookie にデフォルトで Secure を含める必要があります。

Set-Cookie ヘッダーに Secure が含まれている場合、Cookie は HTTPS プロトコルを使用する暗号化されたリクエストにのみ含まれ、HTTP リクエストには含まれません。これにより、攻撃者がブラウザとサーバー間の通信に密かに介入して情報を渡し、改ざんする可能性がある中間攻撃を防ぐことができます。

HTTPOnly

👉? すべての Cookie にデフォルトで HTTPOnly を含める必要があります。JavaScript アクセスが必要な場合にのみ省略します。

Set-Cookie ヘッダーに HTTPOnly が含まれている場合、document.cookie を使用して Cookie にアクセスすることはできません。これにより、Cookie をターゲットとする特定の種類の攻撃から保護できます。

SameSite

👉? 値が設定されていない場合、デフォルトは SameSite=Lax です。SameSite=None はクロスサイト Cookie を許可しますが、サードパーティ Cookie の制限が適用されている場合は Cookie がブロックされます。

アクセスしているサイトとは異なるサイトのリソースをリクエストすることを、クロスサイト リクエストといいます。クロスサイト リクエストに応答して設定される Cookie は、サードパーティ Cookie と呼ばれます。詳しくは、サードパーティ Cookie とはをご覧ください。

SameSite 属性は、サードパーティ Cookie をリクエストに含めるかどうかを制御します。有効な値は StrictLaxNone の 3 つです。

Cookie は、Cookie のオリジン サイトにあるページからのリクエストにのみ応答して送信されます。たとえば、ユーザーが cats.example にアクセスし、SameSite=Strict 属性で Cookie が設定されているとします。後で、ユーザーが別のサイトにいて、cats.example のページにリンクをたどったとします。設定された Cookie は、そのリクエストに含まれません。

Lax

これは Strict と同じように機能しますが、ユーザーが Cookie の送信元サイトへのリンクをクリックしたときに、ブラウザに Cookie が含まれる点が異なります。(前の Strict の例では、ユーザーがリンクから cats.example に移動すると Cookie が含まれます)。Set-Cookie ヘッダーに SameSite 属性が含まれていない場合、Lax がデフォルトになります。

なし

制約なし: クロスサイトかどうかにかかわらず、Cookie はリクエストに含まれます。SameSite=None を使用する場合、Cookie には Secure 属性も必要です。

詳しくは、SameSite Cookie の説明をご覧ください。

分割

👉? サードパーティ Cookie を作成する場合は、複数の埋め込み間で共有する必要があることを明示的に把握している場合を除き、デフォルトで Partitioned 属性を含める必要があります。

この属性を使用すると、トップレベル サイトごとに個別の「Cookie の格納場所」を使用して、Cookie をパーティショニングされたストレージにオプトインできます。Cookie には、トップレベル サイトと、Cookie を設定しているドメインの両方で 2 つのキーが設定されます。

たとえば、ウェブサイト A とウェブサイト B の両方にウェブサイト C の iframe が含まれているとします。ウェブサイト A の iframe によって設定されたパーティション化された Cookie には、ウェブサイト B の iframe からアクセスできません。AC Cookie は BC Cookie とは別です。

共通のサードパーティを埋め込んでいる 2 つの異なるウェブサイトが、そのサードパーティの Cookie を共有しなくなることを示す図。
Cookie のパーティショニングでは、1 つのトップレベル サイトに埋め込まれたときに Cookie を設定するサードパーティ サービスは、そのサービスが他のトップレベル サイトに埋め込まれているときに、同じ Cookie にアクセスできません。

Partitioned 属性が設定された Cookie は、CHIPS(Cookies Having Independent Partitioned State)と呼ばれます。

パーティション化された Cookie には Secure 属性が必要です。

詳しくは、Cookies Having Independent Partitioned State をご覧ください。

有効期限と Max-Age

👉? 現在のセッションよりも長く Cookie を保持する必要がある場合を除き、Max-Age 属性と Expires 属性は省略します。ブラウザは Cookie を期限切れにするため、数年後の有効期限を設定しても意味がありません。代わりに、ユーザーがサイトに再アクセスしたときに Cookie を更新することを検討してください。

Cookie を削除して送信しないようにする日時(Expires)または秒単位の有効期限(Max-Age)を指定できます。次に例を示します。

  • Set-Cookie:cat=tabby; Expires=Tue, 31 Dec 2999 23:59:59 GMT;
  • Set-Cookie:cat=tabby; Max-Age=86400

Max-Age 属性または Expires 属性を指定しないと、現在のセッションが終了すると Cookie が削除されます。この種の Cookie は、セッション Cookie と呼ばれることもあります。

ドメイン

👉? サブドメインへのリクエストに Cookie を含める必要がある場合を除き、Domain 属性を含めないでください。

Set-Cookie ヘッダーに Domain 属性が含まれている場合、Cookie は、指定されたドメインとそのサブドメインへのリクエストに含まれます。

Set-Cookie ヘッダーに Domain 属性がない場合、サブドメインへのリクエストに Cookie は含まれません。

つまり、Domain 属性を含めると、ドメイン制限が緩和されます。

たとえば、ウェブサイト cats.example からのレスポンスは次のようになります。

  • Set-Cookie:cat=tabby
    Cookie は cats.example へのリクエストにのみ含まれます
  • Set-Cookie:cat=tabby; Domain=cats.example
    この Cookie は、cats.example へのリクエストと、fluffy.cats.exampleuser.assets.cats.example などのサブドメインのリソースに対するリクエストに含まれます。

パス

👉? サイト上の任意のパスにアクセスするすべてのリクエストで Cookie を含める必要がある場合は、Cookie に Path=/ を含めます。セキュリティ保護に Path に依存しないでください

Path 属性が Set-Cookie レスポンス ヘッダーに含まれている場合、設定された Cookie は、Path 値と一致する URL へのリクエスト(Cookie を設定したサイトの URL)にのみ含まれます。

次に例を示します。

  • Set-Cookie:cat=tabby; Path=/articles
    /articles で始まる URL パスへのリクエストに Cookie が含まれます。
    https://cats.example/articles/tabby/index.html
    https://cats.example/articles/breeds/tabby/index.html
    https://cats.example/images/tabby.jpg
    https://cats.example/en/articles/tabby/index.html
  • Set-Cookie:cat=tabby; Path=/
    サイト上の任意の URL に対するすべてのリクエストに Cookie が含まれます。

Set-Cookie レスポンス ヘッダーに Path 値がない場合、Cookie は同じディレクトリへのリクエストにのみ含まれます。たとえば、cats.example/images/tabby.jpg. のリクエストに応答して cat=tabby Cookie が設定されているとします。Path が設定されていない場合、Cookie は cats.example/images ディレクトリ内のファイルのリクエストにのみ含まれます。

デモ

ツール

補足説明