インターネットドラフト Cookie: HTTP 状態管理機構 2026年7月
Bingler, et al. 2027年1月2日に失効 [ページ]
ワークグループ:
HTTP
インターネットドラフト:
draft-ietf-httpbis-rfc6265bis-latest
廃止:
6265(承認された場合)
公開日:
予定ステータス:
標準化過程
失効日:
著者:
S. Bingler, 編.
M. West, 編.
Google LLC
J. Wilander, 編.
Apple, Inc

Cookie: HTTP 状態管理機構

概要

本文書は、HTTP Cookie および Set-Cookie ヘッダーフィールドを定義する。これらの ヘッダーフィールドは、HTTP サーバーが HTTP ユーザーエージェントに 状態(Cookie と呼ばれる)を保存するために使用でき、それによりサーバーは ほぼステートレスな HTTP プロトコル上でステートフルなセッションを維持できる。 Cookie には、そのセキュリティおよびプライバシーを低下させる歴史的な欠陥が多数あるが、 Cookie および Set-Cookie ヘッダーフィールドはインターネット上で広く使用されている。 本文書は RFC 6265 を廃止する。

本文書について

この注記は RFC として公開する前に削除される。

本文書のステータス情報は https://datatracker.ietf.org/doc/draft-ietf-httpbis-rfc6265bis/ にある。

本文書に関する議論は、 HTTP Working Group メーリングリスト(mailto:ietf-http-wg@w3.org)で行われ、 そのアーカイブは https://lists.w3.org/Archives/Public/ietf-http-wg/ にある。 Working Group の情報は https://httpwg.org/ にある。

このドラフトのソースと課題トラッカーは、 https://github.com/httpwg/http-extensions/labels/6265bis にある。

本文書のステータス

このインターネットドラフトは、 BCP 78 および BCP 79 の規定に完全に準拠して提出されている。

インターネットドラフトは、Internet Engineering Task Force(IETF)の作業文書である。他のグループも作業文書を インターネットドラフトとして配布する場合があることに注意されたい。 現在のインターネットドラフトの一覧は https://datatracker.ietf.org/drafts/current/ にある。

インターネットドラフトは最大 6 か月間有効なドラフト文書であり、 いつでも他の文書によって更新、置換、または廃止される可能性がある。 インターネットドラフトを参考資料として用いること、または 「作業中」のものとして以外に引用することは不適切である。

このインターネットドラフトは 2027年1月2日に失効する。

目次

1. 序論

この文書は HTTP の Cookie および Set-Cookie ヘッダーフィールドを定義します。 Set-Cookie ヘッダーフィールドを使用すると、HTTP サーバーは名前/値ペアと 関連するメタデータ(Cookie と呼ばれる)をユーザーエージェントに渡すことができます。 ユーザーエージェントがその後サーバーにリクエストを行うとき、ユーザーエージェントは メタデータおよびその他の情報を使用して、Cookie ヘッダーフィールドで名前/値ペアを 返すかどうかを判断します。

表面的には単純ですが、Cookie には多くの複雑さがあります。たとえば、 サーバーは Cookie をユーザーエージェントに送信するときに、各 Cookie のスコープを示します。 そのスコープは、ユーザーエージェントが Cookie を返すべき最大期間、 ユーザーエージェントが Cookie を返すべきサーバー、および Cookie が適用される 接続タイプを示します。

歴史的な理由により、Cookie にはいくつものセキュリティおよびプライバシー上の欠陥があります。 たとえば、サーバーは特定の Cookie が「secure」接続を意図していることを示せますが、 Secure 属性は能動的なネットワーク攻撃者が存在する場合に完全性を提供しません。 同様に、特定のホストに対する Cookie は、そのホスト上のすべてのポートで共有されます。 これは、Web ブラウザーで通常使用される「same-origin policy」が、 異なるポート経由で取得されたコンテンツを分離することと対照的です。

この仕様は、Cookie を生成するサーバーと Cookie を消費するユーザーエージェントの 両方の開発者に適用されます。Section 3.2 は、それぞれの実装タイプについて 意図された対象読者を明確にするのに役立ちます。

ユーザーエージェントとの相互運用性を最大化するため、サーバーは Cookie を生成する際に、 Section 4 で定義される 良好に振る舞うプロファイルに制限するべきです。

ユーザーエージェントは、Section 5 で定義される より寛容な処理規則を実装しなければなりません。 これは、Section 4 で定義される良好に振る舞うプロファイルに 適合しない既存サーバーとの相互運用性を最大化するためです。

この文書は、これらのヘッダーフィールドがインターネット上で実際に使用されている 構文と意味論を規定します。特に、この文書は現在使用されているものを超える 新しい構文や意味論を作成しません。Section 4 で示される Cookie 生成に関する推奨事項は、現在の サーバー動作の望ましいサブセットを表しており、Section 5 で示される より寛容な Cookie 処理アルゴリズムでさえ、現在使用されている すべての構文的および意味的な変種を推奨するものではありません。 推奨されるプロトコルと大きく異なる既存ソフトウェアがある場合、この文書には その違いを説明する注記が含まれます。

この文書は [RFC6265] を廃止します。

2. 規約

2.1. 適合基準

この文書におけるキーワード "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"NOT RECOMMENDED"、 "MAY"、および "OPTIONAL" は、ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] で説明されるように 解釈されるものとします。

アルゴリズムの一部として命令形で表現された要件(たとえば「先頭の空白文字をすべて 取り除く」や「false を返してこのアルゴリズムを中止する」など)は、 そのアルゴリズムを導入する際に使用されたキーワード("MUST"、"SHOULD"、"MAY" など)の 意味で解釈されます。

アルゴリズムまたは特定のステップとして表現された適合要件は、 最終結果が等価である限り、任意の方法で実装できます。特に、 この仕様で定義されるアルゴリズムは理解しやすいことを意図しており、 高性能であることを意図していません。

2.2. 構文表記

この仕様は、 [RFC5234] の Augmented Backus-Naur Form(ABNF)表記を使用します。

以下のコアルールは、[RFC5234] の Appendix B.1 で定義されるものとして、 参照により含まれます:ALPHA(文字)、CR(キャリッジリターン)、CRLF(CR LF)、CTLs (制御文字)、DIGIT(10進数 0-9)、DQUOTE(二重引用符)、HEXDIG (16進数 0-9/A-F/a-f)、LF(ラインフィード)、NUL(null オクテット)、OCTET(NUL を除く任意の 8 ビットデータ列)、SP(空白)、HTAB(水平タブ)、 CHAR(任意の [USASCII] 文字)、VCHAR(任意の 可視 [USASCII] 文字)、 および WSP(空白類)です。

OWS(任意の空白)および BWS(不正な空白)ルールは、 [HTTP] の Section 5.6.3 で定義されます。

2.3. 用語

"user agent"、"client"、"server"、"proxy"、および "origin server" という用語は、 HTTP/1.1 仕様([HTTP] の Section 3)における意味と 同じ意味を持ちます。

request-host は、ユーザーエージェントが HTTP リクエストを送信する先、 または HTTP レスポンスを受信する元(すなわち、対応する HTTP リクエストを送信した先)の ホストの名前として、ユーザーエージェントが認識しているものです。

request-uri という用語は、 [HTTP] の Section 7.1 で定義される "target URI" を指します。

2 つのオクテット列は、 [RFC4790] で定義される i;ascii-casemap 照合順序の下で等価である場合に限り、 互いに大文字小文字を区別せず一致するといいます。

string という用語は、NUL でないオクテットの列を意味します。

"active browsing context"、"active document"、"ancestor navigables"、 "container document"、"content navigable"、"dedicated worker"、"Document"、 "inclusive ancestor navigables"、"navigable"、"navigate"、"opaque origin"、 "sandboxed origin browsing context flag"、"shared worker"、"the worker's Documents"、"top-level traversable"、および "WorkerGlobalScope" という用語は、 [HTML] で定義されます。

"Service Workers" は Service Workers 仕様 [SERVICE-WORKERS] で定義されます。

"origin" という用語、URI から origin を導出する機構、および origin に対する "the same" 照合アルゴリズムは、[RFC6454] で定義されます。

"Safe" HTTP メソッドには、GETHEADOPTIONS、および TRACE が含まれ、 [HTTP] の Section 9.2.1 で定義されます。

ドメインの "public suffix" は、"com"、"co.uk"、"pvt.k12.wy.us" など、 公的なレジストリによって管理されるドメインの部分です。ドメインの "registrable domain" は、そのドメインの public suffix に、その左側のラベルを加えたものです。 つまり、https://www.site.example では、public suffix は example であり、 registrable domain は site.example です。セキュリティに関する考慮事項については Section 8.9 を参照してください。

"request" という用語、および request の "client"、"current url"、"method"、 "target browsing context"、および "url list" は、 [FETCH] で定義されます。

"non-HTTP APIs" という用語は、Cookie を設定および取得するために使用される 非 HTTP 機構を指します。たとえば、Cookie をスクリプトに公開する Web ブラウザー API などです。

"top-level navigation" という用語は、top-level traversable のナビゲーションを指します。

2.4. 名前解決システム

この文書は Cookie で使用する特定の名前解決システムを厳密に規定しませんが、 そのシステムが [USASCII] 文字のみを 使用するか、ASCII 互換エンコーディング(ACE)を使用することを要求します。 Domain Name System(DNS)は典型的かつ従来からの例であるため、この文書では 名前解決を DNS の観点で参照します。

Unicode など、非 ASCII 文字を直接公開する名前解決システムは、 この文書の範囲外です。

3. 概要

この節では、オリジンサーバーが状態情報をユーザーエージェントへ送信し、 ユーザーエージェントがその状態情報をオリジンサーバーへ返すための方法を概説します。

状態を保存するため、オリジンサーバーは HTTP レスポンスに Set-Cookie ヘッダーフィールドを含めます。 その後のリクエストで、ユーザーエージェントは Cookie リクエスト ヘッダーフィールドをオリジンサーバーへ返します。Cookie ヘッダーフィールドには、 ユーザーエージェントが以前の Set-Cookie ヘッダーフィールドで受け取った Cookie が含まれます。 オリジンサーバーは Cookie ヘッダーフィールドを無視してもよく、その内容をアプリケーション定義の目的に 使用してもかまいません。

オリジンサーバーは任意のレスポンスで Set-Cookie レスポンスヘッダーフィールドを送信してもかまいません。 オリジンサーバーは 1 つのレスポンスに複数の Set-Cookie ヘッダーフィールドを含めることができます。 Cookie または Set-Cookie ヘッダーフィールドの存在は、HTTP キャッシュがレスポンスを保存して再利用することを妨げません。

オリジンサーバーおよび仲介者は、複数の Set-Cookie ヘッダーフィールドを 1 つのヘッダーフィールドに結合してはなりません。HTTP ヘッダーフィールドを結合する通常の機構 (すなわち、[HTTP] の Section 5.3 で定義されるもの)は、 Set-Cookie ヘッダーフィールドの意味論を変更する可能性があります。 これは、%x2C(",")文字が Set-Cookie において、そのような結合と競合する方法で 使用されるためです。

たとえば、

Set-Cookie: a=b;path=/c,d=e

これは曖昧です。a=b と d=e という 2 つの Cookie を意図している可能性もあれば、 /c,d=e というパスを持つ 1 つの Cookie を意図している可能性もあります。

ユーザーエージェントは、レスポンスステータスコードまたはユーザーエージェントの Cookie ポリシーに基づいて、Set-Cookie ヘッダーフィールドを無視してもかまいません (Section 5.3 参照)。

注記:Cookie のオクテットは [USASCII] 文字として処理されなければなりません。 non-HTTP API が 1 つ以上の非 [USASCII] 文字を含む set-cookie-string を渡すことはあり得ますが、これらのオクテットを [USASCII] 文字以外のものとして解釈しようとしてはなりません。

3.1.

Set-Cookie ヘッダーフィールドを使用すると、サーバーは HTTP レスポンス内で ユーザーエージェントに短い文字列を送信でき、ユーザーエージェントは Cookie のスコープ内にある 将来の HTTP リクエストでそれを返します。たとえば、サーバーは値 31d4d96e407aad42 を持つ SID という名前の「セッション識別子」をユーザーエージェントに送信できます。 その後、ユーザーエージェントは以降のリクエストでそのセッション識別子を返します。

== Server -> User Agent ==

Set-Cookie: SID=31d4d96e407aad42

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42

サーバーは Path 属性および Domain 属性を使用して、Cookie のデフォルトスコープを変更できます。 たとえば、サーバーはユーザーエージェントに対し、site.example のすべてのパスおよび すべてのサブドメインへ Cookie を返すよう指示できます。

== Server -> User Agent ==

Set-Cookie: SID=31d4d96e407aad42; Path=/; Domain=site.example

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42

次の例に示すように、サーバーはユーザーエージェントに複数の Cookie を保存できます。 たとえば、サーバーは 2 つの Set-Cookie ヘッダーフィールドを返すことで、 セッション識別子とユーザーの優先言語を保存できます。より機微なセッション識別子に対して 追加のセキュリティ保護を提供するために、サーバーが Secure 属性と HttpOnly 属性を 使用していることに注意してください(Section 4.1.2 参照)。

== Server -> User Agent ==

Set-Cookie: SID=31d4d96e407aad42; Path=/; Secure; HttpOnly
Set-Cookie: lang=en-US; Path=/; Domain=site.example

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42; lang=en-US

上記の Cookie ヘッダーフィールドには、SID という名前の Cookie と lang という名前の Cookie の 2 つが含まれていることに注意してください。

Cookie 名は大文字小文字を区別します。つまり、サーバーがユーザーエージェントに対し、 名前の大文字小文字だけが異なる 2 つの Set-Cookie ヘッダーフィールドを送信した場合、 ユーザーエージェントはそれら両方の Cookie を保存し、以降のリクエストで返します。

== Server -> User Agent ==

Set-Cookie: SID=31d4d96e407aad42
Set-Cookie: sid=31d4d96e407aad42

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42; sid=31d4d96e407aad42

サーバーがユーザーエージェントに Cookie を複数の「セッション」 (たとえばユーザーエージェントの再起動)をまたいで永続化してほしい場合、 サーバーは Expires 属性で有効期限を指定できます。ユーザーエージェントの Cookie ストアが クォータを超えた場合、またはユーザーが手動でサーバーの Cookie を削除した場合、 ユーザーエージェントは有効期限より前に Cookie を削除する可能性があることに注意してください。

== Server -> User Agent ==

Set-Cookie: lang=en-US; Expires=Wed, 09 Jun 2026 10:18:14 GMT

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42; lang=en-US

最後に、Cookie を削除するには、サーバーは過去の有効期限を持つ Set-Cookie ヘッダーフィールドを返します。Cookie の削除が成功するのは、 Set-Cookie ヘッダーフィールド内の Path 属性および Domain 属性が、 Cookie 作成時に使用された値と一致する場合に限られます。

== Server -> User Agent ==

Set-Cookie: lang=; Expires=Sun, 06 Nov 1994 08:49:37 GMT

== User Agent -> Server ==

Cookie: SID=31d4d96e407aad42

3.2. どの要件を実装するか

次の 2 つの節、Section 4Section 5 は、 2 つの異なる種類の実装に対する要件の集合について説明します。この節は、 実装者が自分たちの目的に最も適した要件の集合を判断するための手引きとなることを 意図しています。誤った要件の集合を選択すると、他の Cookie 実装との 互換性が失われる可能性があります。

互換性があることの意味は、実装者の目的によって異なることに注意することが重要です。 これらの違いは、意図的および非意図的な仕様変更、仕様解釈、 ならびに歴史的な実装差異により、時間をかけて蓄積されてきました。

この節では、Cookie 仕様の実装者を大まかに producer と consumer の 2 種類に分けます。 これらは公式な用語ではなく、読者がユースケースを直感的に理解するのを助けるために ここでのみ使用されます。

4. サーバー要件

この節では、Cookie および Set-Cookie ヘッダーフィールドについて、 良好に振る舞うプロファイルの構文と意味論を説明します。

5. ユーザーエージェント要件

この節は、これらの要件を正確に実装するユーザーエージェントが、 既存のサーバー(Section 4 で説明される 良好に振る舞うプロファイルに適合しないサーバーを含む)と相互運用できるように、 Cookie および Set-Cookie ヘッダーフィールドを十分な詳細で規定します。

ユーザーエージェントは、ここで規定されるものよりも多くの制限 (たとえば、Section 7.2 で説明される Cookie ポリシーで規定される制限)を 強制してもかまいません。ただし、そのような追加の制限は、ユーザーエージェントが 既存のサーバーと相互運用できる可能性を低下させることがあります。

5.1. サブコンポーネント アルゴリズム

この節は、ユーザーエージェントが Cookie および Set-Cookie ヘッダーフィールドの特定のサブコンポーネントを処理するために使用する いくつかのアルゴリズムを定義します。

5.1.2. 正規化された ホスト名

正規化されたホスト名は、以下のアルゴリズムによって生成される 文字列です。

  1. ホスト名を個々のドメイン名ラベルの列に変換します。

  2. すべてのラベルは、U-label、A-label、または Non-Reserved LDH(NR-LDH)label のいずれかでなければなりません (Section 2.3.1 of [RFC5890] を参照)。いずれかのラベルが これらのいずれでもない場合、このアルゴリズムを中止し、 ホスト名の正規化に失敗します。

  3. 各 U-label を A-label に変換します (Section 2.3.2.1 of [RFC5890] を参照)。

  4. いずれかのラベルが Fake A-label である場合、 このアルゴリズムを中止し、ホスト名の正規化に失敗します。

  5. 結果のラベルを、%x2E(".")文字で区切って連結します。

5.1.3. ドメイン照合

注記:このアルゴリズムは、両方の入力が正規化されていることを 前提とします。

ある文字列が与えられた domain string に domain-match するのは、 以下の条件の少なくとも 1 つが成り立つ場合です。

  • domain string とその文字列が同一である。 (この時点で domain string とその文字列の両方は、小文字に正規化されていることに 注意してください。)

  • 以下のすべての条件が成り立つ。

    • domain string がその文字列の接尾辞である。

    • domain string に含まれていない、 その文字列の最後の文字が %x2E(".")文字である。

    • その文字列がホスト名である (すなわち、IP アドレスではない)。

5.2. "Same-site" および "cross-site" リクエスト

2 つの origin は、[SAMESITE] で定義される "same site" 基準を満たす場合、same-site です。リクエストは、 以下の基準が真である場合に "same-site" です。

  1. そのリクエストが、ユーザーインターフェイス要素を通じて トリガーされた再読み込みナビゲーションの結果ではないこと (ユーザーエージェントによって定義される。例:ユーザーがツールバーの 更新ボタンをクリックしたことによってトリガーされるリクエスト)。

  2. request の current url の origin が、request の client の "site for cookies"(origin)と same-site であること、または request が client を持たないか、request の client が null であること。

ユーザーインターフェイス要素を通じてトリガーされた 再読み込みナビゲーションの結果であるリクエストは、再読み込みされた文書が もともと same-site リクエストによってナビゲートされたものである場合、same-site です。 "same-site" ではないリクエストは、代わりに "cross-site" です。

request の client の "site for cookies" は、 以下の小節で説明するように、その client の種類に応じて計算されます。

5.2.1. Document ベースの リクエスト

ユーザーエージェントのアドレスバーに表示される URI は、 ユーザーに直接公開される唯一のセキュリティコンテキストであり、 したがって、ユーザーが特定の Web サイトを信頼するかどうかを判断するために 合理的に依存できる唯一のシグナルです。その URI の origin は、 ユーザーが自分がやり取りしていると最も考えやすいコンテキストを表します。 この origin、すなわち top-level traversable の active document の origin は、 "top-level origin" として定義されます。

top-level traversable に表示される document について、 document の "site for cookies" は top-level origin です。

container document については、 Section 4 of [RFC7034] で説明される "multiple-nested scenarios" を考慮するために、document の ancestor navigables の active documents それぞれの origin を監査しなければなりません。 document の "site for cookies" は、top-level origin が document の origin と same-site であり、かつ document の ancestor documents の各 origin と same-site である場合に限り、 top-level origin です。そうでない場合、その "site for cookies" は opaque origin に設定された origin です。

Document(document)が与えられたとき、 以下のアルゴリズムはその "site for cookies" を返します。

  1. top-document を、 document の navigable の top-level traversable における active document とします。

  2. top-origin を、 top-document の sandboxed origin browsing context flag が設定されている場合は top-document の URI の origin とし、それ以外の場合は top-document の origin とします。

  3. documents を、 document の inclusive ancestor navigables の active documents からなるリストとします。

  4. documents 内の各 item について、

    1. origin を、 item の sandboxed origin browsing context flag が設定されている場合は item の URI の origin とし、それ以外の場合は item の origin とします。

    2. origintop-origin と same-site でない場合、 opaque origin に設定された origin を返します。

  5. top-origin を返します。

注記:このアルゴリズムは、top-document から document までの文書のチェーン全体がすべて active である場合にのみ 適用されます。

5.2.2. Worker ベースの リクエスト

Worker によって駆動されるリクエストは、 document によって駆動されるリクエストほど明確ではありません。 top-level traversable と worker の間に明確な関連がないためです。 これは、可視の document がまったくない状態でバックグラウンドでコードを実行し得る Service Workers [SERVICE-WORKERS] において特に当てはまります。

5.2.2.1. Dedicated Worker と Shared Worker

Dedicated worker は単純です。各 dedicated worker は 1 つ、かつ 1 つだけの document に結び付けられるためです。 worker の "site for cookies" は、worker の origin が document の "site for cookies" と same-site である場合は document の "site for cookies" であり、 そうでない場合は opaque origin に設定された origin です。

Shared worker は複数の document に同時に結び付けられることがあります。 それらの document が異なる "site for cookies" 値を持つことは十分にあり得るため、 worker の "site for cookies" は、その値が worker の origin とすべて same-site ではない場合には opaque origin に設定された origin になり、その値が一致する場合には worker の origin になります。

WorkerGlobalScope(worker)が与えられたとき、 以下のアルゴリズムはその "site for cookies" を返します。

  1. siteworker の origin とします。

  2. worker の Documents 内の 各 document について、

    1. document-site を、 document の "site for cookies"(Section 5.2.1 で定義)とします。

    2. document-sitesite と same-site でない場合、 opaque origin に設定された origin を返します。

  3. site を返します。

5.2.2.2. Service Workers

Service Workers はより複雑です。なぜなら、 それらを登録した Document とは間接的な関係しかない、 完全に別個の実行コンテキストとして動作するためです。

ユーザーエージェントが Service Workers を扱う方法は異なり得ますが、 ユーザーエージェントは [SERVICE-WORKERS] 仕様に一致させるべきです。

ユーザーエージェントは、100 番台のステータスコードを持つ レスポンスに含まれる Set-Cookie ヘッダーフィールドを無視してもよく、 または自らの Cookie ポリシーに基づいて無視してもかまいません (Section 7.2 参照)。

その他すべての Set-Cookie ヘッダーフィールドは、Section 5.6 に従って処理されるべきです。 すなわち、100 番台以外のステータスコードを持つレスポンス (400 番台および 500 番台のステータスコードを持つレスポンスを含む)に含まれる Set-Cookie ヘッダーフィールドは、ユーザーエージェントの Cookie ポリシーに従って 無視される場合を除き、処理されるべきです。

Cookie 名接頭辞に関するユーザーエージェントの要件は、 UA が接頭辞文字列を大文字小文字を区別せず一致させなければならない点で、 サーバーの要件(Section 4.1.3)と わずかに異なります。

接頭辞に関する規範的要件は、Section 5.7 で 定義される保存モデルアルゴリズムで詳述されます。

これは、一部のサーバーが Cookie を大文字小文字を区別せず処理するため、 意図せず接頭辞の大文字小文字を誤って使用し、その誤った大文字小文字の接頭辞を 受け入れてしまうためです。

たとえば、サーバーが以下の Set-Cookie ヘッダーフィールドを 送信した場合、

Set-Cookie: __SECURE-SID=12345

接頭辞を大文字小文字を区別して確認する UA はこの Cookie を受け入れ、 サーバーはその Cookie が __Secure- と綴られた Cookie と同じ保証の対象であると 誤って信じることになります。

さらに、サーバーは、接頭辞付き Cookie になりすますために 攻撃者が意図的に Cookie の大文字小文字を誤って使用する攻撃に対して脆弱です。 たとえば、あるサイトがすでに __Secure-SID=12345 という Cookie を持っており、 攻撃者が何らかの手段で、そのサイトについて以下の Set-Cookie ヘッダーフィールドを、接頭辞を大文字小文字を区別して確認する UA に送信したとします。

Set-Cookie: __SeCuRe-SID=evil

次にユーザーがそのサイトを訪問すると、UA は両方の Cookie を送信します。

Cookie: __Secure-SID=12345; __SeCuRe-SID=evil

大文字小文字を区別しないサーバーは、この 2 つの Cookie を区別できず、 攻撃者がサイトを侵害できるようになります。

これらの問題を防ぐため、UA は Cookie 名接頭辞を 大文字小文字を区別せず一致させなければなりません。

注記:名前が異なる Cookie は、UA では依然として別個のものと見なされます。 したがって、__Secure-foo=bar__secure-foo=baz の両方が、 別個の Cookie として同時に存在でき、どちらにも __Secure- 接頭辞の 要件が適用されます。

以下は、適合するユーザーエージェントによって拒否される Set-Cookie ヘッダーフィールドの例です。

Set-Cookie: __Secure-SID=12345; Domain=site.example
Set-Cookie: __secure-SID=12345; Domain=site.example
Set-Cookie: __SECURE-SID=12345; Domain=site.example
Set-Cookie: __Host-SID=12345
Set-Cookie: __host-SID=12345; Secure
Set-Cookie: __host-SID=12345; Domain=site.example
Set-Cookie: __HOST-SID=12345; Domain=site.example; Path=/
Set-Cookie: __Host-SID=12345; Secure; Domain=site.example; Path=/
Set-Cookie: __host-SID=12345; Secure; Domain=site.example; Path=/
Set-Cookie: __HOST-SID=12345; Secure; Domain=site.example; Path=/

一方、以下の Set-Cookie ヘッダーフィールドは、 secure origin から設定された場合に受け入れられます。

Set-Cookie: __Secure-SID=12345; Domain=site.example; Secure
Set-Cookie: __secure-SID=12345; Domain=site.example; Secure
Set-Cookie: __SECURE-SID=12345; Domain=site.example; Secure
Set-Cookie: __Host-SID=12345; Secure; Path=/
Set-Cookie: __host-SID=12345; Secure; Path=/
Set-Cookie: __HOST-SID=12345; Secure; Path=/

5.7. 保存モデル

ユーザーエージェントは、各 Cookie について次のフィールドを保存します:name、value、 expiry-time、domain、path、creation-time、last-access-time、 persistent-flag、host-only-flag、secure-only-flag、http-only-flag、 および same-site-flag。

ユーザーエージェントが、request-uri から、名前 cookie-name、値 cookie-value、および属性 cookie-attribute-list を持つ Cookie を 「受信する」とき、ユーザーエージェントはその Cookie を次のように処理しなければなりません。

  1. ユーザーエージェントは、受信した Cookie 全体を無視してもかまいません。 Section 5.3 を参照してください。

  2. cookie-name が空で、かつ cookie-value も空である場合、 このアルゴリズムを中止し、その Cookie 全体を無視します。

  3. cookie-name または cookie-value が %x00-08 / %x0A-1F / %x7F 文字(HTAB を除く CTL 文字)を含む場合、 このアルゴリズムを中止し、その Cookie 全体を無視します。

  4. cookie-name と cookie-value の長さの合計が 4096 オクテットを超える場合、このアルゴリズムを中止し、その Cookie 全体を無視します。

  5. name が cookie-name、value が cookie-value である新しい Cookie を作成します。 creation-time と last-access-time を現在の日付と時刻に設定します。

  6. cookie-attribute-list が attribute-name "Max-Age" を持つ属性を含む場合、

    1. Cookie の persistent-flag を true に設定します。

    2. Cookie の expiry-time を、cookie-attribute-list 内で attribute-name が "Max-Age" である最後の属性の attribute-value に設定します。

    それ以外で、cookie-attribute-list が attribute-name "Expires" を持つ属性を含み (かつ attribute-name "Max-Age" を持つ属性を含まない)場合、

    1. Cookie の persistent-flag を true に設定します。

    2. Cookie の expiry-time を、cookie-attribute-list 内で attribute-name が "Expires" である最後の属性の attribute-value に設定します。

    それ以外の場合、

    1. Cookie の persistent-flag を false に設定します。

    2. Cookie の expiry-time を表現可能な最新の日付に設定します。

  7. cookie-attribute-list が attribute-name "Domain" を持つ属性を含む場合、

    1. domain-attribute を、cookie-attribute-list 内で attribute-name が "Domain" であり、かつ attribute-value の 長さが 1024 オクテット以下である最後の属性の attribute-value とします。 (先頭の %x2E(".")が存在する場合、その文字は許可されていないにもかかわらず 無視されることに注意してください。)

    それ以外の場合、

    1. domain-attribute を空文字列とします。

  8. domain-attribute が CHAR に含まれない文字を含む場合、 このアルゴリズムを中止し、その Cookie 全体を無視します。

  9. ユーザーエージェントが "public suffixes" を拒否するよう構成されており、 domain-attribute が public suffix である場合、

    1. request-host-canonical を正規化された request-host とします。

    2. request-host の正規化に失敗した場合、 このアルゴリズムを中止し、その Cookie 全体を無視します。

    3. domain-attribute が request-host-canonical と同一である場合、

      1. domain-attribute を空文字列とします。

      それ以外の場合、

      1. このアルゴリズムを中止し、その Cookie 全体を無視します。

    注記:このステップは、attacker.example が Domain 属性 "example" を持つ Cookie を設定することで site.example の完全性を損なうことを防ぎます。

  10. domain-attribute が空でない場合、

    1. request-host-canonical が domain-attribute に domain-match(Section 5.1.3 参照)しない場合、

      1. このアルゴリズムを中止し、 その Cookie 全体を無視します。

      それ以外の場合、

      1. Cookie の host-only-flag を false に設定します。

      2. Cookie の domain を domain-attribute に設定します。

    それ以外の場合、

    1. Cookie の host-only-flag を true に設定します。

    2. Cookie の domain を request-host-canonical に設定します。

  11. cookie-attribute-list が attribute-name "Path" を持つ属性を含む場合、 Cookie の path を、cookie-attribute-list 内で attribute-name が "Path" であり、 かつ attribute-value の長さが 1024 オクテット以下である最後の属性の attribute-value に設定します。それ以外の場合、Cookie の path を request-uri の default-path に設定します。

  12. cookie-attribute-list が attribute-name "Secure" を持つ属性を含む場合、 Cookie の secure-only-flag を true に設定します。 それ以外の場合、Cookie の secure-only-flag を false に設定します。

  13. request-uri が(ユーザーエージェントによって定義される) "secure" 接続を表さず、かつ Cookie の secure-only-flag が true である場合、 これらのステップを中止し、その Cookie 全体を無視します。

  14. cookie-attribute-list が attribute-name "HttpOnly" を持つ属性を含む場合、 Cookie の http-only-flag を true に設定します。 それ以外の場合、Cookie の http-only-flag を false に設定します。

  15. Cookie が "non-HTTP" API から受信され、かつ Cookie の http-only-flag が true である場合、このアルゴリズムを中止し、その Cookie 全体を無視します。

  16. Cookie の secure-only-flag が false であり、request-uri が "secure" 接続を表さない場合、Cookie ストアが以下の基準をすべて満たす 1 つ以上の Cookie を含むなら、このアルゴリズムを中止し、その Cookie 全体を無視します。

    1. それらの name が新しく作成された Cookie の name と一致する。

    2. それらの secure-only-flag が true である。

    3. それらの domain が、新しく作成された Cookie の domain に domain-match(Section 5.1.3 参照)するか、 またはその逆である。

    4. 新しく作成された Cookie の path が、 既存の Cookie の path に path-match する。

    注記:パス比較は対称ではなく、新しく作成された非 secure Cookie が 既存の secure Cookie を上書きしないことだけを保証し、 cookie-fixing 攻撃に対する一定の軽減を提供します。つまり、 path が '/login' である 'a' という名前の既存の secure Cookie がある場合、 'a' という名前の非 secure Cookie は '/' または '/foo' の path に対して設定できますが、 '/login' または '/login/en' の path に対しては設定できません。

  17. cookie-attribute-list が attribute-name "SameSite" と、 "Strict"、"Lax"、または "None" の attribute-value を持つ属性を含む場合、 Cookie の same-site-flag を、cookie-attribute-list 内で attribute-name が "SameSite" である 最後の属性の attribute-value に設定します。それ以外の場合、Cookie の same-site-flag を "Default" に設定します。

  18. Cookie の same-site-flag が "None" でない場合、

    1. Cookie が "non-HTTP" API から受信され、 その API が、"site for cookies" が top-level origin と same-site でない navigable の active document から呼び出された場合、 このアルゴリズムを中止し、新しく作成された Cookie 全体を無視します。

    2. Cookie が(Section 5.2 で定義される) "same-site" リクエストから受信された場合、残りのサブステップをスキップして、 Cookie の処理を続行します。

    3. Cookie が top-level traversable [HTML] をナビゲートしているリクエストから受信された場合 (たとえば、リクエストの "reserved client" が null、または "target browsing context" の navigable が top-level traversable である環境のいずれかである場合)、 残りのサブステップをスキップして、Cookie の処理を続行します。

      注記:Top-level navigation は、たとえ新しい Cookie がそのナビゲーションの前に すでに存在していたとしても、そのリクエストとともに送信されなかったような場合であっても、 任意の SameSite 値を持つ Cookie を作成できます。

    4. このアルゴリズムを中止し、 新しく作成された Cookie 全体を無視します。

  19. Cookie の "same-site-flag" が "None" である場合、 Cookie の secure-only-flag が true でない限り、このアルゴリズムを中止し、 その Cookie 全体を無視します。

  20. cookie-name が文字列 "__Secure-" と大文字小文字を区別せずに一致するもので 始まる場合、Cookie の secure-only-flag が true でない限り、 このアルゴリズムを中止し、その Cookie 全体を無視します。

  21. cookie-name が文字列 "__Host-" と大文字小文字を区別せずに一致するもので 始まる場合、Cookie が以下の基準をすべて満たさない限り、 このアルゴリズムを中止し、その Cookie 全体を無視します。

    1. Cookie の secure-only-flag が true である。

    2. Cookie の host-only-flag が true である。

    3. cookie-attribute-list が attribute-name "Path" を持つ属性を含み、Cookie の path が / である。

  22. cookie-name が空であり、かつ次のいずれかの条件が true である場合、このアルゴリズムを中止し、その Cookie 全体を無視します。

    • cookie-value が文字列 "__Secure-" と 大文字小文字を区別せずに一致するもので始まる

    • cookie-value が文字列 "__Host-" と 大文字小文字を区別せずに一致するもので始まる

  23. Cookie ストアが、新しく作成された Cookie と同じ name、domain、 host-only-flag、および path を持つ Cookie を含む場合、

    1. old-cookie を、新しく作成された Cookie と同じ name、domain、host-only-flag、および path を持つ既存の Cookie とします。 (このアルゴリズムは、そのような Cookie が最大 1 つしか存在しないという 不変条件を維持することに注意してください。)

    2. 新しく作成された Cookie が "non-HTTP" API から受信され、 old-cookie の http-only-flag が true である場合、このアルゴリズムを中止し、 新しく作成された Cookie 全体を無視します。

    3. 新しく作成された Cookie の creation-time を、 old-cookie の creation-time と一致するように更新します。

    4. old-cookie を Cookie ストアから削除します。

  24. 新しく作成された Cookie を Cookie ストアに挿入します。

Cookie の expiry date が過去である場合、その Cookie は「期限切れ」です。

Cookie ストア内に期限切れの Cookie が存在する場合、ユーザーエージェントは いつでも Cookie ストアからすべての期限切れ Cookie を削除しなければなりません。

ある domain フィールドを共有する Cookie の数が、何らかの 実装定義の上限(たとえば 50 個の Cookie)を超える場合、ユーザーエージェントは いつでも Cookie ストアから「過剰な Cookie を削除」してもかまいません。

Cookie ストアが何らかの所定の上限(たとえば 3000 個の Cookie)を超える場合、ユーザーエージェントはいつでも Cookie ストアから 「過剰な Cookie を削除」してもかまいません。

ユーザーエージェントが Cookie ストアから過剰な Cookie を削除する場合、 ユーザーエージェントは次の優先順位で Cookie を削除しなければなりません。

  1. 期限切れの Cookie。

  2. secure-only-flag が false であり、かつ所定の数より多い 他の Cookie と domain フィールドを共有する Cookie。

  3. 所定の数より多い他の Cookie と domain フィールドを 共有する Cookie。

  4. すべての Cookie。

2 つの Cookie が同じ削除優先度を持つ場合、 ユーザーエージェントは last-access-time が最も早い Cookie から先に削除しなければなりません。

「現在のセッションが終了したとき」(ユーザーエージェントによって定義)、 ユーザーエージェントは persistent-flag が false に設定されたすべての Cookie を Cookie ストアから削除しなければなりません。

5.8. 取得モデル

この節は、Cookie ストアから Cookie を cookie-string の形で取得する方法を 定義します。「取得」とは、cookie-string の生成を必要とする任意のイベントです。 たとえば、取得は HTTP リクエスト用の Cookie ヘッダーフィールドを構築するために 発生することもあれば、Cookie へのアクセスを提供する "non-HTTP" API の呼び出しから cookie-string を返すために必要になることもあります。取得には関連付けられた URI、 same-site status、および type があり、それらは取得の種類に応じて以下で定義されます。

5.8.2. 非 HTTP API

ユーザーエージェントは、保存された Cookie にアクセスするために使用できる "non-HTTP" API を実装してもかまいません。

ユーザーエージェントは、たとえば third-party context 内で 取得が発生する場合など、特定のコンテキストで空の cookie-string を返してもかまいません (Section 7.1 参照)。

ユーザーエージェントが、関連付けられた Document を持つ "non-HTTP" API の特定の呼び出しに対して Cookie を返す場合、 ユーザーエージェントは Section 5.8.3 で定義されるアルゴリズムに従って cookie-string を計算しなければなりません。ここで、取得の URI は 呼び出し元によって定義され([DOM-DOCUMENT-COOKIE] 参照)、 取得の same-site status は、Document の "site for cookies" が Section 5.2.1 で定義されるように top-level origin と same-site である場合は "same-site"(そうでない場合は "cross-site")であり、 取得の type は "non-HTTP" です。

5.8.3. 取得 アルゴリズム

Cookie ストアと取得が与えられたとき、以下のアルゴリズムは 与えられた Cookie ストアから cookie-string を返します。

  1. retrieval-host-canonical を、 取得の URI の正規化されたホストとします。

  2. 取得の URI のホストの正規化に失敗した場合、 このアルゴリズムを中止します。

  3. cookie-list を、Cookie ストア内の Cookie のうち、 以下の要件をすべて満たすものの集合とします。

    • 次のいずれか:

      • Cookie の host-only-flag が true であり、retrieval-host-canonical が Cookie の domain と同一である。

      または:

      • Cookie の host-only-flag が false であり、retrieval-host-canonical が Cookie の domain に domain-match(Section 5.1.3 参照)する。

      • "public suffixes" を拒否するよう構成された ユーザーエージェントについては、Cookie の domain が public suffix ではない。

      注記:Cookie が作成されて以降に public suffix list が変更された可能性があります。 この変更によって Cookie の domain が public suffix になった場合、 その Cookie が今作成されていたなら、作成時に拒否されていたことになります。 (Section 5.7 のステップ 9 を参照。)

    • 取得の URI の path が Cookie の path に path-match する。

    • Cookie の secure-only-flag が true である場合、 取得の URI は(ユーザーエージェントによって定義される) "secure" 接続を表していなければならない。

      注記:"secure" 接続の概念は、この文書では定義されません。 一般に、ユーザーエージェントは、その接続が SSL または TLS [TLS13] のような トランスポート層セキュリティを使用している場合、またはホストが 信頼されている場合に、接続を secure と見なします。たとえば、 ほとんどのユーザーエージェントは、"https" を secure protocol を表す scheme と見なし、 "localhost" を信頼されたホストと見なします。

    • Cookie の http-only-flag が true である場合、 取得の type が "non-HTTP" ならその Cookie を除外する。

    • Cookie の same-site-flag が "None" ではなく、 取得の same-site status が "cross-site" である場合、 以下の条件がすべて満たされない限り、その Cookie を除外する。

      • 取得の type が "HTTP" である。

      • same-site-flag が "Lax" または "Default" である。

      • 取得に関連付けられた HTTP リクエストが "safe" メソッドを使用する。

      • 取得に関連付けられた HTTP リクエストの target browsing context が active browsing context または top-level traversable である。

  4. ユーザーエージェントは、cookie-list を次の順序で ソートするべきです。

    • path が長い Cookie は、 path が短い Cookie より前に並べられます。

    • path フィールドの長さが等しい Cookie の間では、 creation-time が早い Cookie が、creation-time が遅い Cookie より前に並べられます。

    注記:すべてのユーザーエージェントがこの順序で cookie-list をソートするわけではありませんが、 この順序はこの文書が書かれた時点での一般的な慣行を反映しており、歴史的には この順序に(誤って)依存するサーバーが存在していました。

  5. cookie-list 内の各 Cookie の last-access-time を 現在の日付と時刻に更新します。

  6. cookie-list 内の各 Cookie を順に処理して、 cookie-list を cookie-string に直列化します。

    1. Cookie の name が空でない場合、 Cookie の name に続けて %x3D("=")文字を出力します。

    2. Cookie の value が空でない場合、 Cookie の value を出力します。

    3. その Cookie が cookie-list 内の最後の Cookie でない場合、文字 %x3B および %x20("; ")を出力します。

6. 実装上の考慮事項

6.1. 制限

実用的なユーザーエージェント実装には、保存できる Cookie の数とサイズに 制限があります。汎用のユーザーエージェントは、次の各最小能力を提供するべきです。

  • ドメインごとに少なくとも 50 個の Cookie。

  • 合計で少なくとも 3000 個の Cookie。

ユーザーエージェントは、保存する Cookie の最大数を制限してもよく、 (ユーザーの要求によるか、実装上の制限によるかにかかわらず) 任意の Cookie をいつでも削除してもかまいません。

Cookie の最大数に対する制限は、Section 5.6 で 強制されなければならない長さ制限により、保存される Cookie の総サイズも 制限することに注意してください。

サーバーは、これらの実装制限に達することを避け、 Cookie ヘッダーフィールドがすべてのリクエストに含まれることによる ネットワーク帯域幅を最小化し、サーバーのヘッダーフィールド制限に達することを 避けるために(Section 4.2.1 を参照)、可能な限り少数かつ小さな Cookie を使用するべきです。

ユーザーエージェントは任意の Cookie をいつでも削除し得るため、 ユーザーエージェントが Cookie ヘッダーフィールドで 1 つ以上の Cookie を返さなかった場合、 サーバーは段階的に機能低下するべきです。

6.2. アプリケーション プログラミングインターフェイス

Cookie および Set-Cookie ヘッダーフィールドがこれほど難解な扱いを 使用する理由の 1 つは、多くのプラットフォーム(サーバーとユーザーエージェントの両方)が Cookie に対して文字列ベースのアプリケーションプログラミングインターフェイス(API)を 提供しており、アプリケーション層のプログラマーが Cookie および Set-Cookie ヘッダーフィールドで使用される構文を生成および解析する必要があるためです。 多くのプログラマーはこれを誤って行い、相互運用性の問題を引き起こしてきました。

Cookie に対して文字列ベースの API を提供する代わりに、 プラットフォームはより意味論的な API を提供することで恩恵を受けます。 具体的な API 設計を推奨することはこの文書の範囲外ですが、 直列化された日付文字列ではなく抽象的な "Date" オブジェクトを受け入れることには 明確な利点があります。

7. プライバシーに関する考慮事項

Cookie の主要なプライバシーリスクは、ユーザーの活動を関連付けられる能力です。 これは単一のサイト上でも発生し得ますが、異なる、一見無関係な Web サイトをまたいで活動が追跡され、 ユーザープロファイルが構築される場合に最も問題となります。

時間の経過とともに、この能力([RFC2109] およびその後継すべてで明示的に警告されている)は、 次のような多様な理由で広く使用されるようになりました。

Cookie のすべての使用が必ずしもプライバシー上問題となるわけではありませんが、 その悪用可能性は、インターネットコミュニティおよびより広い社会において広範な懸念となっています。 これらの懸念に対応して、ユーザーエージェントは(以前の仕様で許可および奨励されているように) さまざまな方法で Cookie 機能を積極的に制限してきました。一方で、Web の健全性にとって望ましいと 判断する機能を妨げることは避けています。

Cookie のプライバシーへの影響を軽減するために、どの具体的な機構を使用すべきかについて 合意を宣言するには時期尚早です。ユーザーエージェントが Cookie の扱い方に対して継続的に行っている変更は、 その最終的な合意への入力を提供し得る実験として捉えるのが最も適切です。

代わりに、この文書は、執筆時点で広く導入されている Cookie に関連する プライバシーリスクに対する、限定的かつ一般的な軽減策を説明します。実装は今後も実験を続け、 時間とともに Cookie に対してより厳格で、より明確に定義された制限を課すことが期待されます。 この文書の将来のバージョンは、導入経験に基づいてそれらの機構を成文化するかもしれません。 現在 Cookie に依存している機能が、別個の対象を絞った機構によってサポートできるなら、 それらは別個の仕様に文書化され、Cookie に対するより厳格な制限が実現可能になるかもしれません。

Cookie はサイトをまたいでユーザーを追跡するために使用できる唯一の機構ではないため、 これらの軽減策は Web プライバシーを改善するために必要ではありますが、それだけで十分ではないことに 注意してください。

7.1. サードパーティ Cookie

"third-party" または cross-site Cookie とは、主要リソース (通常はユーザーが閲覧している Web ページ)をホストするサーバーとは異なるサーバーから取得される、 埋め込みコンテンツ(スクリプト、画像、スタイルシート、フレームなど)に関連付けられた Cookie です。 サードパーティ Cookie は、異なるサイト上のユーザー活動を関連付けるためによく使用されます。

サードパーティ Cookie には本質的なプライバシー問題があるため、 現在ほとんどのユーザーエージェントはさまざまな方法でサードパーティ Cookie を制限しています。 一部は、サードパーティ Set-Cookie ヘッダーフィールドの処理を拒否し、サードパーティ Cookie ヘッダーフィールドの送信を拒否することで、サードパーティ Cookie を完全にブロックします。 一部は、first-party context に基づいて Cookie をパーティション化し、閲覧されているサイトに応じて 異なる Cookie が送信されるようにします。一部は、ユーザーエージェントの Cookie ポリシーおよび/または ユーザー制御に基づいて Cookie をブロックします。

この文書は特定のアプローチを支持または要求するものではありませんが、 ユーザーエージェントは、互換性上の制約が許す限り制限的なサードパーティ Cookie のポリシーを 採用することが推奨されます。したがって、リソースは、予見可能な将来にわたって サードパーティ Cookie がユーザーエージェントによって一貫して扱われることに依存できません。

7.3. ユーザー制御

ユーザーエージェントは、Cookie ストアに保存された Cookie を管理するための 機構をユーザーに提供するべきです。たとえば、ユーザーエージェントは、 指定された期間中に受信したすべての Cookie、または特定のドメインに関連する すべての Cookie をユーザーが削除できるようにしてもよいです。さらに、多くの ユーザーエージェントは、Cookie ストアに保存された Cookie をユーザーが調べられる ユーザーインターフェイス要素を含みます。

ユーザーエージェントは、Cookie を無効化するための機構をユーザーに 提供するべきです。Cookie が無効化されている場合、ユーザーエージェントは 送信 HTTP リクエストに Cookie ヘッダーフィールドを含めてはならず、受信 HTTP レスポンス内の Set-Cookie ヘッダーフィールドを処理してはなりません。

ユーザーエージェントは、Cookie ポリシーを変更する方法を提供してもかまいません (Section 7.2 参照)。

ユーザーエージェントは、セッションをまたいだ Cookie の永続保存を防止する オプションをユーザーに提供してもかまいません。このように構成されている場合、 ユーザーエージェントは、受信したすべての Cookie を persistent-flag が false に 設定されているかのように扱わなければなりません。一部の一般的なユーザーエージェントは、 この機能を "private browsing" モード [Aggarwal2010] として公開しています。

7.4. 有効期限

サーバーは Cookie の有効期限を遠い将来に設定できますが、 ほとんどのユーザーエージェントは実際には Cookie を何十年も保持しません。 サーバーは、不必要に長い有効期間を選ぶのではなく、Cookie の目的に基づいて 合理的な Cookie 有効期間を選択することで、ユーザーのプライバシーを促進するべきです。 たとえば、一般的なセッション識別子は、2 週間後に期限切れになるよう設定するのが 合理的である場合があります。

8. セキュリティに関する考慮事項

8.1. 概要

Cookie には多くのセキュリティ上の落とし穴があります。この節では、 より顕著ないくつかの問題を概説します。

特に、Cookie は開発者が認証のために環境権限に依存することを促し、 cross-site request forgery [CSRF] などの攻撃に脆弱になることがよくあります。また、セッション識別子を Cookie に 保存する場合、開発者はしばしばセッション固定の脆弱性を作り出します。

HTTPS で用いられるようなトランスポート層暗号化は、Cookie に対する ネットワーク攻撃への重要な防御層を提供します。しかし、Cookie プロトコル自体に内在する 脆弱性のため、ネットワーク攻撃者が被害者の Cookie を取得または変更することを 完全に防止するには不十分です(後述の「弱い機密性」および「弱い完全性」を参照)。 さらに、デフォルトでは、Cookie は HTTPS と併用される場合であっても、ネットワーク攻撃者に 対する機密性や完全性を提供しません。これは、Cookie が保護属性を明示的に 指定する必要があることを意味します。たとえば、次の Cookie は:

Set-Cookie: a=b

Secure 属性を指定していないため、それが作成された元の接続タイプに関係なく、 secure な接続と insecure な接続の両方でアクセス可能になります。この挙動により、 攻撃者が Cookie を読み取ったり変更したりできる可能性があります。

8.2. 環境権限

Cookie を使用してユーザーを認証するサーバーは、セキュリティ脆弱性を 被る可能性があります。なぜなら、一部のユーザーエージェントは、リモートパーティが ユーザーエージェントから HTTP リクエストを発行できるようにしているためです (たとえば HTTP リダイレクトや HTML フォームを介して)。それらのリクエストを発行する際、 リモートパーティが Cookie の内容を知らない場合でも、ユーザーエージェントは Cookie を付加します。 これにより、リモートパーティが不用意なサーバーで権限を行使できる可能性があります。

このセキュリティ上の懸念は多くの名前(たとえば cross-site request forgery、confused deputy)で呼ばれますが、問題は Cookie が 環境権限の一形態であることに由来します。Cookie は、サーバー運用者が 指定(URL の形)と認可(Cookie の形)を分離することを促します。 その結果、ユーザーエージェントは攻撃者によって指定されたリソースに対して 認可を提供し、サーバーまたはそのクライアントが、攻撃者によって指定された操作を ユーザーによって認可されたかのように実行する可能性があります。

サーバー運用者は、認可に Cookie を使用する代わりに、URL を ケイパビリティとして扱うことで、指定と認可を結び付けることを検討してもよいです。 このアプローチでは、秘密情報を Cookie に保存する代わりに URL に保存し、 リモートエンティティに秘密情報そのものを提供することを要求します。 このアプローチは万能薬ではありませんが、これらの原則を慎重に適用することで、 より堅牢なセキュリティにつながる可能性があります。

8.3. 平文

TLS [TLS13] のような secure チャネル上で送信されない限り、 Cookie および Set-Cookie ヘッダーフィールド内の情報は平文で送信されます。

  1. これらのヘッダーフィールドで伝達されるすべての機微情報は、 盗聴者に公開されます。

  2. 悪意ある仲介者は、いずれの方向に流れる場合でも ヘッダーフィールドを変更でき、予測不能な結果をもたらす可能性があります。

サーバーは、Cookie をユーザーエージェントへ送信するとき、 (Cookie を secure チャネル上で送信する場合であっても)Cookie の内容を 暗号化し署名するべきです(サーバーが望む任意の形式を使用して)。 ただし、Cookie の内容を暗号化し署名しても、攻撃者が Cookie をあるユーザーエージェントから 別のユーザーエージェントへ移植したり、後で Cookie を再生したりすることは防げません。

すべての Cookie の内容を暗号化し署名することに加え、 より高いレベルのセキュリティを必要とするサーバーは、Cookie および Set-Cookie ヘッダーフィールドを secure チャネル上でのみ使用するべきです。secure チャネル上で Cookie を使用する場合、サーバーはすべての Cookie に Secure 属性(Section 4.1.2.5 参照)を設定するべきです。 サーバーが Secure 属性を設定しない場合、secure チャネルによって提供される保護は ほとんど意味を失います。

たとえば、セッション識別子を Cookie に保存し、通常 HTTPS 経由で アクセスされる Web メールサーバーを考えてください。サーバーが Cookie に Secure 属性を設定していない場合、能動的なネットワーク攻撃者は、ユーザーエージェントからの 任意の送信 HTTP リクエストを傍受し、そのリクエストを HTTP 経由で Web メールサーバーへ リダイレクトできます。Web メールサーバーが HTTP 接続を待ち受けていない場合でも、 ユーザーエージェントはそのリクエストに Cookie を含めます。能動的なネットワーク攻撃者は これらの Cookie を傍受し、サーバーに対して再生し、ユーザーのメールの内容を知ることが できます。代わりに、サーバーが Cookie に Secure 属性を設定していた場合、 ユーザーエージェントは平文リクエストに Cookie を含めなかったでしょう。

8.4. セッション識別子

セッション情報を Cookie に直接保存する代わりに (攻撃者に公開されたり再生されたりする可能性があるため)、 サーバーは一般に nonce(または「セッション識別子」)を Cookie に保存します。 サーバーが nonce を含む HTTP リクエストを受信すると、サーバーは nonce をキーとして Cookie に関連付けられた状態情報を検索できます。

セッション識別子 Cookie を使用すると、攻撃者が Cookie の内容を知った場合に 引き起こせる損害を制限できます。これは、nonce がサーバーとのやり取りにのみ有用であるためです (nonce でない Cookie 内容とは異なり、それ自体が機微である可能性があります)。 さらに、単一の nonce を使用すると、攻撃者がサーバーとの 2 つのやり取りから Cookie 内容を「継ぎ合わせる」ことを防ぎ、それによってサーバーが予期しない挙動を する可能性を低減します。

セッション識別子の使用にリスクがないわけではありません。たとえば、 サーバーは「セッション固定」脆弱性を避けるよう注意するべきです。 セッション固定攻撃は 3 つのステップで進行します。第一に、攻撃者はセッション識別子を 自分のユーザーエージェントから被害者のユーザーエージェントへ移植します。 第二に、被害者はそのセッション識別子を使用してサーバーとやり取りし、 ユーザーの認証情報または機密情報をセッション識別子に付与する可能性があります。 第三に、攻撃者はそのセッション識別子を使用してサーバーと直接やり取りし、 ユーザーの権限または機密情報を取得する可能性があります。

8.5. 弱い機密性

Cookie はポートによる分離を提供しません。あるポートで動作する サービスが Cookie を読み取れる場合、同じサーバーの別のポートで動作するサービスも その Cookie を読み取れます。あるポート上のサービスが Cookie を書き込める場合、 同じサーバーの別のポートで動作するサービスもその Cookie を書き込めます。 このため、サーバーは、同じホストの異なるポートで相互に信頼しないサービスを実行し、 かつセキュリティ上機微な情報を Cookie に保存する、ということを同時に行うべきではありません。

Cookie は scheme による分離を提供しません。最も一般的には http および https scheme とともに使用されますが、あるホストの Cookie は ftp や gopher など他の scheme でも利用可能である可能性があります。 scheme による分離の欠如は、Cookie へのアクセスを許可する non-HTTP API (たとえば HTML の document.cookie API)で最も明らかですが、scheme による 分離の欠如は、実際には Cookie 自体を処理する要件にも存在します (たとえば、HTTP 経由で gopher scheme の URI を取得することを考えてください)。

Cookie は常にパスによる分離を提供するわけではありません。 ネットワークレベルのプロトコルは、あるパスに保存された Cookie を別のパスに送信しませんが、 一部のユーザーエージェントは HTML の document.cookie API などの non-HTTP API を通じて Cookie を公開します。これらのユーザーエージェントの一部(たとえば Web ブラウザー)は、 異なるパスから受信したリソースを分離しないため、あるパスから取得されたリソースが、 別のパスに保存された Cookie にアクセスできる可能性があります。

8.6. 弱い完全性

Cookie は兄弟ドメイン(およびそのサブドメイン)に対する完全性保証を 提供しません。たとえば、foo.site.example と bar.site.example を考えてください。 foo.site.example サーバーは Domain 属性が "site.example" である Cookie を設定でき (bar.site.example によって設定された既存の "site.example" Cookie を上書きする可能性があります)、 ユーザーエージェントはその Cookie を bar.site.example への HTTP リクエストに含めます。 最悪の場合、bar.site.example はこの Cookie を自分自身が設定した Cookie と区別できません。 foo.site.example サーバーは、この能力を利用して bar.site.example に対する攻撃を 仕掛けられる可能性があります。

Set-Cookie ヘッダーフィールドは Path 属性をサポートしていますが、 ユーザーエージェントは Set-Cookie ヘッダーフィールド内の任意の Path 属性を 受け入れるため、Path 属性は完全性保護を提供しません。たとえば、 http://site.example/foo/bar へのリクエストに対する HTTP レスポンスは、 Path 属性が "/qux" である Cookie を設定できます。したがって、サーバーは 同じホストの異なるパスで相互に信頼しないサービスを実行し、かつセキュリティ上 機微な情報を Cookie に保存する、ということを同時に行うべきではありません。

能動的なネットワーク攻撃者は、http://site.example/ からのレスポンスを 偽装し、Set-Cookie ヘッダーフィールドを注入することで、https://site.example/ へ送信される Cookie ヘッダーフィールドにも Cookie を注入できます。site.example の HTTPS サーバーは、 これらの Cookie を自分自身が HTTPS レスポンスで設定した Cookie と区別できません。 能動的なネットワーク攻撃者は、site.example が HTTPS のみを使用している場合であっても、 この能力を利用して site.example に対する攻撃を仕掛けられる可能性があります。

サーバーは、Cookie の内容を暗号化し署名するか、 __Secure- 接頭辞を持つ名前を Cookie に付けることで、 これらの攻撃を部分的に軽減できます。しかし、暗号を使用しても問題を完全には 軽減できません。なぜなら、攻撃者は本物の site.example サーバーから受け取った Cookie を ユーザーのセッション内で再生でき、予測不能な結果をもたらす可能性があるためです。

最後に、攻撃者は大量の Cookie を保存することで、 ユーザーエージェントに Cookie を削除させられる可能性があります。 ユーザーエージェントが保存上限に達すると、ユーザーエージェントは一部の Cookie を 削除せざるを得なくなります。サーバーは、ユーザーエージェントが Cookie を保持することに 依存するべきではありません。

8.7. DNS への依存

Cookie はセキュリティを Domain Name System(DNS)に依存します。 DNS が部分的または完全に侵害された場合、Cookie プロトコルはアプリケーションが 必要とするセキュリティ特性を提供できなくなる可能性があります。

8.8. SameSite Cookie

8.8.1. 多層防御

"SameSite" Cookie は、strict mode で展開され、かつクライアントによって サポートされている場合、CSRF 攻撃に対する堅牢な防御を提供します。 ただし、same-site navigation や submission は、cross-site scripting や ページリダイレクトの悪用など他の攻撃ベクトルと組み合わせて確実に実行できるため、 この指定がサイトの CSRF 防御のすべてにならないようにすることが賢明です。

リクエストがいつ、どのように same-site と見なされるかを理解することも、 SameSite Cookie 向けにサイトを適切に設計するうえで重要です。たとえば、 機微なページへの cross-site top-level request が行われた場合、そのリクエストは cross-site と見なされ、SameSite=Strict Cookie は送信されません。 しかし、そのページのサブリソースリクエストは same-site であり、 SameSite=Strict Cookie を受け取ります。サイトは、初期ページリクエストに 適切な Cookie が含まれていない場合にエラーを返すことで、これらのサブリソースへの アクセスを意図せず許可することを避けられます。

開発者は、リスクをより完全に軽減するために、 通常のサーバー側防御(CSRF トークン、"safe" HTTP メソッドが冪等であることの保証など)を 展開することが強く推奨されます。

さらに、[app-isolation] で説明されるようなクライアント側技法も CSRF に対して有効である可能性があり、 "SameSite" Cookie と組み合わせて検討する価値があります。

8.8.2. トップレベル ナビゲーション

SameSite 属性を "strict" mode に設定すると、 CSRF 攻撃に対する堅牢な多層防御が提供されますが、サイトの開発者が Cookie ベースのセッション管理システムがトップレベルナビゲーションを合理的に扱うことを 慎重に保証しない限り、ユーザーを混乱させる可能性があります。

ユーザーが MegaCorp Inc の Web メールプロバイダー https://site.example/ でメールを読んでいるシナリオを考えてください。 ユーザーは、メール内の https://projects.example/secret/project へのリンクを クリックすれば、閲覧する権限を持つ秘密プロジェクトが表示されることを期待するかもしれません。 しかし、https://projects.example がセッション Cookie を SameSite=Strict としてマークしている場合、この cross-site navigation は それらをリクエストとともに送信しません。https://projects.example は 秘密情報の漏えいを避けるため 404 エラーを表示し、ユーザーは非常に混乱するでしょう。

開発者は、1 つではなく 2 つの Cookie に依存するセッション管理システムを 採用することで、この混乱を避けられます。1 つは概念的に "read" アクセスを付与し、 もう 1 つは "write" アクセスを付与します。後者は SameSite=Strict として マークでき、その不在は非冪等な操作を実行する前に再認証ステップを促します。 前者は、ユーザーがトップレベルナビゲーション経由でデータにアクセスできるようにするために SameSite=Lax としてマークするか、すべてのコンテキスト(cross-site embedded context を含む)でアクセスを許可するために SameSite=None として マークできます。

8.8.3. マッシュアップと ウィジェット

SameSite 属性の Lax および Strict 値は、いくつかの重要なユースケースには不適切です。 特に、cross-site context への埋め込みを意図したコンテンツ (たとえばソーシャルネットワーキングウィジェットやコメントサービス)は、 same-site Cookie へアクセスできないことに注意してください。これらの状況で 必要とされる Cookie は、cross-site context でのアクセスを許可するために SameSite=None としてマークされるべきです。

同様に、一部の Single-Sign-On 形式では、cross-site context における Cookie ベースの認証が必要となる場合があります。これらの機構は same-site Cookie では 意図どおりに機能せず、同じく SameSite=None を必要とします。

8.8.4. サーバー制御

SameSite Cookie はそれ自体では、 Section 7.1 of [RFC6265] で概説される 一般的なプライバシー上の懸念に対処しません。"SameSite" 属性はサーバーによって設定され、 サーバーが懸念する特定の種類の攻撃のリスクを軽減する役割を果たします。 ユーザーはこの決定に関与しません。さらに、Cookie が存在しない場合でも サーバーが別個のリクエストを関連付けられるようにする複数のサイドチャネルが存在します (たとえば、same-site リクエストと cross-site リクエスト間の接続および/または ソケットプーリング)。

8.8.5. 再読み込みナビゲーション

ユーザーインターフェイス要素(ツールバーの更新ボタンなど)を通じて トリガーされた再読み込みのために発行されるリクエストは、再読み込みされる文書が もともと same-site リクエストによってナビゲートされた場合にのみ same-site です。 これは、他の再読み込みナビゲーションの扱いとは異なります。他の再読み込みナビゲーションは、 top-level であれば常に same-site です。なぜなら、source navigable の active document は まさに再読み込みされている document だからです。

ユーザーインターフェイス要素を通じてトリガーされた再読み込みのこの特別な扱いは、 元のナビゲーションで SameSite Cookie が保留された場合 (すなわち、初期ナビゲーションが cross-site だった場合)に、ユーザー開始の再読み込みで SameSite Cookie を送信することを避けます。再読み込みナビゲーションが 代わりに same-site と見なされ、初期に保留されたすべての SameSite Cookie が 送信されると、最初に Cookie を保留したことによるセキュリティ上の利点は無効化されます。 これは、cross-site ナビゲーションリクエストで保留された SameSite Cookie の 不在が、ユーザーに見えるサイトの破損につながり、ユーザーに再読み込みを促す可能性があることを 考えると特に重要です。

たとえば、ユーザーが https://attacker.example/ から https://victim.example/ への リンクをクリックしたとします。これは cross-site リクエストであるため、 SameSite=Strict Cookie は保留されます。これにより https://victim.example/ が壊れて見えるとします。なぜなら、そのサイトは 特定の SameSite Cookie がリクエスト内に存在する場合にのみ 機微なコンテンツを表示するからです。予期せず壊れたサイトに苛立ったユーザーは、 ブラウザーのツールバーで更新を押します。この時点で再読み込みリクエストを same-site と見なし、 初期に保留された SameSite Cookie を送信すると、そもそもそれを保留した目的を 損なうことになります。ユーザーインターフェイスを通じてトリガーされた再読み込みナビゲーションは、 元の(潜在的に悪意ある)リクエストを再生する可能性があるためです。したがって、 再読み込みリクエストは、最初にページへナビゲートしたリクエストと同様に cross-site と見なされるべきです。

ユーザー開始でない再読み込みのために発行されるリクエストは すべての SameSite Cookie を付加するため、開発者は CSRF 攻撃を避けるために、 いつ再読み込みを開始するかについて注意深く思慮深くあるべきです。 たとえば、ページは初期リクエストに CSRF トークンが存在する場合にのみ 再読み込みを開始できます。

8.8.6. "unsafe" メソッドによる トップレベルリクエスト

Section 5.6.7.1 で説明される "Lax" enforcement mode は、 Cookie が cross-site HTTP リクエストとともに送信されることを、そのリクエストが "safe" HTTP メソッドによる top-level navigation である場合に限り許可します。 実装経験は、これをデフォルト挙動として適用することが難しいことを示しています。 これは、いくつかのサイトが SameSite 属性を明示的に指定しない Cookie が "unsafe" HTTP メソッドによる top-level cross-site リクエストに含まれることに 依存している可能性があるためです(SameSite 属性の導入前がそうであったように)。

たとえば、ログインフローの最後のステップでは、 エンドポイントへの cross-site top-level POST リクエストが関与する場合があります。 このエンドポイントは、ログインを安全に完了するために必要なトランザクション状態情報を含む、 最近作成された Cookie を期待します。そのような Cookie では、"Lax" enforcement は 適切ではありません。unsafe な HTTP リクエストメソッドにより Cookie が除外され、 ログインフロー全体の回復不能な失敗につながるためです。

Section 5.6.7.2 で説明される "Lax-allowing-unsafe" enforcement mode は、"None" と比較して "Lax" enforcement の 保護の一部を維持しつつ、最近作成された Cookie が unsafe な top-level リクエストとともに cross-site で送信されることを許可します。

"Lax" mode のより許容的な変種として、"Lax-allowing-unsafe" mode は必然的に CSRF に対する保護が少なくなります。最終的に、そのような enforcement mode の提供は、デフォルトでの "Lax" enforcement の採用を容易にするための 一時的な移行措置と見なされるべきです。

8.9. Public Suffix List

Cookie の境界はサイトの "registrable domain" に依存し、 それはさらにドメインの public suffix に依存します。

可能な場合はいつでも、ユーザーエージェントは Mozilla プロジェクトが [PSL] で維持しているもののような、 最新の public suffix list を使用するべきです。

そうしないと、悪意ある Cookie または機微な Cookie が registrable domain 間で漏えいする可能性があります。

9. IANA に関する考慮事項

10. 参考文献

10.1. 規範的参考文献

van Kesteren, A., Denicola, D., Farolino, D., Hickson, I., Jägenstedt, P., and S. Pieters, "HTML - Living Standard", n.d., <https://html.spec.whatwg.org/#dom-document-cookie>. WHATWG
[HTTP]
Fielding, R., Ed., Nottingham, M., Ed., and J. Reschke, Ed., "HTTP Semantics", STD 97, RFC 9110, DOI 10.17487/RFC9110, , <https://www.rfc-editor.org/rfc/rfc9110>.
[RFC1034]
Mockapetris, P., "Domain names - concepts and facilities", STD 13, RFC 1034, DOI 10.17487/RFC1034, , <https://www.rfc-editor.org/rfc/rfc1034>.
[RFC1123]
Braden, R., Ed., "Requirements for Internet Hosts - Application and Support", STD 3, RFC 1123, DOI 10.17487/RFC1123, , <https://www.rfc-editor.org/rfc/rfc1123>.
[RFC2119]
Bradner, S., "Key words for use in RFCs to Indicate Requirement Levels", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/rfc/rfc2119>.
[RFC4790]
Newman, C., Duerst, M., and A. Gulbrandsen, "Internet Application Protocol Collation Registry", RFC 4790, DOI 10.17487/RFC4790, , <https://www.rfc-editor.org/rfc/rfc4790>.
[RFC5234]
Crocker, D., Ed. and P. Overell, "Augmented BNF for Syntax Specifications: ABNF", STD 68, RFC 5234, DOI 10.17487/RFC5234, , <https://www.rfc-editor.org/rfc/rfc5234>.
[RFC5890]
Klensin, J., "Internationalized Domain Names for Applications (IDNA): Definitions and Document Framework", RFC 5890, DOI 10.17487/RFC5890, , <https://www.rfc-editor.org/rfc/rfc5890>.
[RFC6454]
Barth, A., "The Web Origin Concept", RFC 6454, DOI 10.17487/RFC6454, , <https://www.rfc-editor.org/rfc/rfc6454>.
[RFC8126]
Cotton, M., Leiba, B., and T. Narten, "Guidelines for Writing an IANA Considerations Section in RFCs", BCP 26, RFC 8126, DOI 10.17487/RFC8126, , <https://www.rfc-editor.org/rfc/rfc8126>.
[RFC8174]
Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/rfc/rfc8174>.
[SAMESITE]
van Kesteren, A., Denicola, D., Farolino, D., Hickson, I., Jägenstedt, P., and S. Pieters, "HTML Living Standard", n.d., <https://html.spec.whatwg.org/#same-site>. WHATWG
[USASCII]
American National Standards Institute, "Coded Character Set -- 7-bit American Standard Code for Information Interchange", ANSI X3.4, .

10.2. 参考情報

[Aggarwal2010]
Aggarwal, G., Burzstein, E., Jackson, C., and D. Boneh, "An Analysis of Private Browsing Modes in Modern Browsers", , <http://www.usenix.org/events/sec10/tech/full_papers/Aggarwal.pdf>.
[app-isolation]
Chen, E., Bau, J., Reis, C., Barth, A., and C. Jackson, "App Isolation - Get the Security of Multiple Browsers with Just One", , <http://www.collinjackson.com/research/papers/appisolation.pdf>.
[CSRF]
Barth, A., Jackson, C., and J. Mitchell, "Robust Defenses for Cross-Site Request Forgery", DOI 10.1145/1455770.1455782, ISBN 978-1-59593-810-7, ACM CCS '08: Proceedings of the 15th ACM conference on Computer and communications security (pages 75-88), , <http://portal.acm.org/citation.cfm?id=1455770.1455782>.
[FETCH]
van Kesteren, A., "Fetch Living Standard", n.d., <https://fetch.spec.whatwg.org/>. WHATWG
[HTML]
van Kesteren, A., Denicola, D., Farolino, D., Hickson, I., Jägenstedt, P., and S. Pieters, "HTML Living Standard", n.d., <https://html.spec.whatwg.org/>. WHATWG
[HttpFieldNameRegistry]
"Hypertext Transfer Protocol (HTTP) Field Name Registry", n.d., <https://www.iana.org/assignments/http-fields/>.
[prerendering]
Bentzel, C., "Chrome Prerendering", n.d., <https://www.chromium.org/developers/design-documents/prerender>.
[PSL]
"Public Suffix List", n.d., <https://publicsuffix.org/list/>.
[RFC2109]
Kristol, D. and L. Montulli, "HTTP State Management Mechanism", RFC 2109, DOI 10.17487/RFC2109, , <https://www.rfc-editor.org/rfc/rfc2109>.
[RFC3986]
Berners-Lee, T., Fielding, R., and L. Masinter, "Uniform Resource Identifier (URI): Generic Syntax", STD 66, RFC 3986, DOI 10.17487/RFC3986, , <https://www.rfc-editor.org/rfc/rfc3986>.
[RFC4648]
Josefsson, S., "The Base16, Base32, and Base64 Data Encodings", RFC 4648, DOI 10.17487/RFC4648, , <https://www.rfc-editor.org/rfc/rfc4648>.
[RFC6265]
Barth, A., "HTTP State Management Mechanism", RFC 6265, DOI 10.17487/RFC6265, , <https://www.rfc-editor.org/rfc/rfc6265>.
[RFC7034]
Ross, D. and T. Gondrom, "HTTP Header Field X-Frame-Options", RFC 7034, DOI 10.17487/RFC7034, , <https://www.rfc-editor.org/rfc/rfc7034>.
[RFC9113]
Thomson, M., Ed. and C. Benfield, Ed., "HTTP/2", RFC 9113, DOI 10.17487/RFC9113, , <https://www.rfc-editor.org/rfc/rfc9113>.
[RFC9114]
Bishop, M., Ed., "HTTP/3", RFC 9114, DOI 10.17487/RFC9114, , <https://www.rfc-editor.org/rfc/rfc9114>.
[SERVICE-WORKERS]
Archibald, J. and M. Kruisselbrink, "Service Workers", n.d., <https://www.w3.org/TR/service-workers/>.
[TLS13]
Rescorla, E., "The Transport Layer Security (TLS) Protocol Version 1.3", RFC 8446, DOI 10.17487/RFC8446, , <https://www.rfc-editor.org/rfc/rfc8446>.

Appendix A. RFC 6265 からの変更点

謝辞

RFC 6265 は Adam Barth によって書かれました。この文書は RFC 6265 の更新であり、 機能を追加し、仕様を今日の展開の現実に合わせています。ここでは、本文の大部分が 依然として Adam のものであるため、私たちは巨人の肩の上に立っています。

このドラフトの改善に大きく貢献した名誉編集者の Lily Chen と Steven Englehardt の 両名に感謝します。

著者の連絡先

Steven Bingler (編集者)
Mike West (編集者)
Google LLC
John Wilander (編集者)
Apple, Inc