ウェブサーバーがリソースのリクエストに応答する場合、サーバーはレスポンスとともに 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 をリクエストに含めるかどうかを制御します。有効な値は Strict
、Lax
、None
の 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 とは別です。
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.example
やuser.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
ディレクトリ内のファイルのリクエストにのみ含まれます。
デモ
- 1pc.glitch.me: ファーストパーティ Cookie のデモ
- 3pc.glitch.me: サードパーティ Cookie のデモ