Cookie の属性

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

Set-Cookie では、Cookie の名前と値の指定に加えて、Cookie が設定されるかどうか、有効期限がいつになるかを制御する属性を含めることができます。Cookie 属性はセミコロンで区切ります。次に例を示します。

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

このドキュメントでは、最も重要な Cookie 属性について説明します。

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

安全

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

HTTPOnly

Set-Cookie ヘッダーに HTTPOnly が含まれている場合、JavaScript は document.cookie などの方法で Cookie にアクセスできません。これにより、Cookie を標的とする特定の種類の攻撃から保護できます。

SameSite

アクセスしているサイトとは異なるサイトからのリソースのリクエストは、クロスサイト リクエストです。クロスサイト リクエストに対するレスポンスで設定された Cookie は、サードパーティ Cookie です。

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

詳しくは、サードパーティ Cookie とはをご覧ください。

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 属性も必要です。

分割

この属性を使用すると、トップレベル サイトごとに個別の「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 をご覧ください。

Expires と Max-Age

Expires の日時または Max-Age の秒数を指定すると、その日時または秒数の経過後に Cookie が削除され、送信されなくなります。次に例を示します。

  • 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 と呼ばれることもあります。

ドメイン

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 などのサブドメイン上のリソースに対するリクエストにも含まれます。

パス

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

次に例を示します。

  • Set-Cookie:cat=tabby; Path=/articles
    この Cookie は、/articles:
    で始まる URL パスへのリクエストに含まれます。 ✅ 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 ディレクトリ内のファイルに対するリクエストにのみ含まれます。

デモ

ツール

関連リソース