[3] [[Cookie]] 設定時の [DFN[[CODE(HTTP)@en[[[Domain]]]] [[属性]]]]は、その [[Cookie]] の対象となる[[ドメイン名]]を指定します。 [[HTTP]] の [CODE(HTTP)@en[[[Set-Cookie:]]]] [[応答頭欄]]や [[JavaScript]] の [CODE(JS)@en[[[document.cookie]]]] の設定時に用いられます。 * 仕様書 [REFS[ - [32] [CITE@en[RFC 6265 - HTTP State Management Mechanism]] ([TIME[2012-03-01 09:57:02 +09:00]] 版) - [34] '''[CITE@en[RFC 6265 - HTTP State Management Mechanism]] ([TIME[2012-03-01 09:57:02 +09:00]] 版) ''' ]REFS] * 意味 [35] [CODE(HTTP)@en[[[Domain]]]] [[属性]]は、[[クッキー]]が送信されることになる[[ホスト]]を指定します。 [SRC[>>34]] [EG[ [36] 例えば [CODE(HTTP)@en[[[Domain]]=example.com]] であれば、 [CODE[example.com]], [CODE[www.example.com]], [CODE[www.corp.example.com]] のような[[ホスト]]に対する [[HTTP]] [[要求]]で[[クッキー]]が送信されます。 [SRC[>>34]] ]EG] [37] [CODE(HTTP)@en[[[Domain]]]] [[属性]]がなければ、[[起源鯖]]だけに[[クッキー]]を送信するべきであることを表しています。 [SRC[>>34]] * 構文 [FIG[ [FIGCAPTION[ [33] [[RFC 6265]] における [CODE(ABNF)@en[[[Domain]]]] [[属性]]の構文 ]FIGCAPTION] [PRE(ABNF code)[ domain-av = "Domain=" domain-value domain-value = ; defined in [RFC1034], Section 3.5, as ; enhanced by [RFC1123], Section 2.1 ]PRE] ]FIG] ** 先頭の [CODE[.]] [38] [[RFC 6265]] の構文では先頭の [CODE[[[.]]]] は認められていません。また、先頭にあった場合には、 これを無視することになっています [SRC[>>34]]。 ;; [17] [[RFC 2109]] の定義では、[[ドメイン名]]の先頭は [CODE[[[.]]]] でなければならない [SRC[>>14]] とされていました。 また、 [[RFC 2965]] の定義では、先頭が [CODE[[[.]]]] でなければ[[利用者エージェント]]が [CODE[[[.]]]] を補う [SRC[>>16]] とされていました。 ** 末尾の [CODE[.]] [39] [[RFC 6265]] の構文では末尾の [CODE[[[.]]]] は認められておらず、あった場合には[[属性]]全体が無視されることになっています [SRC[>>34]]。 ** IDN [9] [[Cookie]] が定義されたのは [[IDN]] 導入の遥かに前であり、仕様上は [[IDN]] の扱いが明確になっていません。 * 処理モデル ** 末尾一致 [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] 仕様上明記されていませんが、[[ドメイン名]]は[[大文字・小文字を区別しない]]ので、 この[[一致]]の際も差異は無視されるものと思われます。 ** ポート [12] [[ポート番号]]の扱いについては仕様書上に明記されていません。 ;; [18] [[RFC 2965]] では別に [CODE(HTTP)@en[[[Port]]]] [[属性]]が用意されています。 ** 既定値 [40] [CODE(HTTP)@en[[[Domain]]]] [[属性]]を省略した場合、[[クッキー]]は[[起源鯖]]にのみ送られます。 [SRC[>>34]] ;; [8] [[Netscape]] の仕様では、 [CODE(HTTP)@en[[[Domain]]]] [[属性]]が指定されていない場合は [[Cookie]] [[応答]]を生成した[[ホスト]]の名前が指定されたとみなす [SRC[>>1]] とされていました。 [[RFC 6265]] ではこれは誤った動作だけど[[利用者エージェント]]によってはそうすると述べられています [SRC[>>34]]。 [EG[ [41] 例えば [CODE[[[example.com]]]] が [CODE(HTTP)@en[[[Domain]]]] [[属性]]無しの[[クッキー]]を発行した場合、 [CODE[example.com]] への[[要求]]にはこれを送信しますが、 [CODE[www.example.com]] への[[要求]]ではこれを送信してはなりません。 ]EG] ;; [19] [[RFC 2109]] によると[[request-host]] [SRC[>>20]]、[[RFC 2965]] によると[[実効request-host]] [SRC[>>21]] になります。 その場合最初に [CODE(char)[[[.]]]] が付かないので、[[ドメイン一致]]するのはその[[ドメイン]]自体だけになります [SRC[>>21]]。 * 第三者クッキー [6] [CODE(HTTP)@en[[[Domain]]]] で指定された[[ドメイン]]に属する[[ホスト]]だけがその[[ドメイン]]の [[Cookie]] を設定することができます。 [SRC[>>1]] [[利用者エージェント]]は [CODE(HTTP)@en[[[Domain]]]] [[属性]]の範囲外の[[起源鯖]]からの[[クッキー]]を拒否します [SRC[>>34]]。 [EG[ [42] 例えば、 [CODE[foo.example.com]] が[[起源鯖]]の場合、 [CODE[[[Domain]]=example.com]] や [CODE[[[Domain]]=foo.example.com]] は認められますが、 [CODE[[[Domain]]=bar.example.com]] や [CODE[[[Domain]]=baz.foo.example.com]] の[[クッキー]]は無視されます。 [SRC[>>34]] ]EG] ;; [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]]。 ;; [26] 更に、 [[RFC 2109]] では [CODE(HTTP)@en[[[Domain]]]] が [[request-host]] と[[ドメイン一致]]しない場合、 [[RFC 2965]] では [CODE(HTTP)@en[[[Domain]]]] が [[request-host]] の[[実効ホスト名]]と[[ドメイン一致]]しない場合に、その [[Cookie]] を[RUBYB[[[蓄積]]]@en[store]]しては[['''ならない''']]とされていました [SRC[>>23、>>24]]。 ;; [27] 加えて、[[RFC 2109]] と [[RFC 2965]] では、 [[request-host]] が [[IPアドレス]]では''なく''、 [CODE[[[.]]]] を含まない文字列 [VAR[H]] と [CODE(HTTP)@en[[[Domain]]]] の値 [VAR[D]] を使って [CODE[[VAR[H]][VAR[D]]]] と表せる場合に、その [[Cookie]] を[RUBYB[[[蓄積]]]@en[store]]しては[['''ならない''']]とされていました [SRC[>>23、>>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 の制約との関係は仕様上明確にされていません。 * 歴史 ** Netscape Cookie [REFS[ -[1] [[Netscape Cookie]]: [CITE[Client Side State - HTTP Cookies]] ]REFS] ** RFC 2109 の [CODE(HTTP)@en[Set-Cookie]] の定義 [31] [[RFC 2109]], [[RFC 2965]] では、[[利用者エージェント]]には異なる[[ドメイン]]の[[ホスト]]での[[セッション]]情報の共有を可能な限り阻止する[['''べき''']] [SRC[>>30, >>29]] とのよくわからない要件が課されていました。 *** 仕様書 - [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]] -- [30] [CSECTION@en[8.3 Unexpected Cookie Sharing]] ** 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]] -- [29] [CSECTION@en[7.3 Unexpected Cookie Sharing]] * 関連 [28] [[RFC 2109]]、[[RFC 2965]] では[[利用者エージェント]]が返送する時に [CODE(HTTP)@en[[[Cookie:]]]] に [CODE(HTTP)@en[[[$Domain]]]] [[属性]]として含めることになっていました。 * メモ [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とそれ以外でだいぶ異なるみたいなので注意]]