[11] [[Cookie]] 設定時の [DFN[[CODE(HTTP)@en[[[Path]]]] [[属性]]]]は、[[Cookie]]
が適用される [[URL]] の [[path]] 部分を[[前方一致]]で指定します。

* 仕様書

[REFS[
- [35] [CITE@en[RFC 6265 - HTTP State Management Mechanism]] ([TIME[2012-03-01 09:57:02 +09:00]] 版) <http://tools.ietf.org/html/rfc6265#page-9>
- [37] '''[CITE@en[RFC 6265 - HTTP State Management Mechanism]] ([TIME[2012-03-01 09:57:02 +09:00]] 版) <http://tools.ietf.org/html/rfc6265#section-4.1.2.4>'''
- [1] [CITE@en[RFC 6265 - HTTP State Management Mechanism]] ([TIME[2014-10-12 15:11:47 +09:00]] 版) <http://tools.ietf.org/html/rfc6265#section-5.1.4>
- [7] [CITE@en[RFC 6265 - HTTP State Management Mechanism]] ([TIME[2014-10-12 15:11:47 +09:00]] 版) <http://tools.ietf.org/html/rfc6265#section-5.2.4>
- [44] [CITE@en[RFC 6265 - HTTP State Management Mechanism]] ([TIME[2014-10-12 15:11:47 +09:00]] 版) <http://tools.ietf.org/html/rfc6265#section-5.3>
- [43] [CITE[RFC Errata Report]] ([TIME[2014-11-04 07:53:14 +09:00]] 版) <http://www.rfc-editor.org/errata_search.php?rfc=6265>
]REFS]

* 意味

[38] [CODE(HTTP)@en[[[Path]]]] [[属性]]は[[クッキー]]が適用される範囲となる [[path]] を指定します
[SRC[>>37]]。

[39] [CODE(HTTP)@en[[[Path]]]] [[属性]]が省略された場合、[[要求URL]]の[[ディレクトリー]]部分が既定値として使われます
[SRC[>>37]]。

* 構文

[FIG[
[FIGCAPTION[
[36] [[RFC 6265]] における [CODE(HTTP)@en[[[Path]]]] [[属性]]の定義 [SRC[>>35, >>43]]
]FIGCAPTION]

[PRE[
 path-av           = "Path=" path-value
 path-value        = *<any CHAR except CTLs or ";">
]PRE]
]FIG]

* 構文解析

[8] [[属性値]]が[[空文字列]]か最初の[[文字]]が [CODE[[[/]]]] ''以外''なら、既定パス (>>2)
を使わなければ[['''なりません''']] [SRC[>>7]] (つまり[[属性値]]は無視されます)。
それ以外なら、[[属性値]]を使わなければ[['''なりません''']] [SRC[>>7]]。

* 既定値

[40] [[RFC 6265]] によれば [CODE(HTTP)@en[[[Path]]]] [[属性]]の既定値は当該[[要求]]の [[URL]]
の [[path]] の[[ディレクトリー]]までの部分です。

;; [15] [[Netscape]] の仕様では、
[CODE(HTTP)@en[[[Path]]]] が省略された場合、[[Cookie]] が含まれる[[応答]]が帰ってきた[[要求]]の
[[URL]] の [[path]] と同じとみなされます。 [SRC[>>12]]

[2] [[クッキー]]の[RUBYB[既定パス]@en[default-path]]は、次のようにして決定します [SRC[>>1]]。
[FIG(steps)[
= [3] [[要求URL]]に[[パス]]があればその値、なければ[[空文字列]]とします。
= [4] [[空文字列]]か最初の[[文字]]が [CODE[[[/]]]] で''ない''なら、
[CODE[[[/]]]] を返してここで終わります。
= [5] [CODE[[[/]]]] が1つしかないなら、 [CODE[[[/]]]] を返してここで終わります。
= [6] [[最右]]の [CODE[[[/]]]] の直前までの文字列を返します。
]FIG]

* 処理モデル

[42] [CODE(HTTP)@en[[[Path]]]] [[属性]]があれば、最後の [CODE(HTTP)@en[[[Path]]]]
[[属性]]を構文解析して得られた値を[[クッキー]]の[[パス]]としなければ[['''なりません''']]。
なければ、[[要求URL]]の既定パス (>>2) を[[クッキー]]の[[パス]]としなければ[['''なりません''']]。
[SRC[>>44]]

[19] [[百分率符号化]]、[[非ASCII文字]]や [[URI]] [[RFC]] 
上で認められていない[[文字]]の扱いについては従来仕様上明記されていませんでしたが、
[[RFC 6265]] により特別な扱いはしないと明確化されました。

* セキュリティーに関して

[9] [[HTML5]] の [CODE(JS)@en[[[document.cookie]]]] [[属性]]に関する節の注記 ([[参考]])
には、次のような記述があります。
- [CODE(JS)@en[[[document.cookie]]]] [[属性]]は[[フレーム]]を超えてアクセス可能である
- [[クッキー]]の[[経路]]制限は[[クッキー]]が[[Webサイト]]のどの部分に送られるかの管理を助ける道具に過ぎない
- [[クッキー]]の[[経路]]制限は[[セキュリティー]]のための機能ではない

[REFS[
^[41]  <http://www.whatwg.org/specs/web-apps/current-work/#dom-document-cookie>
]REFS]

* 歴史

[20] この[[属性]]は [[Netscape Cookie]] で当初より規定されていました。

[REFS[
- [12] [[Netscape Cookie]]: [CITE[Client Side State - HTTP Cookies]]
<http://web.archive.org/web/19961125090609/http://www2.netscape.com/newsref/std/cookie_spec.html>
]REFS]

[13] [[Cookie]] が[[妥当]]であるか判断する際、 [CODE(HTTP)@en[[[Domain]]]] 
が[[一致]]すると判断されると次に [CODE(HTTP)@en[[[Path]]]] の比較が行われます。
[[要求]]しようとしている [[URL]] の [[path]] の部分の前方が [CODE(HTTP)@en[[[Path]]]]
[[属性]]の値と一致していれば、 [CODE(HTTP)@en[[[Path]]]] [[属性]]は一致したものとみなされます。
[SRC[>>12]]

[14] この[[一致]]を調べるに当たって [[path]] は不透明なものとして扱われます。つまり、
[CODE(URI)[[[/]]]] による階層の区切りは考慮されません。
[CODE(HTTP)@en[[[Path]]]] [[属性]]の値 [CODE(URI)[[[/foo]]]] は、
[CODE(URI)@en[/foo/bar.html]] だけではなく [CODE(URI)[/foobar]] にも一致します
[SRC[>>12]]。

[16] [[百分率符号化]]の扱いは仕様上明記されていません。

[17] [CODE(URI)[http://foo.example]] のように [[path]] がない (厳密に言えば [[path]]
が[[空文字列]]である) [[URL]] もありますが、[[HTTP]] [[要求メッセージ]]上の [[Request-URI]]
は [CODE(URI)@en[[[/]]]] になります。これに一致する [CODE(HTTP)@en[[[Path]]]] は
[CODE(URI)@en[[[/]]]] です。[CODE(URI)@en[[[/]]]] はその[[ホスト]]のすべての [[URL]]
に一致することになります。

[18] [CODE(HTTP)@en[[[Path]]]] [[属性]]の値が[[空文字列]]である時の扱いは明記されていません。

** IETF Cookie

[21] 後に [[IETF]] で標準化された [CODE(HTTP)@en[[[Set-Cookie:]]]] ([[RFC 2109]])、
[CODE(HTTP)@en[[[Set-Cookie2:]]]] ([[RFC 2965]]) でも [[Netscape]] と似たような定義となっています。

;; ただ [[IETF]] の仕様は [[Netscape Cookie]] とは互換性がありません。
[[属性]]の値はそのまま記述するのではなく、
[RUBYB[[[字句]]]@en[[[token]]]]または[RUBYB[[[引用文字列]]]@en[[[quoted-string]]]]とする必要があります。

[28] [[RFC 2109]] では、[CODE(HTTP)@en[[[Path]]]] が省略された場合、当該[[要求]]の [[path]]
の一番最後の [CODE(URI)[[[/]]]] の''直前''までが[[既定値]]とされていました [SRC[>>25]]。

[29] [[RFC 2965]] では、 [CODE(HTTP)@en[[[Path]]]] が省略された場合、当該[[要求]]の [[path]]
の一番最後の [CODE(URI)[[[/]]]] ''まで''が[[既定値]]とされていました [SRC[>>26]]。

;; [32] [[RFC 2109]]、[[RFC 2965]] では、[CODE(HTTP)@en[[[Path]]]] が [[request-URI]]
の[[接頭辞]]でない場合にはその [[Cookie]] 
を[RUBYB[[[蓄積]]]@en[store]]しては[['''ならない''']]とされていました [SRC[>>31, >>30]]。
;; [33] [[RFC 2109]]、[[RFC 2965]] の定義では「[[request-URI]]」は [[path]]
部分のことです。

[REFS[
- [22] [DEL[[[RFC 2109]]]] ([[廃止]]済み)
-- [24] '''[CSECTION@en[4.2.2 Set-Cookie Syntax]]'''
-- [25] [CSECTION@en[4.3.1 Interpreting Set-Cookie]]
-- [31] [CSECTION@en[4.3.2. Rejecting Cookies]]
- [23] [[RFC 2965]]
-- [27] '''[CSECTION@en[3.2.2 Set-Cookie2 Syntax]]'''
-- [26] [CSECTION@en[3.3.1 Interpreting Set-Cookie2]]
-- [30] [CSECTION@en[3.3.2 Rejecting Cookies]]
]REFS]

* 関連

[34] [[RFC 2109]]、[[RFC 2965]] では[[利用者エージェント]]が返送する時に
[CODE(HTTP)@en[[[Cookie:]]]] に [CODE(HTTP)@en[[[$Path]]]] [[属性]]として含めることになっていました。

* メモ

[10] [CITE@ja[Javascriptのdocument.cookieのpath]] ([TIME[2009-02-01 19:38:32 +09:00]] 版) <http://www.synck.com/contents/technote/technote_1230518860.html>

>document.cookieで四苦八苦しておりまして、Safari、Firefox、Chromeではちゃんと動くのにIE6とIE7では動かないという事態に直面した際の話です。
>
端的に申しますとdocument.cookieのpathはIEに関してはフォルダ単位でしか動きません。
そのほかのモダンブラウザではちゃんと動きます。ほとほとIEには困ったものです。
>
なので、location.pathnameを直接pathに通すとcookieが書き込まれないという事態に陥る

[FIG(quote)[
[FIGCAPTION[
[45] [CITE[Classic Load Balancer のスティッキーセッションの設定 - Elastic Load Balancing]]
([TIME[2020-09-26T04:07:28.000Z]], [TIME[2020-10-01T01:52:14.732Z]])
<https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/classic/elb-sticky-sessions.html>
]FIGCAPTION]

> Elastic Load Balancing の URI はアンダースコア文字を %5F とエンコードします。Internet Explorer 7 などの一部のブラウザーでは、アンダースコアが %5F として URI エンコードされることが求められるためです。

]FIG]
