cookie

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() に指定した関数内の処理も非同期になっていて、実行順序が保障されてないと考えられる。

メモ

[25] [whatwg] HTML Cookie API ( 版) http://lists.whatwg.org/pipermail/whatwg-whatwg.org/2010-February/025300.html

[26] クライアントサイドの巨大なクッキーとサーバーサイドのヘッダーサイズ制限の組み合わせによるDoSについて - デー ( ( 版)) http://d.hatena.ne.jp/ultraist/20120417/1334667427

[27] JavaScriptでdocument.cookieへのアクセスを禁止する - 金利0無利息キャッシング – キャッシングできます - subtech ( ( 版)) http://subtech.g.hatena.ne.jp/mala/20120709/1341819651

[28] [whatwg] HTML Cookie API ( (Ian Hickson 著, 版)) http://lists.w3.org/Archives/Public/public-whatwg-archive/2010Mar/0068.html

[9] Cookies Settings Observations ( (Daniel Appelquist 著, 版)) http://lists.w3.org/Archives/Public/www-tag/2015Jan/0185.html

[29] Bug 28393 – Determine which cookies to include before returning. ( 版) https://www.w3.org/Bugs/Public/show_bug.cgi?id=28393

[30] Remove the storage mutex · Issue #335 · whatwg/html ( 版) https://github.com/whatwg/html/issues/335

[31] Remove the storage mutex due to lack of implementation · whatwg/html@1b918cf ( 版) https://github.com/whatwg/html/commit/1b918cf72fcbba011f83b92ab5d1f483fb1cafa3

[32] Update integration with Encoding Standard · whatwg/html@6a31c26 ( 版) https://github.com/whatwg/html/commit/6a31c26cf12e39dab1a488e75dd56c03d6786d39

[33] Cleanup origin serialization · whatwg/html@5dcc1ee ( 版) https://github.com/whatwg/html/commit/5dcc1ee2124b5e54955845790bb47f5d1351d672

[34] Define "server-based naming authority" in terms of URL · whatwg/html@da7b5ba ( 版) https://github.com/whatwg/html/commit/da7b5baf5815754cc40387452ae41e989848032f

[35] Merge effective script origin into origin · whatwg/html@8a843f2 ( 版) https://github.com/whatwg/html/commit/8a843f2169a6864a3024c4329528dccb2051d275

[36] Use USVString for document.domain/referrer/cookie · whatwg/html@8170d82 ( 版) https://github.com/whatwg/html/commit/8170d82a2fc93c8ff7981c54aa4ccafd54204552

[37] 2012-07-09 - 金利0無利息キャッシング – キャッシングできます - subtech ( ()) https://subtech.g.hatena.ne.jp/mala/20120709

[38] Actions required to mitigate Speculative Side-Channel Attack techniques - The Chromium Projects () https://www.chromium.org/Home/chromium-security/ssca

[39] Meltdown/Spectre  |  Web  |  Google Developers () https://developers.google.com/web/updates/2018/02/meltdown-spectre