document.cookie

document.cookie

document.cookie 属性 (DOM HTML)

[18] 本章の記述は、2009年2月1日時点の WHATWG HTML5 勧告案 (r2733) に基づいています。

[19] document.cookie 属性は、 当該資源クッキーを表します HTML5

仕様書

[15] 実装仕様書:

[16] >>7 は大して参考になりません。 >>8 は比較的参考になります。

取得

[20] 取得時には、 document.cookie 属性は次のように動作しなければなりません HTML5

  1. 文書閲覧文脈に関連付けられていなければ、 INVALID_STATE_ERR 例外を投げます。
  2. 文書閲覧文脈砂箱化起源閲覧文脈旗が設定されていれば、 SECURITY_ERR を投げます。
  3. 文書の番地鯖型命名局を使っていなければ、空文字列を返します。
  4. 当該文書の番地によって示された資源HTTP によって取る場合に Cookie: HTTP 頭欄の値として使う文字列と同じものを、 RFC 2109 4.3.4節またはより新しい仕様書に基づき返します。ただし、 HTTPのみのクッキーは除きます。

設定

[21] 設定時には、 document.cookie 属性は次のように動作しなければなりません HTML5

  1. 文書閲覧文脈に関連付けられていなければ、 INVALID_STATE_ERR 例外を投げます。
  2. 文書閲覧文脈砂箱化起源閲覧文脈旗が設定されていれば、 SECURITY_ERR を投げます。
  3. 文書の番地鯖型命名局を使っていなければ、空文字列を返します。
  4. 当該文書の番地HTTP によって取ることを丁度試みようとしたところ、 Set-Cookie: 頭欄として指定された値が返されたとした場合と同じようにして、 RFC 2109 4.3.1〜4.3.3節またはより新しい仕様書に基づきクッキーを処理します。ただし、 HTTPのみのクッキーの値を上書きすることはありません。

[22] document.cookie の覚え書き - Ci.nsIZIGOROu - Mozilla 拡張機能勉強会 ( 版) <http://moz-addon.g.hatena.ne.jp/ZIGOROu/20081001/1222845305>

ところで、a=1, b=2 と言う二つを同時に設定する事は出来ません。

document.cookie="a=1;b=2";
alert(document.cookie);
とやると a=1 しか設定出来てません。

[23]

A, B と言うタブを開いていて、共に test.example.com のページだとすると。

A の document.cookie を弄ると、A での変更は B でも読める権限ならば即座に反映されている。

歴史

[1] DOM 0+ の属性 HTMLDocument.cookie は、当該文書に関連付けられた持続状態情報 (Cookie) を扱うための属性です。 属性値の型は DOMString です。

DOM 1 FE ではこの属性は読取専用でした。

DOM 1 は意味的な点には触れていません。 DOM 2 は RFC 2965 を参照しています。 DOM 2 仕様書は UA のセッションについての正確な動作は規定しないと言っています。

仕様書:

[2] この属性を読むと得られる値は、 cookie の名前と値の組の群を ; で連結して一つの文字列にしたものです。 Cookie が一つもないときには、空文字列となります。

と DOM 1,2 仕様書に書いてあるのですが、 こんな説明で本当にいいのでしょうか。 これだけを読んで実装できる人なんているはずがない。

一応、 DOM 1 には更に name=value;expires=date という例が載っています。

[3] DOM 1 FE ではこの属性は読取専用ですが、 DOM 0 と DOM 2+ では書込むこともできます。 DOM 1 SE では読取専用ではなくなっていますが、 説明は DOM 1 SE とほとんど同じで、書くときの構文の説明がありません。

この属性に書くときの値は、 RFC 2965 の cookie (>>5) とするべき (should) です。

Cookie 名が既に使用されていれば、 新しい値と cookie 属性に置きかえられます。

Cookie 属性の既定値:

domain
現在の文書/枠の絶対URIhost
path
現在の文書/枠の絶対 URI の絶対 path 部分。
max-age
UA の既定値。

max-age0 なら、 当該名の cookie は削除します。

[4] >>3 で構文が不適切だと、 DOMException SYNTAX_ERROR が発生します。

保安性

[13] 2004-04-27 - 「高木浩光@茨城県つくば市の日記」跡地 ( 版) <http://d.hatena.ne.jp/HiromitsuTakagi/20040427>

携帯電話のブラウザでは、どのみち完全なPC向けWebサイト対応は期待されていないのだから、この際思い切って、document.cookie機能を搭載しないでおいたらどうか。「セキュリティを重視して危ない機能は排除した」と主張すればよい。

一部の掲示板等でdocument.cookieが使われている(cookieで覚えさせたハンドルやメールアドレスを名前欄、E-mail欄に表示するため)が、JavaScriptを使わなくともCGI側で同じことを実現できるのだから、こんな機能はなくなってもかまわないはずだ。

関連

[6] MathMLSVGHTMLDocument に相当する MathMLDocumentSVGDocument を持っているのですが、そいつらは cookie 属性は持っていないようです。

メモ

[24] setTimeout + document.cookie - Ci.nsIZIGOROu - Mozilla 拡張機能勉強会 ( 版) <http://moz-addon.g.hatena.ne.jp/ZIGOROu/20081009/1223567665>

browserc
IE715981
Fx320000
Opera 9.519995
Safari 420000
Chrome 0.216065

まぁこの結果見ると 20,000 と言う結果が出るブラウザの方がひょっとしたらたまたまで、他のブラウザの結果が普通かもしれない。まぁその是非は置いといて少なくとも言える事は、20,000にならないブラウザは、setTimeout() に指定した関数内の処理も非同期になっていて、実行順序が保障されてないと考えられる。