ウェブサーバーがリソースのリクエストに応答するときに、サーバーはレスポンスとともに 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 を含めるかどうかを制御します。有効な値は Strict、Lax、None の 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 とは別です。
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.exampleやuser.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.htmlSet-Cookie:cat=tabby; Path=/
サイト上の任意の URL へのすべてのリクエストに Cookie が含まれます。
Set-Cookie レスポンス ヘッダーに Path 値がない場合、Cookie は同じディレクトリへのリクエストにのみ含まれます。たとえば、cats.example/images/tabby.jpg. のリクエストに対するレスポンスで cat=tabby Cookie が設定されているとします。Path が設定されていない場合、Cookie は cats.example/images ディレクトリ内のファイルに対するリクエストにのみ含まれます。
デモ
- 1pc.glitch.me: ファーストパーティ Cookie のデモ
- 3pc.glitch.me: サードパーティ Cookie のデモ
ツール
関連リソース
- ファーストパーティの Cookie のレシピ
- Cookie とは
- サードパーティ Cookie とは
- HTTP リクエストとレスポンス
- Cookie ツール
- Cookie のデモ
- HTTP Cookie の使用
- SameSite Cookie の説明
- OWASP: Cookies