[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]] の定義と互換性がないため無視され、事実上死文化しています。 * 仕様書 - [2] [[Netscape Cookie]] -- [CITE[Client Side State - HTTP Cookies]] * 構文 [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]]。 [6] ,[[属性名]],説明,状態,出典 ,[VAR[NAME]],>>7,"[[事実上の標準]], [[IETF]] [[提案標準]]","[[Netscape Cookie]], [DEL[[[RFC 2109]]]], [[RFC 2965]]" ,[CODE(HTTP)@en[[[Comment]]]],[[注釈]],[[IETF]] [[提案標準]],"[DEL[[[RFC 2109]]]], [[RFC 2965]]" ,[CODE(HTTP)@en[[[CommentURL]]]] ※,[[注釈]]の [[URL]],[[IETF]] [[提案標準]],"[[RFC 2965]]" ,[CODE(HTTP)@en[[[Domain]]]],対象となる[[ドメイン]],"[[事実上の標準]], [[IETF]] [[提案標準]]","[[Netscape Cookie]], [DEL[[[RFC 2109]]]], [[RFC 2965]]" ,[CODE(HTTP)@en[[[Expires]]]],有効期限,[[事実上の標準]],[[Netscape Cookie]] ,[CODE(HTTP)@en[[[Max-Age]]]],[[寿命]],[[IETF]] [[提案標準]],"[DEL[[[RFC 2109]]]], [[RFC 2965]]" ,[CODE(HTTP)@en[[[Path]]]],対象となる [[path]],"[[事実上の標準]], [[IETF]] [[提案標準]]","[[Netscape Cookie]], [DEL[[[RFC 2109]]]], [[RFC 2965]]" ,[CODE(HTTP)@en[[[Port]]]] ※,対象となる[[ポート]],[[IETF]] [[提案標準]],"[[RFC 2965]]" ,[CODE(HTTP)@en[[[Secure]]]],[[安全]]でなければならないか否か,"[[事実上の標準]], [[IETF]] [[提案標準]]","[[Netscape Cookie]], [DEL[[[RFC 2109]]]], [[RFC 2965]]" ,[CODE(HTTP)@en[[[Version]]]],[[Cookie]] 仕様の[[版]],[[IETF]] [[提案標準]],"[DEL[[[RFC 2109]]]], [[RFC 2965]]" [329] 「※」は [CODE(HTTP)@en[[[Set-Cookie2:]]]] [[頭欄]]でのみ定義されていることを表します。 また、 [CODE(HTTP)@en[[[Expires]]]] は [CODE(HTTP)@en[[[Set-Cookie:]]]] [[頭欄]]でのみ定義されています。 [342] 未知の[[属性]]の扱いは明確に規定されていません。 ;; [[RFC 2109]] でも明確には規定されていませんでしたが、 [[RFC 2965]] では[[利用者エージェント]]は未知の[[属性]]を無視し[['''なければなりません''']]とされています [SRC[>>341]]。 ** 文脈 [321] [CODE(HTTP)@en[[[Set-Cookie:]]]] [[頭欄]]は任意の[[HTTP]][[応答]]に含めて構いません。 ;; [[RFC 2109]], [[RFC 2965]] は [CODE(HTTP)@en[[[Set-Cookie]]]], [CODE(HTTP)@en[[[Set-Cookie2]]]] を任意の[[応答]]に含めて[['''構わない''']]としていました。 [SRC[>>319, >>318]] ** 順序 [5] 名前と値の組の順序については明確に規定されていませんが、 [[Cookie]] として設定する名前と値の組 [CODE(HTTP)[[VAR[NAME]]=[VAR[VALUE]]]] の後に他の[[属性]]を適当な順番で記述します。 ;; [325] [[RFC 2109]], [[RFC 2965]] では [CODE(HTTP)[[VAR[NAME]]=[VAR[VALUE]]]] の後に他の[[属性]]が来ること、他の[[属性]]の順序は任意であることが明記されていました。 [SRC[>>324, >>323]] [326] [[属性]]の名前が同じものが複数回使われている場合の解釈については触れられていません。 ;; [327] [[RFC 2109]] ではその場合の動作は[[未定義]]とされていました [SRC[>>324]]。 [[RFC 2965]] では最初に現れたものが有効であるとされていました [SRC[>>323]]。 ** 大文字と小文字 [12] [[属性]]の名前や値の[[大文字と小文字を区別しない]]かどうかは仕様上明記されていません。 仕様書上は[[属性]]の名前はすべて[[小文字]]で記述されています。 ;; [314] [[RFC 2109]], [[RFC 2965]] では[[名前]]の[[大文字と小文字を区別しない]]とされていました。 [SRC[>>313, >>310]] ** 引用文字列 [315] [[HTTP]] や [[MIME]] の他の[[頭欄]]では値は[RUBYB[[[字句]]]@en[[[token]]]]か[RUBYB[[[引用文字列]]]@en[[[quoted-string]]]]のいずれかとするのが一般的ですが、 [[Netscape Cookie]] では[[引用文字列]]は認められて''おらず''、 どんな[[文字列]]であってもそのまま値としなければなりません。 ;; [316] [[RFC 2109]], [[RFC 2965]] では値は[[字句]]または[[引用文字列]]とされていました。 [SRC[>>313, >>310]] ** 空白 [317] [[HTTP]] や [[MIME]] の他の[[頭欄]]では特定の[[字句]]の間には[RUBYB[[[空白]]]@en[white space]]を挿入することが認められていましたが、 [[Netscape Cookie]] で認められているのかどうかは不明確です。仕様書の記述から、 「[CODE(HTTP)[[[;]]]]」の直後に挿入することは認められているようです。 ;; [316] [[RFC 2109]], [[RFC 2965]] では[[字句]]の間に[[空白]]を入れてもよいとされていました。 [SRC[>>313, >>310]] ** [CODE(HTTP)@en[[VAR[NAME]]=[VAR[VALUE]]]] [7] [CODE(HTTP)@en[[[Set-Cookie:]]]] 欄にはまず最初に設定する名前と値の組を[[属性]]として指定します。 [8] この[[属性]]は必須です。 [SRC[>>2]] *** 符号化 [9] 名前や値は任意の値ですが、 [CODE(char)[[[;]]]], [CODE(char)[[[,]]]], [RUBYB[[[空白]]]@en[white space]]は使えません。 [SRC[>>2]] [10] >>9 の記号を使いたい時の[[符号化]]の方法はありませんが、[[百分率符号化]]を用いることが[RUBYB[推奨]@en[recommended]]されています。 [SRC[>>2]] [11] 仕様上は >>9 の記号類以外の任意の[[文字]]が使えることになっていますが、その「[[文字]]」 全体の[[集合]]が何かは不明です。[[HTTP]] [[頭部]]で[[非ASCII文字]]を使う方法は標準不在な状況で、[CODE(HTTP)@en[[[Set-Cookie:]]]] 欄に関しても何ら [WEAK[(利用できるのかどうかも)]] 定められていません。 [[文書]]の[[文字コード]]や[[利用者エージェント]]の種類によって違った解釈をされる可能性があります。 現実の[[CGIスクリプト]]等の実装は特に気にしていなかったり、 [[百分率符号化]]を用いていたりです。[[百分率符号化]]を使うのは仕様書の >>10 の記述の影響でしょうか。 [13] [CODE(HTTP)@en[[[=]]]] も名前か値かその両方かで使えないはずなのですが、 仕様上は明記されていません。 ;; [348] [[RFC 2109]] や [[RFC 2965]] では名前は [CODE(ABNF)@en[[[token]]]]、 値は [CODE(ABNF)@en[[[token]]]] か [CODE(ABNF)@en[[[quoted-string]]]] とされていました。 また、 [[RFC 2965]] の [CODE(HTTP)@en[[[Comment]]]] [[属性]]では値は [[UTF-8]] とされていました。 [SRC[>>313, >>310]] *** 予約名 [327] 他の[[属性]]と同じ [VAR[NAME]] を使っていいのかどうかは不明です。 ;; [328] [[RFC 2109]] でも明記されていませんでした。 [[RFC 2965]] では[[属性]]の名前と同じ [VAR[NAME]] を使って[['''構いません''']]。 [SRC[>>323]] ;; [325] [[RFC 2109]], [[RFC 2965]] では [CODE(char)[[[$]]]] から始まる名前は[[予約]]となっており、 [RUBYB[[[応用]]]@en[application]]が使っては[['''ならない''']]とされていました。 [SRC[>>324, >>323]] ([CODE(HTTP)@en[[[Cookie:]]]] [[頭欄]]で [CODE(char)[[[$]]]] は特別な[[属性]]を表すために使われていました。) ** 複数の [CODE(HTTP)@en[[[Set-Cookie:]]]] 欄 [16] 1つの [[HTTP]] [[応答]]内に複数の [CODE(HTTP)@en[[[Set-Cookie:]]]] [[頭欄]]を指定することができます。 [SRC[>>2]] [14] [CODE(char)[[[,]]]] の使用が禁止されているのは複数の [CODE(HTTP)@en[[[Set-Cookie:]]]] [[頭欄]]を連結した時に [CODE(char)[[[,]]]] が使われることへの配慮でしょうか、と思いきや、 [CODE(HTTP)@en[[[Expires]]]] では [CODE(char)[[[,]]]] が[[曜日]]の後に使われています。 それならなんで禁止されているのでしょう。 [15] [[HTTP]] 上は複数の同じ名前の[[頭欄]]を指定するのは1つの[[頭欄]]に [CODE(char)[[[,]]]] で併記するのと同義ですが、 >>14 のような状況なので、そのように解釈されることを当てにしない方が賢明です。 [18] 複数の [CODE(HTTP)@en[[[Set-Cookie:]]]] [[頭欄]]で同じ [CODE(HTTP)@en[[VAR[NAME]]]] が指定されていたときにどれが生き残るのか (>>17) は仕様に明記されていません。 ;; [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]] * 処理モデル ** 利用者エージェントでの処理 [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]] *** キャッシュ可能性 [21] [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:]]]] によりもっと細かく制御できるので大丈夫ということなのでしょう。 * 歴史 ** 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]] の置き換えには触れていません。 *** 仕様書 - [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]] *** メモ [306] [CITE['''['''JavaHouse-Brewers:31373''']''' Re: Cookie.setMaxAge() について]] ([TIME[2001-11-24 20:53:20 +09:00]] 版) > =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]] 版) > - [18:02] annevk42: if you're interested in the cookie stuff, you should join the mailing list and comment on the charter - [18:02] annevk42: in general, i'm trying to keep the focus narrow - [18:03] annevk42: speccing cookie2 is going to take a lot more work and a lot more time than speccing cookie0 - [18:18] abarth, if you're going to spec cookies as implemented set-cookie2 is relevant, no? - [18:18] annevk2: depends how widely its used - [18:18] there was a recent message to the list - [18:19] that suggested very few sites use it - [18:19] i'm not sure we want to lock down the behavior of cookie2 - [18:19] hmm, if we could actually get impl to remove support for it that'd be cool - [18:19] which user agents implement it? - [18:20] I thougt set-cookie2, not cookie2, was implemented, but maybe not - [18:20] i know they're in opera - [18:20] but i'm not sure where else - [18:20] interesting - [18:22] if we're the only ones by all means don't spec it or simply say it's obsolete - [18:23] if we need extensions we can prolly extend cookie0 somehow once the processing model is written down - [18:23] 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] yeah, that's a good point - [18:23] that's what 2109 originally tried to do with Version=1 - [18:24] but i think they put the cart a bit in front of the horse - [18:24] besides rough consensus you need running code :p - [18:24] (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]] 版) [[Netscape Cookie]] 対応と銘打っていますが、 [CODE(HTTP)@en[[[Max-Age]]]] と [CODE(HTTP)@en[[[HttpOnly]]]] にもちゃんと対応しています。 [362] [CITE[Servlet::Http::Cookie - search.cpan.org]] ([TIME[2010-08-01 16:15:08 +09:00]] 版) この [[Perlモジュール]]は、 [[RFC 2109]] に基づいた [[Cookie]] [[API]] を提供しています。 [[Netscape Cookie]] と [[RFC 2109]] の両方に対応しているようで、[[既定値]]は [[Netscape Cookie]] になっています。 [363] [CITE[Mojo::Cookie::Response - search.cpan.org]] ([TIME[2010-08-01 16:18:15 +09:00]] 版) この [[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]] 版) > Apache2.2 と IE6 でsetcookie()で既存の同じ名前と値を設定する場合、有効期限(期間)は更新されない。 有効期限0で一旦セットしてから同じ有効期間をセットする。 > [PRE(PHP example code)[ setcookie($name, $name, 0); setcookie($name, $name, time()+60*60*24*365); ]PRE]