[3] [[Cookie]] 設定時の [DFN[[CODE(HTTP)@en[[[Domain]]]] [[属性]]]]は、その [[Cookie]] の対象となる[[ドメイン名]]を指定します。 [[HTTP]] の [CODE(HTTP)@en[[[Set-Cookie:]]]] [[応答頭欄]]や [[JavaScript]] の [CODE(JS)@en[[[document.cookie]]]] の設定時に用いられます。 * 仕様書 -[1] [[Netscape Cookie]]: [CITE[Client Side State - HTTP Cookies]] * 処理モデル ** 末尾一致 [4] [[妥当]]な [[Cookie]] を探す際に、[[Cookie]] の [CODE(HTTP)@en[[[Domain]]]] [[属性]]と、 [[fetch]] しようとしている [[URL]] の[[ドメイン名]]の部分とを比較します。 ここで[[末尾一致]]していれば、更に [CODE(HTTP)@en[[[Path]]]] の比較へと進みます。 [SRC[>>1]] 一致していなければその [[Cookie]] は妥当ではなく、[[HTTP]] [[要求]]の [CODE(HTTP)@en[[[Cookie:]]]] [[頭欄]]には含まれません。 [5] ここで[DFN[[RUBYB[[[末尾一致]]]@en[tail matching]]]]とは、 [[fetch]] しようとしている[[ホスト]]の[[完全修飾ドメイン名]] ([[FQDN]]) の末尾に [CODE(HTTP)@en[[[Domain]]]] [[属性]]の値が一致することをいいます。 [SRC[>>1]] ;; 例えば、 [CODE(HTTP)@en[[[Domain]]=acme.com]] は [CODE@en[anvil.acme.com]] や [CODE@en[shipping.crate.acme.com]] と一致します。 [SRC[>>1]] [11] 仕様上明記されていませんが、[[ドメイン名]]は[[大文字・小文字を区別しない]]ので、 この[[一致]]の際も差異は無視されるものと思われます。 ** 先頭の [CODE[.]] ;; [17] [[RFC 2109]] の定義では、[[ドメイン名]]の先頭は [CODE[[[.]]]] でなければならない [SRC[>>14]] とされていました。 また、 [[RFC 2965]] の定義では、先頭が [CODE[[[.]]]] でなければ[[利用者エージェント]]が [CODE[[[.]]]] を補う [SRC[>>16]] とされていました。 ** 第3者発行 [6] [CODE(HTTP)@en[[[Domain]]]] で指定された[[ドメイン]]に属する[[ホスト]]だけがその[[ドメイン]]の [[Cookie]] を設定することができます。 [SRC[>>1]] ;; [22] [[RFC 2109]] では、[CODE(HTTP)@en[[[Domain]]]] が途中に [CODE[[[.]]]] を含まない場合や [CODE[[[.]]]] から始まらない場合にはその [[Cookie]] を[RUBYB[[[蓄積]]]@en[store]]しては[['''ならない''']]とされていました [SRC[>>23]]。 ;; [25] [[RFC 2965]] では [CODE(HTTP)@en[[[Domain]]]] が途中に [CODE[[[.]]]] を含まない場合でその値が [CODE(HTTP)@en[[[.local]]]] ではない時にその [[Cookie]] を[RUBYB[[[蓄積]]]@en[store]]しては[['''ならない''']]とされていました [SRC[>>24]]。 ** TLD [7] [CODE(HTTP)@en[[[Domain]]]] で設定する[[ドメイン名]]には少なくても2つか3つの [CODE(char)[[[.]]]] が含まれていなければなりません。基本的には3つ以上で、2つでもよいのは [CODE@en[[[.com]]]], [CODE@en[[[.edu]]]], [CODE@en[[[.net]]]], [CODE@en[[[.org]]]], [CODE@en[[[.gov]]]], [CODE@en[[[.mil]]]], [CODE@en[[[.int]]]] の7つの [[gTLD]] だけです。 [SRC[>>1]] [10] [[FQDN]] であることを明示する際に [CODE[foo.example.]] のように最後に [CODE[[[.]]]] を付けることがありますが、これと >>4 の処理モデルや >>7 の制約との関係は仕様上明確にされていません。 ** IDN [9] [[Cookie]] が定義されたのは [[IDN]] 導入の遥かに前であり、仕様上は [[IDN]] の扱いが明確になっていません。 ** ポート [12] [[ポート番号]]の扱いについては仕様書上に明記されていません。 ;; [18] [[RFC 2965]] では別に [CODE(HTTP)@en[[[Port]]]] [[属性]]が用意されています。 ** 既定値 [8] [CODE(HTTP)@en[[[Domain]]]] [[属性]]が指定されていない場合は [[Cookie]] [[応答]]を生成した[[ホスト]]の名前が指定されたとみなします。 [SRC[>>1]] ;; [19] [[RFC 2109]] によると[[request-host]] [SRC[>>20]]、[[RFC 2965]] によると[[実効request-host]] [SRC[>>21]] になります。 その場合最初に [CODE(char)[[[.]]]] が付かないので、[[ドメイン一致]]するのはその[[ドメイン]]自体だけになります [SRC[>>21]]。 * 歴史 ** RFC 2109 の [CODE(HTTP)@en[Set-Cookie]] の定義 *** 仕様書 - [13] [DEL[[[RFC 2109]]]] ([[廃止]]済み) -- [14] '''[CSECTION@en[4.2.2 Set-Cookie2 Syntax]]''' -- [20] [CSECTION@en[4.3.1 Interpreting Set-Cookie2]] -- [23] [CSECTION@en[4.3.2 Rejecting Cookies]] ** RFC 2965 の [CODE(HTTP)@en[Set-Cookie2] の定義 *** 仕様書 - [15] [[RFC 2965]] -- [16] '''[CSECTION@en[3.2.2 Set-Cookie2 Syntax]]''' -- [21] [CSECTION@en[3.3.1 Interpreting Set-Cookie2]] -- [24] [CSECTION@en[3.3.2 Rejecting Cookies]] * メモ [2] [CITE[document.cookie の覚え書き - Ci.nsIZIGOROu - Mozilla 拡張機能勉強会]] ([TIME[2009-02-01 18:27:09 +09:00]] 版) >現在 test.example.com で実行してるとして、 [PRE(JS example code)[ document.cookie = "Z=1"; alert(document.cookie); document.cookie = "Z=2;domain=example.com"; alert(document.cookie); document.cookie = "Z=3;domain=test.example.com"; alert(document.cookie); ]PRE] は IE6, 7 の場合、最終的に "Z=3;Z=2" となるのだが、Fx3, Safari だと、"Z=1;Z=2;Z=3" となる。 >domain が省略された場合、test.example.com 相当で設定したとされるべきだと思うんだけど。 > と思ったら、domain パラメータの挙動について見ている所が netscape の決めた奴と言う古い奴見てた事が判明。 >> :Domain=domain:Optional. The Domain attribute specifies the domain for which the cookie is valid. An explicitly specified domain must always start with a dot. >> RFC 2109 - 4.2.2 Set-Cookie Syntax >つまり、指定するなら "." から開始しないとだめぽって事。 >省略した場合の挙動は、 >> Domain Defaults to the request-host. (Note that there is no dot at the beginning of request-host.) >>RFC 2109 - 4.3.1 Interpreting Set-Cookie >"." を先頭につけないのが正しいと。 >[DEL[まぁこれらの結果分かるのは、domain 指定がある場合、別々の物として key-value のペアが管理されますよと考えられると。]] >[INS[この挙動、IEとそれ以外でだいぶ異なるみたいなので注意]]