ウェブサーバーがリソースのリクエストに応答するときに、サーバーはレスポンスとともに 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.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
ディレクトリ内のファイルに対するリクエストにのみ含まれます。
デモ
- 1pc.glitch.me: ファーストパーティ Cookie のデモ
- 3pc.glitch.me: サードパーティ Cookie のデモ
ツール
関連リソース
- ファーストパーティの Cookie のレシピ
- Cookie とは
- サードパーティ Cookie とは
- HTTP リクエストとレスポンス
- Cookie ツール
- Cookie のデモ
- HTTP Cookie の使用
- SameSite Cookie の説明
- OWASP: Cookies