[1] [CODE(HTTP)@en[[[Set-Cookie:]]]] 欄には名前と値を [CODE(HTTP)[[[=]]]] で連結した組を [CODE(HTTP)[[[;]]]] で区切って複数記述することができます。これを [[Cookie]]の[DFN[[RUBYB[[[属性]]]@en[attribute]]]]といいます。 [3] 元々の [[Netscape]] の [[Cookie]] 仕様 (>>2) では最初の任意の名前と値の組 ([[cookie-pair]]) も[[属性]]と呼んでいましたが、 [[RFC 6265]] はその後に続く [[cookie-av]] だけを[[属性]]と呼んでいます。 * 仕様書 [REFS[ - [377] '''[CITE@en[RFC 6265 - HTTP State Management Mechanism]] ([TIME[2012-03-01 09:57:02 +09:00]] 版) ''' ]REFS] * 構文 [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 ) cookie-pair = cookie-name "=" cookie-value cookie-name = token cookie-value = *cookie-octet / ( DQUOTE *cookie-octet DQUOTE ) cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E ; US-ASCII characters excluding CTLs, ; whitespace DQUOTE, comma, semicolon, ; and backslash token = cookie-av = expires-av / max-age-av / domain-av / path-av / secure-av / httponly-av / extension-av extension-av = ]PRE] ]FIG] ** 順序 [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)[[[$]]]] は特別な[[属性]]を表すために使われていました。) * 属性の一覧 [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[[[HttpOnly]]]],[[HTTP]] 専用,[[事実上の標準]], ,[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]]。 * 歴史 ** Netscape Cookie [REFS[ - [2] [[Netscape Cookie]] -- [CITE[Client Side State - HTTP Cookies]] ]REFS]