/
361.txt
173 lines (128 loc) · 8.61 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
172
173
[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>
]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]]]] [[属性]]の定義
]FIGCAPTION]
[PRE[
path-av = "Path=" path-value
path-value = <any CHAR except CTLs or ";">
]PRE]
]FIG]
* 構文解析
[8] [CODE(HTTP)@en[[[Set-Cookie:]]]] [[ヘッダー]]の値は、次のように構文解析しなければ[['''なりません''']]
[SRC[>>7]]。
[FIG(steps)[
= [49] [[クッキー]]の名前と値を次のように決定します。
== [44] 値に [CODE(HTTP)[[[;]]]] が含まれていればその直前まで、
含まれていなければ全体を対象とします。
== [45] [CODE(HTTP)[[[=]]]] が含まれていなければ、この[[ヘッダー]]は無視します。
== [46] 最初の [CODE(HTTP)[[[=]]]] の直前までを名前、直後からを値とします。
([[空文字列]]であることもあります。)
== [47] 名前と値の最初と最後から [CODE(ABNF)@en[[WSP]]]] を除去します。
== [48] 名前が[[空文字列]]なら、この[[ヘッダー]]は無視します。
]FIG]
* 処理モデル
[42] [[利用者エージェント]]は、 [CODE(HTTP)@en[[[Set-Cookie:]]]]
[[ヘッダー]]を無視して構いません [SRC[>>7]]。
[EG[
[43] 例えば[[第三者クッキー]]を無視して構いません [SRC[>>7]]。
]EG]
[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]]]] [[属性]]の値が[[空文字列]]である時の扱いは明記されていません。
** 百分率符号化
[19] [[百分率符号化]]、[[非ASCII文字]]や [[URI]] [[RFC]]
上で認められていない[[文字]]の扱いについては仕様上明記されていません。
** 既定値
[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]
** 第3者発行
;; [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]]
部分のことです。
* セキュリティーに関して
[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]
** 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]]。
*** 仕様書
- [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]]
* 関連
[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が書き込まれないという事態に陥る