| インターネットドラフト | Cookie: HTTP 状態管理機構 | 2026年7月 |
| Bingler, et al. | 2027年1月2日に失効 | [ページ] |
本文書は、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日に失効する。¶
Copyright (c) 2026 IETF Trust and the persons identified as the document authors. All rights reserved.¶
This document is subject to BCP 78 and the IETF Trust's Legal Provisions Relating to IETF Documents (https://trustee.ietf.org/license-info) in effect on the date of publication of this document. Please review these documents carefully, as they describe your rights and restrictions with respect to this document. Code Components extracted from this document must include Revised BSD License text as described in Section 4.e of the Trust Legal Provisions and are provided without warranty as described in the Revised BSD License.¶
This document may contain material from IETF Documents or IETF Contributions published or made publicly available before November 10, 2008. The person(s) controlling the copyright in some of this material may not have granted the IETF Trust the right to allow modifications of such material outside the IETF Standards Process. Without obtaining an adequate license from the person(s) controlling the copyright in such materials, this document may not be modified outside the IETF Standards Process, and derivative works of it may not be created outside the IETF Standards Process, except to format it for publication as an RFC or to translate it into languages other than English.¶
この文書は 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 処理アルゴリズムでさえ、現在使用されている すべての構文的および意味的な変種を推奨するものではありません。 推奨されるプロトコルと大きく異なる既存ソフトウェアがある場合、この文書には その違いを説明する注記が含まれます。¶
この文書におけるキーワード "MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"NOT RECOMMENDED"、 "MAY"、および "OPTIONAL" は、ここに示すようにすべて大文字で現れる場合に限り、 BCP 14 [RFC2119] [RFC8174] で説明されるように 解釈されるものとします。¶
アルゴリズムの一部として命令形で表現された要件(たとえば「先頭の空白文字をすべて 取り除く」や「false を返してこのアルゴリズムを中止する」など)は、 そのアルゴリズムを導入する際に使用されたキーワード("MUST"、"SHOULD"、"MAY" など)の 意味で解釈されます。¶
アルゴリズムまたは特定のステップとして表現された適合要件は、 最終結果が等価である限り、任意の方法で実装できます。特に、 この仕様で定義されるアルゴリズムは理解しやすいことを意図しており、 高性能であることを意図していません。¶
この仕様は、 [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 で定義されます。¶
"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 メソッドには、GET、HEAD、
OPTIONS、および 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 のナビゲーションを指します。¶
この節では、オリジンサーバーが状態情報をユーザーエージェントへ送信し、 ユーザーエージェントがその状態情報をオリジンサーバーへ返すための方法を概説します。¶
状態を保存するため、オリジンサーバーは 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] 文字以外のものとして解釈しようとしてはなりません。¶
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¶
次の 2 つの節、Section 4 と Section 5 は、 2 つの異なる種類の実装に対する要件の集合について説明します。この節は、 実装者が自分たちの目的に最も適した要件の集合を判断するための手引きとなることを 意図しています。誤った要件の集合を選択すると、他の Cookie 実装との 互換性が失われる可能性があります。¶
互換性があることの意味は、実装者の目的によって異なることに注意することが重要です。 これらの違いは、意図的および非意図的な仕様変更、仕様解釈、 ならびに歴史的な実装差異により、時間をかけて蓄積されてきました。¶
この節では、Cookie 仕様の実装者を大まかに producer と consumer の 2 種類に分けます。 これらは公式な用語ではなく、読者がユースケースを直感的に理解するのを助けるために ここでのみ使用されます。¶
この節は、これらの要件を正確に実装するユーザーエージェントが、 既存のサーバー(Section 4 で説明される 良好に振る舞うプロファイルに適合しないサーバーを含む)と相互運用できるように、 Cookie および Set-Cookie ヘッダーフィールドを十分な詳細で規定します。¶
ユーザーエージェントは、ここで規定されるものよりも多くの制限 (たとえば、Section 7.2 で説明される Cookie ポリシーで規定される制限)を 強制してもかまいません。ただし、そのような追加の制限は、ユーザーエージェントが 既存のサーバーと相互運用できる可能性を低下させることがあります。¶
この節は、ユーザーエージェントが Cookie および Set-Cookie ヘッダーフィールドの特定のサブコンポーネントを処理するために使用する いくつかのアルゴリズムを定義します。¶
正規化されたホスト名は、以下のアルゴリズムによって生成される 文字列です。¶
ホスト名を個々のドメイン名ラベルの列に変換します。¶
すべてのラベルは、U-label、A-label、または Non-Reserved LDH(NR-LDH)label のいずれかでなければなりません (Section 2.3.1 of [RFC5890] を参照)。いずれかのラベルが これらのいずれでもない場合、このアルゴリズムを中止し、 ホスト名の正規化に失敗します。¶
各 U-label を A-label に変換します (Section 2.3.2.1 of [RFC5890] を参照)。¶
いずれかのラベルが Fake A-label である場合、 このアルゴリズムを中止し、ホスト名の正規化に失敗します。¶
結果のラベルを、%x2E(".")文字で区切って連結します。¶
2 つの origin は、[SAMESITE] で定義される "same site" 基準を満たす場合、same-site です。リクエストは、 以下の基準が真である場合に "same-site" です。¶
そのリクエストが、ユーザーインターフェイス要素を通じて トリガーされた再読み込みナビゲーションの結果ではないこと (ユーザーエージェントによって定義される。例:ユーザーがツールバーの 更新ボタンをクリックしたことによってトリガーされるリクエスト)。¶
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 の種類に応じて計算されます。¶
ユーザーエージェントのアドレスバーに表示される 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" を返します。¶
top-document を、
document の navigable の top-level traversable における
active document とします。¶
top-origin を、
top-document の sandboxed origin browsing context flag が設定されている場合は
top-document の URI の origin とし、それ以外の場合は
top-document の origin とします。¶
documents を、
document の inclusive ancestor navigables の
active documents からなるリストとします。¶
documents 内の各 item について、¶
top-origin を返します。¶
注記:このアルゴリズムは、top-document から
document までの文書のチェーン全体がすべて active である場合にのみ
適用されます。¶
Worker によって駆動されるリクエストは、 document によって駆動されるリクエストほど明確ではありません。 top-level traversable と worker の間に明確な関連がないためです。 これは、可視の document がまったくない状態でバックグラウンドでコードを実行し得る Service Workers [SERVICE-WORKERS] において特に当てはまります。¶
Service Workers はより複雑です。なぜなら、 それらを登録した Document とは間接的な関係しかない、 完全に別個の実行コンテキストとして動作するためです。¶
ユーザーエージェントが Service Workers を扱う方法は異なり得ますが、 ユーザーエージェントは [SERVICE-WORKERS] 仕様に一致させるべきです。¶
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=/¶
ユーザーエージェントは、各 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 を次のように処理しなければなりません。¶
ユーザーエージェントは、受信した Cookie 全体を無視してもかまいません。 Section 5.3 を参照してください。¶
cookie-name が空で、かつ cookie-value も空である場合、 このアルゴリズムを中止し、その Cookie 全体を無視します。¶
cookie-name または cookie-value が %x00-08 / %x0A-1F / %x7F 文字(HTAB を除く CTL 文字)を含む場合、 このアルゴリズムを中止し、その Cookie 全体を無視します。¶
cookie-name と cookie-value の長さの合計が 4096 オクテットを超える場合、このアルゴリズムを中止し、その Cookie 全体を無視します。¶
name が cookie-name、value が cookie-value である新しい Cookie を作成します。 creation-time と last-access-time を現在の日付と時刻に設定します。¶
cookie-attribute-list が attribute-name "Max-Age" を持つ属性を含む場合、¶
Cookie の persistent-flag を true に設定します。¶
Cookie の expiry-time を、cookie-attribute-list 内で attribute-name が "Max-Age" である最後の属性の attribute-value に設定します。¶
それ以外で、cookie-attribute-list が attribute-name "Expires" を持つ属性を含み (かつ attribute-name "Max-Age" を持つ属性を含まない)場合、¶
Cookie の persistent-flag を true に設定します。¶
Cookie の expiry-time を、cookie-attribute-list 内で attribute-name が "Expires" である最後の属性の attribute-value に設定します。¶
それ以外の場合、¶
cookie-attribute-list が attribute-name "Domain" を持つ属性を含む場合、¶
domain-attribute を、cookie-attribute-list 内で attribute-name が "Domain" であり、かつ attribute-value の 長さが 1024 オクテット以下である最後の属性の attribute-value とします。 (先頭の %x2E(".")が存在する場合、その文字は許可されていないにもかかわらず 無視されることに注意してください。)¶
それ以外の場合、¶
domain-attribute を空文字列とします。¶
domain-attribute が CHAR に含まれない文字を含む場合、 このアルゴリズムを中止し、その Cookie 全体を無視します。¶
ユーザーエージェントが "public suffixes" を拒否するよう構成されており、 domain-attribute が public suffix である場合、¶
request-host-canonical を正規化された request-host とします。¶
request-host の正規化に失敗した場合、 このアルゴリズムを中止し、その Cookie 全体を無視します。¶
domain-attribute が request-host-canonical と同一である場合、¶
domain-attribute を空文字列とします。¶
それ以外の場合、¶
このアルゴリズムを中止し、その Cookie 全体を無視します。¶
注記:このステップは、attacker.example が Domain 属性 "example" を持つ
Cookie を設定することで site.example の完全性を損なうことを防ぎます。¶
domain-attribute が空でない場合、¶
request-host-canonical が domain-attribute に domain-match(Section 5.1.3 参照)しない場合、¶
このアルゴリズムを中止し、 その Cookie 全体を無視します。¶
それ以外の場合、¶
それ以外の場合、¶
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 に設定します。¶
cookie-attribute-list が attribute-name "Secure" を持つ属性を含む場合、 Cookie の secure-only-flag を true に設定します。 それ以外の場合、Cookie の secure-only-flag を false に設定します。¶
request-uri が(ユーザーエージェントによって定義される) "secure" 接続を表さず、かつ Cookie の secure-only-flag が true である場合、 これらのステップを中止し、その Cookie 全体を無視します。¶
cookie-attribute-list が attribute-name "HttpOnly" を持つ属性を含む場合、 Cookie の http-only-flag を true に設定します。 それ以外の場合、Cookie の http-only-flag を false に設定します。¶
Cookie が "non-HTTP" API から受信され、かつ Cookie の http-only-flag が true である場合、このアルゴリズムを中止し、その Cookie 全体を無視します。¶
Cookie の secure-only-flag が false であり、request-uri が "secure" 接続を表さない場合、Cookie ストアが以下の基準をすべて満たす 1 つ以上の Cookie を含むなら、このアルゴリズムを中止し、その Cookie 全体を無視します。¶
それらの name が新しく作成された Cookie の name と一致する。¶
それらの secure-only-flag が true である。¶
それらの domain が、新しく作成された Cookie の domain に domain-match(Section 5.1.3 参照)するか、 またはその逆である。¶
新しく作成された 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 に対しては設定できません。¶
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" に設定します。¶
Cookie の same-site-flag が "None" でない場合、¶
Cookie が "non-HTTP" API から受信され、 その API が、"site for cookies" が top-level origin と same-site でない navigable の active document から呼び出された場合、 このアルゴリズムを中止し、新しく作成された Cookie 全体を無視します。¶
Cookie が(Section 5.2 で定義される) "same-site" リクエストから受信された場合、残りのサブステップをスキップして、 Cookie の処理を続行します。¶
Cookie が top-level traversable [HTML]
をナビゲートしているリクエストから受信された場合
(たとえば、リクエストの "reserved
client" が null、または "target browsing
context" の navigable が top-level traversable である環境のいずれかである場合)、
残りのサブステップをスキップして、Cookie の処理を続行します。¶
注記:Top-level navigation は、たとえ新しい Cookie がそのナビゲーションの前に
すでに存在していたとしても、そのリクエストとともに送信されなかったような場合であっても、
任意の SameSite 値を持つ Cookie を作成できます。¶
このアルゴリズムを中止し、 新しく作成された Cookie 全体を無視します。¶
Cookie の "same-site-flag" が "None" である場合、 Cookie の secure-only-flag が true でない限り、このアルゴリズムを中止し、 その Cookie 全体を無視します。¶
cookie-name が文字列 "__Secure-" と大文字小文字を区別せずに一致するもので 始まる場合、Cookie の secure-only-flag が true でない限り、 このアルゴリズムを中止し、その Cookie 全体を無視します。¶
cookie-name が文字列 "__Host-" と大文字小文字を区別せずに一致するもので 始まる場合、Cookie が以下の基準をすべて満たさない限り、 このアルゴリズムを中止し、その Cookie 全体を無視します。¶
cookie-name が空であり、かつ次のいずれかの条件が true である場合、このアルゴリズムを中止し、その Cookie 全体を無視します。¶
Cookie ストアが、新しく作成された Cookie と同じ name、domain、 host-only-flag、および path を持つ Cookie を含む場合、¶
old-cookie を、新しく作成された Cookie と同じ name、domain、host-only-flag、および path を持つ既存の Cookie とします。 (このアルゴリズムは、そのような Cookie が最大 1 つしか存在しないという 不変条件を維持することに注意してください。)¶
新しく作成された Cookie が "non-HTTP" API から受信され、 old-cookie の http-only-flag が true である場合、このアルゴリズムを中止し、 新しく作成された Cookie 全体を無視します。¶
新しく作成された Cookie の creation-time を、 old-cookie の creation-time と一致するように更新します。¶
old-cookie を Cookie ストアから削除します。¶
新しく作成された Cookie を Cookie ストアに挿入します。¶
Cookie の expiry date が過去である場合、その Cookie は「期限切れ」です。¶
Cookie ストア内に期限切れの Cookie が存在する場合、ユーザーエージェントは いつでも Cookie ストアからすべての期限切れ Cookie を削除しなければなりません。¶
ある domain フィールドを共有する Cookie の数が、何らかの 実装定義の上限(たとえば 50 個の Cookie)を超える場合、ユーザーエージェントは いつでも Cookie ストアから「過剰な Cookie を削除」してもかまいません。¶
Cookie ストアが何らかの所定の上限(たとえば 3000 個の Cookie)を超える場合、ユーザーエージェントはいつでも Cookie ストアから 「過剰な Cookie を削除」してもかまいません。¶
ユーザーエージェントが Cookie ストアから過剰な Cookie を削除する場合、 ユーザーエージェントは次の優先順位で Cookie を削除しなければなりません。¶
期限切れの Cookie。¶
secure-only-flag が false であり、かつ所定の数より多い 他の Cookie と domain フィールドを共有する Cookie。¶
所定の数より多い他の Cookie と domain フィールドを 共有する Cookie。¶
すべての Cookie。¶
2 つの Cookie が同じ削除優先度を持つ場合、 ユーザーエージェントは last-access-time が最も早い Cookie から先に削除しなければなりません。¶
「現在のセッションが終了したとき」(ユーザーエージェントによって定義)、 ユーザーエージェントは persistent-flag が false に設定されたすべての Cookie を Cookie ストアから削除しなければなりません。¶
この節は、Cookie ストアから Cookie を cookie-string の形で取得する方法を 定義します。「取得」とは、cookie-string の生成を必要とする任意のイベントです。 たとえば、取得は HTTP リクエスト用の Cookie ヘッダーフィールドを構築するために 発生することもあれば、Cookie へのアクセスを提供する "non-HTTP" API の呼び出しから cookie-string を返すために必要になることもあります。取得には関連付けられた URI、 same-site status、および type があり、それらは取得の種類に応じて以下で定義されます。¶
ユーザーエージェントは、保存された 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" です。¶
Cookie ストアと取得が与えられたとき、以下のアルゴリズムは 与えられた Cookie ストアから cookie-string を返します。¶
retrieval-host-canonical を、 取得の URI の正規化されたホストとします。¶
取得の URI のホストの正規化に失敗した場合、 このアルゴリズムを中止します。¶
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 を除外する。¶
ユーザーエージェントは、cookie-list を次の順序で ソートするべきです。¶
path が長い Cookie は、 path が短い Cookie より前に並べられます。¶
path フィールドの長さが等しい Cookie の間では、 creation-time が早い Cookie が、creation-time が遅い Cookie より前に並べられます。¶
注記:すべてのユーザーエージェントがこの順序で cookie-list をソートするわけではありませんが、 この順序はこの文書が書かれた時点での一般的な慣行を反映しており、歴史的には この順序に(誤って)依存するサーバーが存在していました。¶
cookie-list 内の各 Cookie の last-access-time を 現在の日付と時刻に更新します。¶
cookie-list 内の各 Cookie を順に処理して、 cookie-list を cookie-string に直列化します。¶
実用的なユーザーエージェント実装には、保存できる Cookie の数とサイズに 制限があります。汎用のユーザーエージェントは、次の各最小能力を提供するべきです。¶
ユーザーエージェントは、保存する Cookie の最大数を制限してもよく、 (ユーザーの要求によるか、実装上の制限によるかにかかわらず) 任意の Cookie をいつでも削除してもかまいません。¶
Cookie の最大数に対する制限は、Section 5.6 で 強制されなければならない長さ制限により、保存される Cookie の総サイズも 制限することに注意してください。¶
サーバーは、これらの実装制限に達することを避け、 Cookie ヘッダーフィールドがすべてのリクエストに含まれることによる ネットワーク帯域幅を最小化し、サーバーのヘッダーフィールド制限に達することを 避けるために(Section 4.2.1 を参照)、可能な限り少数かつ小さな Cookie を使用するべきです。¶
ユーザーエージェントは任意の Cookie をいつでも削除し得るため、 ユーザーエージェントが Cookie ヘッダーフィールドで 1 つ以上の Cookie を返さなかった場合、 サーバーは段階的に機能低下するべきです。¶
Cookie および Set-Cookie ヘッダーフィールドがこれほど難解な扱いを 使用する理由の 1 つは、多くのプラットフォーム(サーバーとユーザーエージェントの両方)が Cookie に対して文字列ベースのアプリケーションプログラミングインターフェイス(API)を 提供しており、アプリケーション層のプログラマーが Cookie および Set-Cookie ヘッダーフィールドで使用される構文を生成および解析する必要があるためです。 多くのプログラマーはこれを誤って行い、相互運用性の問題を引き起こしてきました。¶
Cookie に対して文字列ベースの API を提供する代わりに、 プラットフォームはより意味論的な API を提供することで恩恵を受けます。 具体的な API 設計を推奨することはこの文書の範囲外ですが、 直列化された日付文字列ではなく抽象的な "Date" オブジェクトを受け入れることには 明確な利点があります。¶
Cookie の主要なプライバシーリスクは、ユーザーの活動を関連付けられる能力です。 これは単一のサイト上でも発生し得ますが、異なる、一見無関係な Web サイトをまたいで活動が追跡され、 ユーザープロファイルが構築される場合に最も問題となります。¶
時間の経過とともに、この能力([RFC2109] およびその後継すべてで明示的に警告されている)は、 次のような多様な理由で広く使用されるようになりました。¶
サイトをまたいだユーザー認証、¶
ユーザーに関する情報の集約、¶
不正行為およびその他の望ましくないトラフィック形態からの保護、¶
特定のユーザーまたは指定された属性を持つユーザーへの広告ターゲティング、¶
広告がユーザーに表示される頻度の測定、および¶
広告がユーザー行動の変化をもたらした時点の認識。¶
Cookie のすべての使用が必ずしもプライバシー上問題となるわけではありませんが、 その悪用可能性は、インターネットコミュニティおよびより広い社会において広範な懸念となっています。 これらの懸念に対応して、ユーザーエージェントは(以前の仕様で許可および奨励されているように) さまざまな方法で Cookie 機能を積極的に制限してきました。一方で、Web の健全性にとって望ましいと 判断する機能を妨げることは避けています。¶
Cookie のプライバシーへの影響を軽減するために、どの具体的な機構を使用すべきかについて 合意を宣言するには時期尚早です。ユーザーエージェントが Cookie の扱い方に対して継続的に行っている変更は、 その最終的な合意への入力を提供し得る実験として捉えるのが最も適切です。¶
代わりに、この文書は、執筆時点で広く導入されている Cookie に関連する プライバシーリスクに対する、限定的かつ一般的な軽減策を説明します。実装は今後も実験を続け、 時間とともに Cookie に対してより厳格で、より明確に定義された制限を課すことが期待されます。 この文書の将来のバージョンは、導入経験に基づいてそれらの機構を成文化するかもしれません。 現在 Cookie に依存している機能が、別個の対象を絞った機構によってサポートできるなら、 それらは別個の仕様に文書化され、Cookie に対するより厳格な制限が実現可能になるかもしれません。¶
Cookie はサイトをまたいでユーザーを追跡するために使用できる唯一の機構ではないため、 これらの軽減策は Web プライバシーを改善するために必要ではありますが、それだけで十分ではないことに 注意してください。¶
ユーザーエージェントは、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] として公開しています。¶
Cookie には多くのセキュリティ上の落とし穴があります。この節では、 より顕著ないくつかの問題を概説します。¶
特に、Cookie は開発者が認証のために環境権限に依存することを促し、 cross-site request forgery [CSRF] などの攻撃に脆弱になることがよくあります。また、セッション識別子を Cookie に 保存する場合、開発者はしばしばセッション固定の脆弱性を作り出します。¶
HTTPS で用いられるようなトランスポート層暗号化は、Cookie に対する ネットワーク攻撃への重要な防御層を提供します。しかし、Cookie プロトコル自体に内在する 脆弱性のため、ネットワーク攻撃者が被害者の Cookie を取得または変更することを 完全に防止するには不十分です(後述の「弱い機密性」および「弱い完全性」を参照)。 さらに、デフォルトでは、Cookie は HTTPS と併用される場合であっても、ネットワーク攻撃者に 対する機密性や完全性を提供しません。これは、Cookie が保護属性を明示的に 指定する必要があることを意味します。たとえば、次の Cookie は:¶
Set-Cookie: a=b
¶
Secure 属性を指定していないため、それが作成された元の接続タイプに関係なく、 secure な接続と insecure な接続の両方でアクセス可能になります。この挙動により、 攻撃者が Cookie を読み取ったり変更したりできる可能性があります。¶
TLS [TLS13] のような secure チャネル上で送信されない限り、 Cookie および Set-Cookie ヘッダーフィールド内の情報は平文で送信されます。¶
これらのヘッダーフィールドで伝達されるすべての機微情報は、 盗聴者に公開されます。¶
悪意ある仲介者は、いずれの方向に流れる場合でも ヘッダーフィールドを変更でき、予測不能な結果をもたらす可能性があります。¶
サーバーは、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 を含めなかったでしょう。¶
セッション情報を Cookie に直接保存する代わりに (攻撃者に公開されたり再生されたりする可能性があるため)、 サーバーは一般に nonce(または「セッション識別子」)を Cookie に保存します。 サーバーが nonce を含む HTTP リクエストを受信すると、サーバーは nonce をキーとして Cookie に関連付けられた状態情報を検索できます。¶
セッション識別子 Cookie を使用すると、攻撃者が Cookie の内容を知った場合に 引き起こせる損害を制限できます。これは、nonce がサーバーとのやり取りにのみ有用であるためです (nonce でない Cookie 内容とは異なり、それ自体が機微である可能性があります)。 さらに、単一の nonce を使用すると、攻撃者がサーバーとの 2 つのやり取りから Cookie 内容を「継ぎ合わせる」ことを防ぎ、それによってサーバーが予期しない挙動を する可能性を低減します。¶
セッション識別子の使用にリスクがないわけではありません。たとえば、 サーバーは「セッション固定」脆弱性を避けるよう注意するべきです。 セッション固定攻撃は 3 つのステップで進行します。第一に、攻撃者はセッション識別子を 自分のユーザーエージェントから被害者のユーザーエージェントへ移植します。 第二に、被害者はそのセッション識別子を使用してサーバーとやり取りし、 ユーザーの認証情報または機密情報をセッション識別子に付与する可能性があります。 第三に、攻撃者はそのセッション識別子を使用してサーバーと直接やり取りし、 ユーザーの権限または機密情報を取得する可能性があります。¶
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 にアクセスできる可能性があります。¶
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 を保持することに 依存するべきではありません。¶
same-site の概念と SameSite 属性を追加します。 (Section 5.2 および Section 4.1.2.7)¶
Cookie 接頭辞を導入し、名前のない Cookie が Cookie 接頭辞を模倣する値を 設定することを禁止します。(Section 4.1.3 および Section 5.7)¶
非 secure origin が Secure フラグ付きの Cookie を
設定すること、またはこのフラグ付きの Cookie を上書きすることを禁止します。
(Section
5.7)¶
最大 Cookie サイズを制限します。(Section 5.7)¶
max-age および expire の最大値を制限します。(Section 5.6.1 および Section 5.6.2)¶
Cookie の一意性計算の一部として host-only-flag を含めます。 (Section 5.7)¶
潜在的に信頼できる origin を "secure" と見なします。(Section 5.7)¶
Cookie 構文を改善します¶
Set-Cookie: token を Cookie("", "token")の作成として扱います。 (Section 5.6)¶
名前も値もない Cookie を拒否します。(Section 5.7)¶
名前のない/値のない Cookie をシリアライズする方法を規定します。 (Section 5.8.3)¶
空白を許容するために、cookie-pair および Cookie ヘッダー生成規則の ABNF を調整します。(Section 4.1.1)¶
制御文字を明示的に扱います。(Section 5.6 および Section 5.7)¶
空の domain 属性を処理する方法を規定します。(Section 5.7)¶
domain 属性に ASCII 文字を要求します。(Section 5.7)¶
non-HTTP API をサポートするために Cookie 取得アルゴリズムを再構成します。 (Section 5.8.2)¶
Set-Cookie 行をデコードするべきでないことを規定します。(Section 5.6)¶
実装者がどの要件を実装するかを判断するのを支援する 助言セクションを追加します。(Section 3.2)¶
public suffix list の変更により無効な Cookie を送信しないよう助言します。 (Section 5.8.3)¶
単一 Cookie ヘッダー要件を削除します。(Section 5.8.1)¶
path-value および extension-av 文法を更新することで errata 3444 に対応し、 day-of-month、year、および time 文法を更新することで errata 4148 に対応し、 要求された注記を追加することで errata 3663 に対応します。(Section 4.1 および Section 5.1.4)¶