Cookieの属性

属性 (Cookie)

[1] Set-Cookie: 欄には名前と値を = で連結した組を ; で区切って複数記述することができます。これを Cookie属性 (attribute) といいます。

[3] 元々の NetscapeCookie 仕様 (>>2) では最初の任意の名前と値の組 (cookie-pair) も属性と呼んでいましたが、 RFC 6265 はその後に続く cookie-av だけを属性と呼んでいます。

仕様書

構文

[378] Set-Cookie: 欄の構文は次のように定義されています。 起源鯖はこの構文に従うべきです >>377

[379] なぜか違反を完全に禁止はされていません...

[380] RFC 6265 >>377, >>24 による Set-Cookie: 欄の構文

 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             = <token, defined in [RFC2616], Section 2.2>

 cookie-av         = expires-av / max-age-av / domain-av /
                     path-av / secure-av / httponly-av /
                     extension-av
 extension-av      = *<any CHAR except CTLs or ";">

順序

[5] 名前と値の組の順序については明確に規定されていませんが、 Cookie として設定する名前と値の組 NAME=VALUE の後に他の属性を適当な順番で記述します。

[325] RFC 2109, RFC 2965 では NAME=VALUE の後に他の属性が来ること、他の属性の順序は任意であることが明記されていました。 >>324, >>323

[326] 属性の名前が同じものが複数回使われている場合の解釈については触れられていません。

[327] RFC 2109 ではその場合の動作は未定義とされていました >>324RFC 2965 では最初に現れたものが有効であるとされていました >>323

大文字と小文字

[12] 属性の名前や値の大文字と小文字を区別しないかどうかは仕様上明記されていません。 仕様書上は属性の名前はすべて小文字で記述されています。

重複

[385] 同じ名前の属性は複数あるべきではありません>>377

[386] なぜか完全に禁止はされていません。

[18] 複数指定された場合、最後の属性が採用されます。

Set-Cookie: 参照。

引用文字列

[315] HTTPMIME の他の頭欄では値は字句 (token) 引用文字列 (quoted-string) のいずれかとするのが一般的ですが、 Netscape Cookie では引用文字列は認められておらず、 どんな文字列であってもそのまま値としなければなりません。

[316] RFC 2109, RFC 2965 では値は字句または引用文字列とされていました。 >>313, >>310

[19] 仮に引用文字列を指定しても、 " は区切りではなく値の一部として認識されますし、 " で括ったとしてもその中の ;= は区切りとして認識されてしまいます。

空白

[317] HTTPMIME の他の頭欄では特定の字句の間には空白 (white space) を挿入することが認められていましたが、 Netscape Cookie で認められているのかどうかは不明確です。仕様書の記述から、 「;」の直後に挿入することは認められているようです。

[316] RFC 2109, RFC 2965 では字句の間に空白を入れてもよいとされていました。 >>313, >>310

[20] RFC 6265 では ; の直後に1つだけ SPACE を書かなければならないと明確化されました。

構文解析

[16] ヘッダー全体の構文解析については、 Set-Cookie:Set-Cookie: を参照してください。

[17]属性の値の構文解析については、各属性の項を参照してください。

属性の一覧

[6]

属性名説明状態出典
NAME>>7事実上の標準, IETF 提案標準Netscape Cookie, RFC 2109, RFC 2965
Comment注釈IETF 提案標準RFC 2109, RFC 2965
CommentURL注釈URLIETF 提案標準RFC 2965
Domain対象となるドメイン事実上の標準, IETF 提案標準Netscape Cookie, RFC 2109, RFC 2965
Expires有効期限事実上の標準Netscape Cookie
HttpOnlyHTTP 専用事実上の標準
Max-Age寿命IETF 提案標準, 事実上の標準RFC 2109, RFC 2965
Path対象となる path事実上の標準, IETF 提案標準Netscape Cookie, RFC 2109, RFC 2965
Port対象となるポートIETF 提案標準RFC 2965
Secure安全でなければならないか否か事実上の標準, IETF 提案標準Netscape Cookie, RFC 2109, RFC 2965
VersionCookie 仕様のIETF 提案標準RFC 2109, RFC 2965

[329] 「※」は Set-Cookie2: 頭欄でのみ定義されていることを表します。 また、 ExpiresSet-Cookie: 頭欄でのみ定義されています。

未知の属性

[27] Set-Cookie: に未知の属性を指定することは構文上は認められています。 仕様上は明示的には禁止されていません。

[25] 利用者エージェントは、未知の属性を無視しなければなりません。

Set-Cookie: を参照。
[342] 未知の属性の扱いは RFC 2109 では明確には規定されていませんでしたが、 RFC 2965 では利用者エージェントは未知の属性を無視しなければなりませんとされていました >>341

[26] 他の HTTPヘッダーの多くは現在では IANA登録簿が設けられていますが、 Set-Cookie: に関しては IANA登録簿がありません。

[28] 歴史的には、 Netscape Cookie に含まれなかった Max-Age 属性HttpOnly 属性が新たに追加されています。 今後も更に属性が追加される可能性はあります。しかし大量に新たな属性が標準に追加されたり、 利用者エージェントが独自の属性を積極的に実装したりすることは当面なさそうです。

歴史