/
614.txt
560 lines (432 loc) · 31.4 KB
/
614.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
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
[3] [[HTTP]] の [DFN[[CODE(HTTP)@en[Set-Cookie:]] [[応答頭欄]]]]は、
[[クライアント]]に対して [[Cookie]] を設定することを指示します。
[322] [CODE(HTTP)@en[[[Set-Cookie:]]]] [[頭欄]]は [[Netscape]] 社によってはじめに定義・実装され、
後に[[Webブラウザー]]を含む数多くの [[HTTP]] [[利用者エージェント]]で実装されるに至りました。
なお、 [CODE(HTTP)@en[[[Set-Cookie]]]] (>>311) やその改訂版 [CODE(HTTP)@en[[[Set-Cookie2]]]]
(>>308) は [[IETF]] によって [[RFC 2109]], [[RFC 2965]] として標準化されましたが、
[[Netscape]] の定義と互換性がないため無視され、事実上死文化しています。
* 仕様書
[REFS[
- [371] [CITE@en[RFC 6265 - HTTP State Management Mechanism]] ([TIME[2012-03-01 09:57:02 +09:00]] 版) <http://tools.ietf.org/html/rfc6265#section-3>
- [377] '''[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>'''
- [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>
- [31] [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>
- [45] [CITE@en[RFC 6265 - HTTP State Management Mechanism]] ([TIME[2014-10-12 15:11:47 +09:00]] 版) <http://tools.ietf.org/html/rfc6265#section-7.2>
- [50] [CITE[RFC Errata Report]] ([TIME[2014-11-04 08:02:15 +09:00]] 版) <http://www.rfc-editor.org/errata_search.php?rfc=6265>
- [5] [CITE@en[RFC 7234 - Hypertext Transfer Protocol (HTTP/1.1): Caching]] ([TIME[2014-09-11 10:19:59 +09:00]] 版) <https://tools.ietf.org/html/rfc7234#page-36>
- [38] [CITE@en-GB-x-hixie[HTML Standard]] ([TIME[2014-11-02 01:25:00 +09:00]] 版) <https://html.spec.whatwg.org/#attr-meta-http-equiv-set-cookie>
]REFS]
* 構文
[4] [CODE(HTTP)@en[Set-Cookie:]] 欄の[[欄本体]]は
[PRE(HTTP example code)[
Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure
]PRE]
のように名前と値の組 ([RUBYB[[[属性]]]@en[attribute]]) の連続として記述します [SRC[>>2]]。
[378] [CODE(HTTP)@en[[[Set-Cookie:]]]] 欄の構文は次のように定義されています。
[[起源鯖]]はこの構文に従う[['''べきです''']] [SRC[>>377]]。
;; [379] なぜか違反を完全に禁止はされていません...
[FIG[
[FIGCAPTION[
[380] [[RFC 6265]] による [CODE(HTTP)@en[[[Set-Cookie:]]]] 欄の構文
]FIGCAPTION]
[PRE(ABNF code)[
set-cookie-header = "Set-Cookie:" [[SP]] set-cookie-string
set-cookie-string = [[cookie-pair]] *( ";" [[SP]] [[cookie-av]] )
]PRE]
]FIG]
;; [381] 詳しくは [[Cookieの属性]]の項をご覧下さい。
** 文脈
[321] [[起源鯖]]は、 [CODE(HTTP)@en[[[Set-Cookie:]]]] 欄を任意の[[HTTP]]
[[応答]]に含めて[['''構いません''']] [SRC[>>371]]。
;; [[RFC 2109]], [[RFC 2965]] は [CODE(HTTP)@en[[[Set-Cookie]]]], [CODE(HTTP)@en[[[Set-Cookie2]]]]
を任意の[[応答]]に含めて[['''構わない''']]としていました。
[SRC[>>319, >>318]]
[52] [[WebSocket handshake]] でも使うことができます。
** 複数のヘッダー
[16] [[起源鯖]]は複数の [CODE(HTTP)@en[[[Set-Cookie:]]]] 欄を含めて[['''構いません''']]
[SRC[>>2, >>371]]。
;; [51] [[HTTP]] は値が[[リスト]] ([CODE(HTTP)[#]]) でない[[ヘッダー]]を複数個含めることを禁じていますが、
[CODE(HTTP)@en[[[Set-Cookie:]]]]
[[ヘッダー]]は歴史的理由により[[意図的違反]]しています [SRC[>>50]]。
[373] [[起源鯖]]は複数の [CODE(HTTP)@en[[[Set-Cookie:]]]] 欄を1つに[[折り畳み]]する[['''べきではありません''']]。
[CODE(HTTP)[[[,]]]] は構文上、値の中に普通に使える[[文字]]なので、[[折り畳み]]によって意味が変わってしまうことがあります。
[SRC[>>371]]
;; [374] なぜ完全に禁止じゃなくて[['''べき''']]なんでしょうね。正当な理由ってあるのでしょうか。
[[アプリケーション鯖]]と [[HTTP]] [[鯖]]が分かれていて、[[アプリケーション]]から [[HTTP]]
を完全に制御できなくて、 [[HTTP]] で勝手に[[折り畳み]]してしまう糞実装とか考慮してるんでしょうか・・・。
;; [14] 元々 [CODE(char)[[[,]]]] の使用が禁止されていたのは複数の [CODE(HTTP)@en[[[Set-Cookie:]]]]
[[頭欄]]を連結した時に [CODE(char)[[[,]]]] が使われることへの配慮でしょうか、と思いきや、
[CODE(HTTP)@en[[[Expires]]]] では [CODE(char)[[[,]]]] が[[曜日]]の後に使われています。
それならなんで禁止されているのでしょう。
[18] 複数の [CODE(HTTP)@en[[[Set-Cookie:]]]] 欄で同じ名前の [[Cookie]]
が設定されていた時の扱いは[[Cookieの属性]]の項をご覧下さい。
;; [320] [[RFC 2109]], [[RFC 2965]] でも複数の [CODE(HTTP)@en[[[Set-Cookie]]]],
[CODE(HTTP)@en[[[Set-Cookie2]]]] が[[応答]]1つに含まれても[['''構わない''']]と明記していました。
また、途中の[RUBYB[[[関門]]]@en[gateway]]で[RUBYB[[[折り畳み]]]@en[fold]]され得ることにも言及されていました。
[SRC[>>319, >>318]]
* 構文解析
[8] [CODE(HTTP)@en[[[Set-Cookie:]]]] [[ヘッダー]]の値は、次のように構文解析しなければ[['''なりません''']]
[SRC[>>7]]。
[FIG(steps)[
= [6] [[クッキー]]の名前と値を次のように決定します。
== [9] 値に [CODE(HTTP)[[[;]]]] が含まれていれば最初の [CODE(HTTP)[[[;]]]] の直前まで、
含まれていなければ全体を対象とします。
== [10] [CODE(HTTP)[[[=]]]] が含まれていなければ、ここで終わってこの[[ヘッダー]]は無視します。
== [11] 最初の [CODE(HTTP)[[[=]]]] の直前までを名前、直後からを値とします。
([[空文字列]]であることもあります。)
== [12] 名前と値の最初と最後から [CODE(ABNF)@en[[[WSP]]]] を除去します。
== [13] 名前が[[空文字列]]なら、ここで終わってこの[[ヘッダー]]は無視します。
= [15] [[ヘッダー]]の値を処理し終わっていれば、ここで終わります。
まだ残っていれば、最初の文字は [CODE(HTTP)[[[;]]]] なので、これを読み飛ばして次の処理を行います。
== [23] 値に [CODE(HTTP)[[[;]]]] が含まれていれば最初の [CODE(HTTP)[[[;]]]] の直前まで、
含まれていなければ全体を対象とします。
== [24] [CODE(HTTP)[[[=]]]] が含まれていれば最初の [CODE(HTTP)[[[=]]]]
の直前までを属性名、直後からを属性値とし、含まれていなければ全体を属性名、[[空文字列]]を属性値とします。
== [25] 属性名と属性値の最初と最後から [CODE(ABNF)@en[[[WSP]]]] を除去します。
== [26] 属性名に依存する方法で処理します。
==- [29] 認識できない属性名なら、無視して次に進みます。
==- [30] 一致は[[大文字・小文字不区別]]です。
== >>15 に戻ります。
]FIG]
;; 各[[属性]]の構文解析の方法は、それぞれの項を参照してください。
[28] [[構文解析]]の結果[[ヘッダー]]が無視されなかった場合、得られた名前、値、
[[属性]]のリストに関して[[要求URL]]から[DFN[[RUBYB[クッキーを受信]@en[receive a cookie]]]]したといいます。
[[利用者エージェント]]が[[クッキーを受信]]した時の操作は、 >>27 を参照してください。
* 属性
[382] [CODE(HTTP)@en[[[Set-Cookie:]]]] 欄の値としては、名前と値の組 ([[cookie-pair]])
と、それに続く0個以上の[[属性]]を指定することができます。詳しくは [[Cookieの属性]]の項をご覧下さい。
* 利用者エージェントの処理モデル
[35] [[利用者エージェント]]は、 [CODE(HTTP)@en[[[Set-Cookie:]]]]
[[ヘッダー]]を無視して構いません [SRC[>>7]]。
[EG[
[36] 例えば[[第三者クッキー]]を無視して構いません [SRC[>>7]]。
]EG]
[46] [[利用者エージェント]]は、[[クッキー]]が無効に設定されている場合、[[応答]]の
[CODE(HTTP)@en[[[Set-Cookie:]]]] を処理しては[['''なりません''']] [SRC[>>45]]。
[27] [[利用者エージェント]]は、[RUBYB[[[クッキーを受信]]]@en[receive a cookie]]したら、
次のように処理しなければ[['''なりません''']] [SRC[>>31]]。
[FIG(steps)[
= [32] [[利用者エージェント]]は[[クッキー]]を無視してここで終わっても構いません。
=- [[第三者クッキー]]やサイズ超過などの理由で[[クッキー]]を拒むことができます。
= [33] 指定された名前と値を持つ[[クッキー]]を作成します。
= [34] [[クッキー]]の最終アクセス時刻を現在日時に設定します。
= [37] [CODE(HTTP)@en[[[Max-Age]]]]/[CODE(HTTP)@en[[[Expires]]]] [[属性]]、
[CODE(HTTP)@en[[[Domain]]]] [[属性]]、
[CODE(HTTP)@en[[[Path]]]] [[属性]]に関連する処理を行います (それぞれの項を参照)。
= [60] [CODE(HTTP)@en[[[Secure]]]] [[属性]]があれば、
[[クッキー]]の保安のみフラグを設定します。なければ設定しません。
= [61] [CODE(HTTP)@en[[[HttpOnly]]]] [[属性]]があれば、
[[クッキー]]のHTTPのみフラグを設定します。なければ設定しません。
= [62] [[「非HTTP」API]] から受信した[[クッキー]]で、
[[クッキー]]のHTTPのみフラグが設定されているなら、[[クッキー]]を無視してここで終わります。
= [63] 名前、ドメイン、パスが同じ[[クッキー]]が既に保存されているなら、
== [64] [[クッキー]]を[[「非HTTP」API]]から受信した場合で、
既存の[[クッキー]]のHTTPのみフラグが設定されているなら、
新しい[[クッキー]]を無視してここで終わります。
== [65] 新しい[[クッキー]]の作成時刻を既存の[[クッキー]]の値に設定します。
== [66] 既存の[[クッキー]]を削除します。
= [67] 新しい[[クッキー]]を保存します。
]FIG]
[47] [[利用者エージェント]]によっては、[[クッキー]]の保存の度に[[利用者]]に承認するか確認する機能を提供していることもあります。
一度に大量の確認が表示されることもよくありますが、それでも[[プライバシー]]を気にして確認を求める[[利用者]]も存在しています。
[SRC[>>45]]
;; [48] 確認と保存が[[同期的]]に実装されているとすると、[[レンダリング]]がその分遅延することになります。
[[非同期的]]に実装されているとすると、タイミングによっては発行済の[[クッキー]]を[[鯖]]や[[スクリプト]]が取得できませんから、
互換性の問題が生じるかもしれません。
** 状態符号との関係
[375] [CODE(HTTP)@en[[[Set-Cookie:]]]] は[[状態符号]]に関わらず任意の [[HTTP]] [[応答]]で使うことができます。
[[利用者エージェント]]は [CODE(HTTP)[[[1xx]]]] の場合にこれを無視して[['''構いません''']]が、
それ以外の場合は処理しなければ[['''なりません''']]。 [SRC[>>371]]
[305] [[利用者エージェント]]は[[状態符号]]が[[リダイレクト]]であっても、
(その[[リダイレクト]]が帰ってきた[[要求]]の [[URL]] に関して)
[CODE(HTTP)@en[[[Set-Cookie:]]]] [[頭欄]]に従った処理をするべきです。
** 上書き
[17] [CODE(HTTP)@en[[[Domain]]]] と
[CODE(HTTP)@en[[[Path]]]] と [CODE(HTTP)@en[[VAR[NAME]]]] が同じ [[Cookie]] があれば、
値は上書きされて、最新のものだけが残ります。 [SRC[>>2]]
;; [19] 仕様上は [CODE(HTTP)@en[[[Path]]]] と [CODE(HTTP)@en[[VAR[NAME]]]]
とありますが、 [CODE(HTTP)@en[[[Domain]]]] も実際には見ています。
[20] >>17 の上書き判定における [CODE(HTTP)@en[[[Path]]]] は完全一致 [SRC[>>2]] なので、
例えば [CODE(URI)[/foo]] と [CODE(URI)[/foo/bar]] で同じ名前の [[Cookie]]
が設定されると、 [CODE(URI)@en[/foo/bar]] では両方が有効になります。
;; [345] [[RFC 2109]] では [CODE(HTTP)@en[[VAR[NAME]]]] が同じで
[CODE(HTTP)@en[[[Path]]]]、[CODE(HTTP)@en[[[Domain]]]] が[[文字列]]として[[一致]]するなら
[SRC[>>343]]、[[RFC 2965]] では [CODE(HTTP)@en[[VAR[NAME]]]] が同じで
[CODE(HTTP)@en[[[Path]]]] が[[文字列]]として[[一致]]、 [CODE(HTTP)@en[[[Domain]]]]
が[[大文字・小文字を区別しない]]で[[一致]]するなら上書きする [SRC[>>344]]、
とされていました。
;; [349] [[RFC 2965]] でも [CODE(HTTP)[[[Port]]]] [[属性]]はここでの[[一致]]判定には含まれないようです。
;; [350] [[RFC 2109]]、[[RFC 2965]] では[[属性]]の名前の[[大文字と小文字を区別しない]]ことになっていますが、
ここでの扱いは明確にされていません。
[346] 新しい [[Cookie]] の [CODE(HTTP)@en[[[Expires]]]] が過去であれば、
古い [[Cookie]] は削除され、新しい [[Cookie]] も蓄積されません。
;; [347] [[RFC 2109]]、[[RFC 2965]] では [CODE(HTTP)@en[[[Max-Age]]]] が [CODE(HTTP)[[[0]]]]
であれば、あるいは [[RFC 2965]] では [CODE(HTTP)@en[[[Discard]]]]
[[属性]]があれば、古い [[Cookie]] は削除され、新しい [[Cookie]] も蓄積されません。
[SRC[>>343, >>344]]
* 串とキャッシュの処理モデル
[22] [[串]]は [CODE(HTTP)@en[[[Set-Cookie:]]]] [[頭欄]]をそのまま[[クライアント]]に渡すべきです。
[[状態符号]]が [CODE(HTTP)@en[[[200]]]] であれ [CODE(HTTP)[[[304]]]] であれ、です。
[SRC[>>2]]
** キャッシュ可能性
[376] [CODE(HTTP)@en[[[Set-Cookie:]]]] 欄の有無は[[キャッシュ可能性]]に影響しません [SRC[>>371, >>5]]。
;;
[21] [[Netscape]] の [[Cookie]] 仕様では、
[CODE(HTTP)@en[[[Set-Cookie:]]]] [[ヘッダー]]は[[キャッシュ]]するべきではない
[SRC[>>2]] とされていました。
;; [361] [[RFC 2109]] と [[RFC 2965]] は、[[HTTP/1.0]] に基づく[[串]]の
[CODE(HTTP)@en[[[Set-Cookie:]]]] や [CODE(HTTP)@en[[[Set-Cookie2:]]]] との関わりを考察しています
[SRC[>>359, >>360]]。[[キャッシュ不能]]なら問題はないのですが、 [[pre-expired]]
な場合、状況によっては[[起源鯖]]による[[妥当性検証]]をスキップして[[クライアント]]に送られてしまい、
他の[[クライアント]]向けの [[Cookie]] がその[[クライアント]]に渡る可能性があることを指摘しています。
;; [[HTTP/1.1]] に従っているなら [CODE(HTTP)@en[[[Cache-Control:]]]]
によりもっと細かく制御できるので大丈夫ということなのでしょう。
* [CODE(HTML)@en[<meta http-equiv=Set-Cookie>]]
[39] [CODE(HTML)@en[[[<meta http-equiv=[DFN[Set-Cookie]]>]]]]
([DFN[[[Cookie setter]]]] 状態 [SRC[>>38]]) は、
[[クッキー]]を設定するものです。
[40] この状態は[[不適合]]です [SRC[>>38]]。[[著者]]は使っては[['''なりません''']]。
[41] [[利用者エージェント]]は、 [CODE(HTMLa)@en[[[content]]]] [[属性]]があって[[空文字列]]でない場合、
[CODE(HTMLa)@en[[[content]]]] [[属性値]]を [[UTF-8]]
で[[符号化]]した値を[[文書の番地]]に関して[[「非HTTP」API]]
から受信したものとして処理しなければ[['''なりません''']] [SRC[>>38]]。
[HISTORY[
[54] かつては[[ストレージミューテックスを得る]]と規定されていましたが、誰も従っていませんでしtあ。
]HISTORY]
* 関連
[59]
[[Perlモジュール]] [CODE[HTTP::Cookie]] は、
[[クッキー]]を[[ファイルシステム]]に保存する際の[[データ形式]]で
[CODE[Set-Cookie3]] という名称を使っています。
* 歴史
** Netscape Cookie
[REFS[
- [2] [[Netscape Cookie]]
-- [CITE[Client Side State - HTTP Cookies]] <http://web.archive.org/web/19961125090609/http://www2.netscape.com/newsref/std/cookie_spec.html>
]REFS]
** RFC 2109 の [CODE(HTTP)@en[Set-Cookie:]] 欄
[311] [[IETF]] は [[Cookie]] の標準化を試み、[[RFC 2109]] で [[Netscape Cookie]]
とは非互換な [DFN[[CODE(HTTP)@en[[[Set-Cookie:]]]] [[頭欄]]]]を定義していました。
;; [351] 新旧 Cookie の互換性については、あまり役に立たない情報が多少 [[RFC 2109]]
の最後に載っています。詳しくは [CODE(HTTP)@en[[[Cookie:]]]] の項の「歴史」の節をご覧ください。
*** 仕様書
- [312] [DEL[[[RFC 2109]]]] ([[廃止]]済み)
-- [313] [CSECTION@en[4.1 Syntax: General]]
-- [319] [CSECTION@en[3.2.1 General]]
-- [324] '''[CSECTION@en[4.2.2 Set-Cookie Syntax]]'''
-- [331] [CSECTION@en[4.2.3 Controlling Caching]]
-- [340] [CSECTION@en[4.3.1 Interpreting Set-Cookie]]
-- [343] [CSECTION@en[4.3.3 Cookie Management]]
-- [42] [CSECTION@en[4.5 Caching Proxy Role]]
-- [359] [CSECTION@en[10.2 Caching and HTTP/1.0]]
** [CODE(HTTP)@en[Set-Cookie2:]] 欄
[308] [[RFC 2109]] を廃止して代わりに発行された [[RFC 2965]] は
[CODE(HTTP)@en[[[Set-Cookie]]]] を捨てて非互換な
[DFN[[CODE(HTTP)@en[[[Set-Cookie2:]]]] [[頭欄]]]] を定義していました。
[353] [[RFC 2965]] は (廃止した [[RFC 2109]] には触れずに) [[Netscape Cookie]]
との互換性について次のように規定していました。
- [354] [CODE(HTTP)@en[[[Set-Cookie:]]]] と [CODE(HTTP)@en[[[Set-Cookie2:]]]]
の両方があれば、 [CODE(HTTP)@en[[[Set-Cookie:]]]] を捨てなければ[['''なりません''']] [SRC[>>352]]。
- [355] [CODE(HTTP)@en[[[Set-Cookie2:]]]] があれば、[[起源鯖]]は [[RFC 2965]]
の [CODE(HTTP)@en[[[Cookie:]]]] を理解できるとみなさなければ[['''なりません''']] [SRC[>>352]]。
- [356] 新 [[Cookie]] はそれと[[一致]]する [WEAK[(名前などが同じ)]] 新旧どちらの [[Cookie]]
も置き換えなければ[['''なりません''']] [SRC[>>352]]。
- [358] 新旧 [[Cookie]] を理解する[[利用者エージェント]]が [CODE(HTTP)@en[[[Set-Cookie:]]]]
だけを受け取ったときは、 [[Netscape Cookie]] による [CODE(HTTP)@en[[[Cookie:]]]]
[[頭欄]]に加え、 [CODE(HTTP)@en[[[Cookie2:]]]] [[頭欄]]も送る[['''べきです''']] [SRC[>>352]]。
[357] >>356 は新 [[Cookie]] による旧 [[Cookie]] の置き換えを命じていますが、
旧 [[Cookie]] による新 [[Cookie]] の置き換えには触れていません。
[370] [CODE(HTTP)@en[[[Set-Cookie2:]]]] は [[RFC 6265]] により廃止されました [SRC[>>369]]。
[REFS[
- [309] [[RFC 2965]]
-- [310] [CSECTION@en[3.1 Syntax: General]]
-- [318] [CSECTION@en[3.2.1 General]]
-- [323] '''[CSECTION@en[3.2.2 Set-Cookie2 Syntax]]'''
-- [332] [CSECTION@en[3.2.3 Controlling Caching]]
-- [341] [CSECTION@en[3.3.1 Interpreting Set-Cookie2]]
-- [344] [CSECTION@en[3.3.3 Cookie Management]]
-- [43] [CSECTION@en[3.5 Caching Proxy Role]]
-- [352] [CSECTION@en[9.1 Compatibility with Existing Implementations]]
-- [360] [CSECTION@en[9.2 Caching and HTTP/1.0]]
- [369] [CITE@en[RFC 6265 - HTTP State Management Mechanism]] ([TIME[2012-03-01 09:57:02 +09:00]] 版) <http://tools.ietf.org/html/rfc6265#page-4>
- [49] [CITE@en[RFC 6265 - HTTP State Management Mechanism]] ([TIME[2014-10-12 15:11:47 +09:00]] 版) <http://tools.ietf.org/html/rfc6265#section-9.4>
]REFS]
[306] [CITE['''['''JavaHouse-Brewers:31373''']''' Re: Cookie.setMaxAge() について]] ([TIME[2001-11-24 20:53:20 +09:00]] 版) <http://java-house.jp/ml/archive/j-h-b/031373.html>
>
=Cookie.serVersion(1)としたクッキーを送信した場合、
Set-CookieとSet-Cookie2ヘッダの両方がクライアントに送信されていました。
=NN4.7とIE5では、Set-Cookie2ヘッダはサポートしていないようです。
[307] [CITE[IRC logs: freenode / #whatwg / 20090808]]
([TIME[2009-10-06 23:37:54 +09:00]] 版)
<http://krijnhoetmer.nl/irc-logs/whatwg/20090808#l-417>
>
- [18:02] <abarth> annevk42: if you're interested in the cookie stuff, you should join the mailing list and comment on the charter
- [18:02] <abarth> annevk42: in general, i'm trying to keep the focus narrow
- [18:03] <abarth> annevk42: speccing cookie2 is going to take a lot more work and a lot more time than speccing cookie0
- [18:18] <annevk2> abarth, if you're going to spec cookies as implemented set-cookie2 is relevant, no?
- [18:18] <abarth> annevk2: depends how widely its used
- [18:18] <abarth> there was a recent message to the list
- [18:19] <abarth> that suggested very few sites use it
- [18:19] <abarth> i'm not sure we want to lock down the behavior of cookie2
- [18:19] <annevk2> hmm, if we could actually get impl to remove support for it that'd be cool
- [18:19] <abarth> which user agents implement it?
- [18:20] <annevk2> I thougt set-cookie2, not cookie2, was implemented, but maybe not
- [18:20] <abarth> i know they're in opera
- [18:20] <abarth> but i'm not sure where else
- [18:20] <annevk2> interesting
- [18:22] <annevk2> if we're the only ones by all means don't spec it or simply say it's obsolete
- [18:23] <annevk2> if we need extensions we can prolly extend cookie0 somehow once the processing model is written down
- [18:23] <abarth> i don't think we want to say it's obsolete. cookie suck in a number of ways. it would be good to have a long term plan for how to dig ourselves out of the mess
- [18:23] <abarth> yeah, that's a good point
- [18:23] <abarth> that's what 2109 originally tried to do with Version=1
- [18:24] <abarth> but i think they put the cart a bit in front of the horse
- [18:24] <annevk2> besides rough consensus you need running code :p
- [18:24] <annevk2> (also, versioning sucks :))
** IETF のキャッシュ制御に関する規定
[330] [[RFC 2109]]、[[RFC 2965]] は以下のようなキャッシュ制御に関する規定がありました
[SRC[>>331, >>332]]。
- [333] [CODE(HTTP)@en[[[Set-Cookie]]]], [CODE(HTTP)@en[[[Set-Cookie2]]]] の[[キャッシュ]]を防ぐため、
[PRE(HTTP example code)[
[[Cache-Control]]: [[no-cache]]="set-cookie"
]PRE]
や
[PRE(HTTP example code)[
[[Cache-Control]]: [[no-cache]]="set-cookie2"
]PRE]
を指定する[['''べきです''']]。
- [334] 次のいずれかを指定する[['''べきです''']]。
-- [335] 私的な文書でキャッシュするべきではないとき
[PRE(HTTP example code)[
[[Cache-Control]]: [[private]]
]PRE]
-- [336] キャッシュしても良いけど[[再検証]]が必要なとき
[PRE(HTTP example code)[
[[Cache-Control]]: [[must-revalidate]], [[max-age]]=0
]PRE]
-- [337] [[利用者エージェント]]はキャッシュをそのまま使ってよいけど、[[串]]はキャッシュしても[[再検証]]が必要なとき
[PRE(HTTP example code)[
[[Cache-Control]]: [[proxy-revalidate]], [[max-age]]=0
]PRE]
-- [338] キャッシュしても良いけどできれば[[再検証]]してほしいとき
[PRE(HTTP example code)[
[[Cache-Control]]: [[max-age]]=0
]PRE]
- [339] あらかじめ [[HTTP/1.0]] [[串]]が存在しないと分かっている場合を除き、過去の日付の [CODE(HTTP)@en[[[Expires:]]]] 欄を含めなければ[['''なりません''']]。
[WEAK[([[HTTP/1.1]] [[串]]は [CODE(HTTP)@en[[[Cache-Control]]]] を優先するので無視します。)]]
- [44] [[串]]は勝手に[[要求]]に [CODE(HTTP)@en[[[Set-Cookie]]]], [CODE(HTTP)@en[[[Set-Cookie2]]]]
を自分で付け足しては[['''なりません''']] [SRC[>>42, >>43]]。
* 実装
[364] [CITE[CGI::Cookie - search.cpan.org]] ([TIME[2010-08-01 16:28:43 +09:00]] 版) <http://search.cpan.org/~lds/CGI.pm-3.49/lib/CGI/Cookie.pm>
[[Netscape Cookie]] 対応と銘打っていますが、 [CODE(HTTP)@en[[[Max-Age]]]] と
[CODE(HTTP)@en[[[HttpOnly]]]] にもちゃんと対応しています。
[365] [CITE[CGI::Simple::Cookie - search.cpan.org]] ([TIME[2010-08-01 16:32:05 +09:00]] 版) <http://search.cpan.org/~andya/CGI-Simple-1.112/lib/CGI/Simple/Cookie.pm>
[[Netscape Cookie]] と [CODE(HTTP)@en[[[HttpOnly]]]] に対応しています。
[CODE(HTTP)@en[[[Max-Age]]]] には対応していません。
[362] [CITE[Servlet::Http::Cookie - search.cpan.org]] ([TIME[2010-08-01 16:15:08 +09:00]] 版) <http://search.cpan.org/~ix/libservlet-0.9.2/lib/Servlet/Http/Cookie.pm>
この [[Perlモジュール]]は、 [[RFC 2109]] に基づいた [[Cookie]] [[API]] を提供しています。
[[Netscape Cookie]] と [[RFC 2109]] の両方に対応しているようで、[[既定値]]は [[Netscape Cookie]]
になっています。
[366] [CITE[Apache2::Cookie - search.cpan.org]] ([TIME[2010-08-01 16:33:25 +09:00]] 版) <http://search.cpan.org/~joesuf/libapreq2-2.12/glue/perl/lib/Apache2/Cookie.pm>
[CODE(HTTP)@en[[[Comment]]]]、[CODE(HTTP)@en[[[CommentURL]]]]、
[CODE(HTTP)@en[[[Expires]]]] には対応していますが、 [CODE(HTTP)@en[[[Port]]]]、
[CODE(HTTP)@en[[[Max-Age]]]]、[CODE(HTTP)@en[[[HttpOnly]]]]
には対応していません。謎な実装です。
[363] [CITE[Mojo::Cookie::Response - search.cpan.org]] ([TIME[2010-08-01 16:18:15 +09:00]] 版) <http://search.cpan.org/~kraih/Mojolicious-0.999926/lib/Mojo/Cookie/Response.pm>
この [[Perlモジュール]]は [[RFC 2965]] の実装を名乗っています。
しかし [CODE(HTTP)@en[[[CommentURL]]]] には対応しておらず、 [CODE(HTTP)@en[[[Expires]]]]
や [CODE(HTTP)@en[[[HttpOnly]]]] には対応しています (仕様違反?)。[[引用文字列]]は [CODE(HTTP)@en[[[Port]]]]
[[属性]]でのみ使います (仕様違反)。(対象は[[欄本体]]だけなので、
[CODE(HTTP)@en[[[Set-Cookie2:]]]] にも [CODE(HTTP)@en[[[Set-Cookie]]]]
にも使えるようです。)
* メモ
[1] [CITE[苦い開発: クッキーの有効期限の更新]] ([TIME[2009-06-06 09:06:11 +09:00]] 版) <http://bitter-development.blogspot.com/2007/07/blog-post.html>
>
Apache2.2 と IE6 でsetcookie()で既存の同じ名前と値を設定する場合、有効期限(期間)は更新されない。
有効期限0で一旦セットしてから同じ有効期間をセットする。
>
[PRE(PHP example code)[
setcookie($name, $name, 0);
setcookie($name, $name, time()+60*60*24*365);
]PRE]
[367] [CITE@en[Web Applications 1.0 r5486 Define http-equiv='set-cookie'Fixing http://www.w3.org/Bugs/Public/show_bug.cgi?id=9578]]
( ([TIME[2010-09-26 00:46:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5485&to=5486>
[368] [CITE[Apache HTTP Server Project]]
( ([TIME[2011-05-28 00:58:55 +09:00]] 版))
<http://httpd.apache.org/docs/1.3/misc/known_client_problems.html#cookie-merge>
[383] [CITE[HTTP::Cookies - search.cpan.org]]
( ([TIME[2012-03-04 00:36:16 +09:00]] 版))
<http://search.cpan.org/dist/HTTP-Cookies/lib/HTTP/Cookies.pm>
[384] [CITE[Apache2::Cookie - search.cpan.org]]
( ([TIME[2012-03-04 00:40:21 +09:00]] 版))
<http://search.cpan.org/dist/libapreq2/glue/perl/lib/Apache2/Cookie.pm>
[385] [CITE[KCP端末&SSLでクッキーが保存されない現象の覚書 - Kimura.Memo]]
( ([TIME[2012-06-19 19:16:32 +09:00]] 版))
<http://d.hatena.ne.jp/Kimura/20111210/p1>
[386] [CITE[co3k.org - Blog - 【情報求ム】au のガラケーで cookie が使えなくなる場合がある?]]
( ([TIME[2012-06-20 01:46:46 +09:00]] 版))
<http://co3k.org/blog/20>
[387] [CITE@en[Web Applications 1.0 r7414 Require Cookies and Origin if you implement HTTP.]]
( ([TIME[2012-09-27 07:52:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=7413&to=7414>
[388] [CITE@en[RFC 6787 - Media Resource Control Protocol Version 2 (MRCPv2)]]
( ([TIME[2012-11-13 15:18:40 +09:00]] 版))
<http://tools.ietf.org/html/rfc6787#section-6.2.15>
[389] [CITE[Bug 3420 – XMLHttpRequest does not handle set-cookie headers]]
( ([TIME[2013-11-08 06:59:38 +09:00]] 版))
<https://bugs.webkit.org/show_bug.cgi?id=3420>
[390] [CITE@en[Web Applications 1.0 r5486 Define http-equiv='set-cookie']]
( ([TIME[2010-09-26 00:46:00 +09:00]] 版))
<http://html5.org/tools/web-apps-tracker?from=5485&to=5486>
[391] [CITE@en[draft-ietf-http-state-mgmt-errata-00 - HTTP State Management Mechanism (Errata)]]
( ([TIME[2014-07-14 17:46:58 +09:00]] 版))
<https://tools.ietf.org/html/draft-ietf-http-state-mgmt-errata-00>
[392] [CITE[Apache HTTP Server Project]]
( ([TIME[2012-03-02 11:07:06 +09:00]] 版))
<http://httpd.apache.org/docs/1.3/misc/known_client_problems.html#cookie-merge>
[393] [CITE[RFC Errata Report]]
( ([TIME[2014-12-03 17:36:48 +09:00]] 版))
<http://www.rfc-editor.org/errata_search.php?rfc=4229>
[53] [CITE@en[Cookies Lack Integrity: Real-World Implications | USENIX]]
([TIME[2015-10-01 13:26:36 +09:00]] 版)
<https://www.usenix.org/conference/usenixsecurity15/technical-sessions/presentation/zheng>
[55] [CITE@en[Remove the storage mutex due to lack of implementation · whatwg/html@1b918cf]] ([TIME[2015-12-16 14:35:13 +09:00]] 版) <https://github.com/whatwg/html/commit/1b918cf72fcbba011f83b92ab5d1f483fb1cafa3>
[56] [CITE@en[Update integration with Encoding Standard · whatwg/html@6a31c26]]
([TIME[2016-02-14 18:46:56 +09:00]] 版)
<https://github.com/whatwg/html/commit/6a31c26cf12e39dab1a488e75dd56c03d6786d39>
[57] [CITE@en[Clarify the hooks into RFC6265 · whatwg/fetch@5a324a8]]
([TIME[2016-03-01 11:28:03 +09:00]] 版)
<https://github.com/whatwg/fetch/commit/5a324a891c42d42de09a01e03c3a063b9a4f882b>
[58] [CITE@en[Get multiple headers as an aray rather than a combined value? · Issue #506 · whatwg/fetch]]
([TIME[2017-03-15 17:05:46 +09:00]])
<https://github.com/whatwg/fetch/issues/506>
[FIG(quote)[
[FIGCAPTION[
[68] [CITE@en[Creating Safari Content-Blocking Rules]]
([TIME[2017-06-06 17:06:22 +09:00]])
<https://developer.apple.com/library/content/documentation/Extensions/Conceptual/ContentBlockingRules/CreatingRules/CreatingRules.html#//apple_ref/doc/uid/TP40016265-CH2-SW1>
]FIGCAPTION]
> block-cookies
> The engine strips all cookies from the header before sending the request to the server. Safari's own privacy policy takes precedence, so that only cookies that would otherwise be accepted by the privacy policy can be blocked.
]FIG]
[69] [CITE@en[Should "set response's CSP list" be in Main fetch? · Issue #364 · whatwg/fetch]]
([TIME[2018-04-18 13:47:19 +09:00]])
<https://github.com/whatwg/fetch/issues/364>
[70] [CITE@en[<meta http-equiv=set-cookie> is now a no-op]]
([[annevk]]著, [TIME[2018-04-28 01:47:10 +09:00]])
<https://github.com/whatwg/html/commit/9c135397caed7dd1a23d94ef43dcb372f89f853d>
[71] [CITE@en[<meta http-equiv=Set-Cookie> should do nothing if document is cookie averse · Issue #1950 · whatwg/html]]
([TIME[2018-05-02 13:17:46 +09:00]])
<https://github.com/whatwg/html/issues/1950>
[72] [CITE@en[Restrict <meta http-equiv=set-cookie> by annevk · Pull Request #3011 · whatwg/html]]
([TIME[2018-05-02 13:19:32 +09:00]])
<https://github.com/whatwg/html/pull/3011>
[73] [CITE@en[Remove <meta http-equiv=set-cookie> · Issue #3076 · whatwg/html]]
([TIME[2018-05-02 13:22:06 +09:00]])
<https://github.com/whatwg/html/issues/3076>
[74] [CITE@en[Block `<meta http-equiv="set-cookie" ...>` by chromium-wpt-export-bot · Pull Request #8531 · w3c/web-platform-tests]]
([TIME[2018-05-02 13:22:56 +09:00]])
<https://github.com/w3c/web-platform-tests/pull/8531>
[75] [CITE@en[Make <meta http-equiv=set-cookie> into a no-op by annevk · Pull Request #3649 · whatwg/html]]
([TIME[2018-05-02 13:23:10 +09:00]])
<https://github.com/whatwg/html/pull/3649>