/
361.txt
171 lines (128 loc) · 9.16 KB
/
361.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
[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]