* Cookie に関係するプロトコル要素 - [41] [[HTTP頭欄]] -- [CODE(HTTP)@en[[[Set-Cookie:]]]] -- [CODE(HTTP)@en[[[Set-Cookie2:]]]] -- [CODE(HTTP)@en[[[Cookie:]]]] -- [CODE(HTTP)@en[[[Cookie2:]]]] - [42] [[IDL属性]] -- [CODE(JS)@en[[[document.cookie]]]] - [43] [[Cookie]] [[属性]] -- [CODE(HTTP)@en[[[Domain]]]], [CODE(HTTP)@en[[[$Domain]]]] -- [CODE(HTTP)@en[[[Port]]]], [CODE(HTTP)@en[[[$Port]]]] -- [CODE(HTTP)@en[[[Path]]]], [CODE(HTTP)@en[[[$Path]]]] -- [CODE(HTTP)@en[[[Expires]]]] -- [CODE(HTTP)@en[[[Max-Age]]]] -- [CODE(HTTP)@en[[[Secure]]]] -- [CODE(HTTP)@en[[[Version]]]], [CODE(HTTP)@en[[[$Version]]]] -- [CODE(HTTP)@en[[[HttpOnly]]]] - [44] [[Cookieの日付形式]] - [45] [[Cookieのサイズ制限]] - [46] [[クッキー串]] * 仕様書 - [47] [[NetscapeのCookie仕様]] -- [[HTTP]] の [[Cookie]] はここで規定されています。 - [48] [[Web Applications 1.0]] -- [CODE(JS)@en[[[document.cookie]]]] はここで規定されています。 * 定義 ** RFC における定義 [50] > Because it was used in Netscape's original implementation of state management, we will use the term cookie to refer to the state information that passes between an origin server and user agent, and that gets stored by the user agent. > [[起源鯖]]と[[利用者エージェント]]の間で受け渡しされ、[[利用者エージェント]]で蓄積される状態情報を、 [[Netscape]] の元々の状態管理の実装で「cookie」となっていたので、 ここでも [DFN@[cookie]] と呼びます。 ;; [[RFC 2109]] [CSECTION@en[2. TERMINOLOGY]]/[[RFC 2965]] [CSECTION@en[1. TERMINOLOGY]] * 関連 [49] [[Cookie]] は [[JavaScript]] による [[Webブラウザ]]上の[[ストレージ]]としても使われてきましたが、 特に[[鯖]]にデータを送信する必要がない (ほとんどの) 場合のために新たに [[Web Storage]] 仕様が作られ、ほとんどの [[Webブラウザ]]で利用可能となっています。 * メモ [3] Cookie を有効にしろと言って、見に来た人を追い出す Web site は逝ってよし。読む価値なし。 [6] Cookie の有効期限の指定については、[[Cookieの日付形式]]を参照。 [7] Your cookie: - [[#form:'Cookie: [CODE(HTTP)[%cgi-meta-variable(category=>HTTP,name=>COOKIE); ]]':'':'%output(form=>0);']] - [[#form:'Cookie2: [CODE(HTTP)[%cgi-meta-variable(category=>HTTP,name=>COOKIE2); ]]':'':'%output(form=>0);']] - [[#form:'Set-Cookie: [CODE(HTTP)[%cgi-meta-variable(category=>HTTP,name=>SET_COOKIE); ]]':'':'%output(form=>0);']] (あるのはおかしい) - [[#form:'Set-Cookie2: [CODE(HTTP)[%cgi-meta-variable(category=>HTTP,name=>SET_COOKIE2); ]]':'':'%output(form=>0);']] (あるのはおかしい) [8] >>7 でもし何か面白い結果がでていたら、是非あなたのお使いの環境と一緒に報告してください。 [16] aaa ([[a]] [WEAK[2003-12-02 03:56:42 +00:00]]) [[#form:'%submit(label=>書き込む); %check(default,id=>record-name,label=>名前);%text(label=>" : ",id=>name,size=>"9.5"); %text(label=>"メイル: ",id=>mail,size=>9.5); %check(default,id=>record-date,label=>日付を記録);%n;%textarea(id=>msg,size=>35,lines=>5);':'[%index;] %text(source=>msg);%iif(source=>record-name,true=>" (%name;%text(source=>mail,prefix=>" [",suffix=>"]");%iif(source=>record-date,true=>" [WEAK[%date;]]");)");%n;':'%require(msg);']] * HTTP header で使う Cookie [12] [[EZWeb]] の端末は [CODE(HTTP)[Version=1]] の Cookie にも対応しているようなことが''技術情報'' には書かれていますが、怪しい記述ばかりで本当かどうか不明です。 ここには [CODE(HTTP)[Version]] パラメーターが指定されていないと [CODE(HTTP)[Version=0]] とみなされることが説明されているだけです。 [[#form:'%submit(label=>書き込む); %check(default,id=>record-name,label=>名前);%text(label=>" : ",id=>name,size=>"9.5"); %text(label=>"メイル: ",id=>mail,size=>9.5); %check(default,id=>record-date,label=>日付を記録);%n;%textarea(id=>msg,size=>35,lines=>5);':'[%index;] %text(source=>msg);%iif(source=>record-name,true=>" (%name;%text(source=>mail,prefix=>" [",suffix=>"]");%iif(source=>record-date,true=>" [WEAK[%date;]]");)");%n;':'%require(msg);']] * JavaScript で使う cookie [4] [[HTML]] と関連付けられた [[JavaScript]] では、 [CODE(JS)[document.cookie]] で cookie に access できます。 [5] >>4 [[Mozilla]] では、まだ [[XHTML]] の時にこれが出来ません。 ([[JavaScriptのQ&A]>>11] を参照。) [[#form:'%submit(label=>書き込む); %check(default,id=>record-name,label=>名前);%text(label=>" : ",id=>name,size=>"9.5"); %text(label=>"メイル: ",id=>mail,size=>9.5); %check(default,id=>record-date,label=>日付を記録);%n;%textarea(id=>msg,size=>35,lines=>5);':'[%index;] %text(source=>msg);%iif(source=>record-name,true=>" (%name;%text(source=>mail,prefix=>" [",suffix=>"]");%iif(source=>record-date,true=>" [WEAK[%date;]]");)");%n;':'%require(msg);']] * 仕様 - [[RFC2109のCookie仕様]] (Version=1) - [[RFC2965のCookie仕様]] (Version=1) - RFC 2964 『Use of HTTP State Management』 [17] - HTTP State Management Specification WAP-223-HTTPSM-20001213-a - HTTP State Management SIN WAP-223_101-HTTPSM-20010928-a (Editorial な修正だけで前版と同じ) これらの規格は、[[クッキー串]]に Cookie 管理を一部肩代わりさせるための仕組みを定義しています。 [18] [CITE[IETF mailing list for HTTP State Management Mechanism - ietf-httponly-wg | Google グループ]] ([TIME[2008-12-23 22:15:04 +09:00]] 版) * Q&A ** DOM で Cookie の指定 [13] '''質問''' (''[[名無しさん]]'' [WEAK[2003-07-31 07:00:44 +00:00]]): ある本によると、 [CODE(JS)[document.cookie = "name=value;expires=March 14, 1998 12:12:00; domain=example.net; path=/path/to/something; secure=true"]] のように書いて、 [CODE[secure]] (既定値 [CODE[false]]) が [CODE[true]] だとその Cookie はサーバーに送信され、 そうでなければされないそうですが、これは正しいんですか? [20] というか [CODE(HTTP)[[[secure]]]] 属性は値を取らない属性として定義されているはずなのに胡散臭い本だよなあ。 [[#form:'%radio(id=>type,label=>回答,value=>false,default); or %radio(id=>type,label=>追加質問,value=>true);: %text(label=>"名前 : ",id=>name,size=>"9.5"); %text(label=>"メイル: ",id=>mail,size=>9.5); %check(default,id=>record-date,label=>日付を記録);%n;%textarea(id=>a,size=>20);':'[%index;] %iif(source=>type,true=>"\'\'\'質問\'\'\' ",false=>"");\'\'%name;\'\'%text(source=>mail,prefix=>" [",suffix=>"]");%iif(source=>record-date,true=>" [WEAK[%date;]]");: %text(source=>a);%n;':'%require(a);']] ** Cookie の消去 [21] '''Q:''' 以前に設定した Cookie を消去するにはどうしたらよいですか? [22] '''A:''' 有効期限 ([CODE(HTTP)[[[expires]]]]) を過去の日付に設定しましょう。 [[#form:'%radio(id=>type,label=>回答,value=>false,default); or %radio(id=>type,label=>追加質問,value=>true);: %text(label=>"名前 : ",id=>name,size=>"9.5"); %text(label=>"メイル: ",id=>mail,size=>9.5); %check(default,id=>record-date,label=>日付を記録);%n;%textarea(id=>a,size=>20);':'[%index;] %iif(source=>type,true=>"\'\'\'質問\'\'\' ",false=>"");\'\'%name;\'\'%text(source=>mail,prefix=>" [",suffix=>"]");%iif(source=>record-date,true=>" [WEAK[%date;]]");: %text(source=>a);%n;':'%require(a);']] ** 他のサイトに Cookie を設定 [23] '''Q:''' [SAMP[a.example]] というドメインのページで [SAMP[b.example]] というドメインの Cookie を設定したいのですが、 なぜか設定されません。同じドメインなら設定できます。なぜでしょうか? [24] '''A:''' このような[Q[第3者 Cookie]] は安全上の理由から禁止されています。 [[#form:'%radio(id=>type,label=>回答,value=>false,default); or %radio(id=>type,label=>追加質問,value=>true);: %text(label=>"名前 : ",id=>name,size=>"9.5"); %text(label=>"メイル: ",id=>mail,size=>9.5); %check(default,id=>record-date,label=>日付を記録);%n;%textarea(id=>a,size=>20);':'[%index;] %iif(source=>type,true=>"\'\'\'質問\'\'\' ",false=>"");\'\'%name;\'\'%text(source=>mail,prefix=>" [",suffix=>"]");%iif(source=>record-date,true=>" [WEAK[%date;]]");: %text(source=>a);%n;':'%require(a);']] ** GMT記述は必須? [25] '''質問''' (''[[Air]]'' [WEAK[2005-04-22 11:56:41 +00:00]]): expires項目には日付時間の後にGMTの記述が必要と書いてあるのを見かけますが、 無い場合は、不具合が発生する可能性があるのでしょうか? [26] ''[[名無しさん]]'' [WEAK[2005-04-23 01:23:48 +00:00]]: >>25 よく使われている [[NetscapeのCookie仕様]]は [CODE(HTTP)[[[expires]]]] [[属性]]の書式についての規定が曖昧ですが、 - 日付が [[GMT]] でなければならないことと - 最後に [CODE(HTTP)[GMT]] と書かなければならないこと は明記されています。 前者から、[[利用者エージェント]]が甘く解釈して [CODE(HTTP)[GMT]] と書かれていなくても勝手に [[GMT]] と理解してくれることはあるかもしれませんが、 そうだとしてもエラー処理に過ぎず、 仕様上は認められていません。 書かれていなければ''不具合が発生する可能性が高いです''。 参考: どんな不具合が発生するか [WEAK[(しないか)]] は実装次第ですが、 特に次のようなことが考えられます。 - 意図しない[[時間帯]] [WEAK[([[利用者エージェント]]の計算機のある地域の時間など)]] と解釈される - [CODE(HTTP)[[[expires]]]] 属性自体が書式無効として無視される - [CODE(HTTP)[[[Set-Cookie]]:]] 欄自体が書式無効として無視される - 書式無効により、悪意があるかもしれないので [[Webブラウザ]]がより安全な [WEAK[(機能が制限された)]] モードに移行する など。 * 利用者界面 [51] [[IETF]] の [[Cookie]] 仕様 ([[RFC 2109]]、[[RFC 2965]]) は[[プライバシー]]を根拠に次のことを[[利用者エージェント]]に求めていました。 ;; [[RFC 2109]] [CSECTION@en[7.1 User Agent Control]], [[RFC 2965]] [CSECTION@en[6.1 User Agent Control]] - [52] [[利用者]]が完全に [[Cookie]] の送信と保存を無効化できなければ[['''なりません''']]。 - [53] [[利用者]]が[RUBYB[状態[[セッション]]]@en[stateful session]]が進行中かどうかを判断できなければ[['''なりません''']]。 - [54] [[利用者]]が [[Cookie]] の [CODE(HTTP)@en[[[Domain]]]] [[属性]]に基づき [[Cookie]] を保存するか制御できなければ[['''なりません'''。 - [55] [[利用者]]が [CODE(HTTP)@en[[[Cookie:]]]] [[頭欄]]を送信しないように設定できる[['''べきです''']]。 - [56] [[利用者エージェント]]が終了する時にすべての状態情報を[[利用者]]に捨てさせる[['''べきです''']]。かわりに状態情報を保持するかどうかを[[利用者]]に尋ねて[['''構いません''']]。そのとき既定値は「いいえ」であるべきです。 [57] 更に、 [[RFC 2965]] [CSECTION@en[6.2 Origin Server Role]] は[[起源鯖]]にも[[利用者]]に提示する情報の提供を求めています。 - [58] [[起源鯖]]は [[Cookie]] に [CODE(HTTP)@en[[[CommentURL]]]] [[属性]]か [CODE(HTTP)@en[[[Comment]]]] [[属性]]を追加するべきです。[CODE(HTTP)@en[[[CommentURL]]]] [[属性]]の方が[[多言語]]などリッチに情報提供できるので[RUBYB[好ましいです]@en[preferred]]。 * 関連 URI - [2] Session Identification URI (W3C WD) - [1] ''The Unofficial Cookie FAQ'' (英文) - [9] ''Hey! Java Programming! //Cookie//'' - [10] ''HTTP-State Mailing List Homepage'' - [11] ''You've eaten a lot of cookies'' - [14] 経産省、Cookie盗聴への対策を指示 [CODE(HTTP)[[[secure]]]] 属性が正しく運用されていないことを指摘しているのが特に評価できるというかなんというか。 - [15] [WEAK[2003-09-19 11:43:37 +00:00]] ''[[名無しさん]]'': ''理解せずに語られているcookieのプライバシー性 - 高木浩光@茨城県つくば市 の日記'' - [19] : Cookie の語源は? という話。 2003年。 ([[fj]] にもまだまともなスレがちゃんとあるんだな・・往時ならもっと活発だったかもしれんが。) [27] [CITE[IE,Mozilla,KonquerorにCookieハイジャックの欠陥]] ([[名無しさん]]) [29] [CITE[おさかなラボ / Blog Archive / MixiとCookieドメイン]] ([[名無しさん]] [WEAK[2006-10-20 00:37:12 +00:00]]) [30] [CITE["週"記(2006-01-20)]] ([[名無しさん]] [WEAK[2006-10-20 00:43:18 +00:00]]) [31] [CITE@en[crisp's blog » Blog Archive » IE and 2-letter domain-names]] ([CODE[2007-02-14 19:27:55 +09:00]] 版) ([[名無しさん]] [WEAK[2007-02-14 10:32:06 +00:00]]) [32] [CITE@ja['''['''IE''']''' Internet Explorer が 2 文字のドメインに対して Cookie を設定しない]] ([CODE[2007-02-14 19:27:52 +09:00]] 版) ([[名無しさん]]) * Cookie auth-scheme [36] [CITE@en[Cookie-based HTTP Authentication]] ([TIME[2009-01-07 08:03:46 +09:00]] 版) * メモ [28] [[Opera]]の中の人の、[[Cookie]]の[[ドメイン]]同一性に関する判定についての[[I-D]] [CITE@en[Enhanced validation of domains for HTTP State Management Cookies using DNS]] [CITE@en[The TLD Subdomain Structure Protocol and its use for Cookie domain validation]] ([[名無しさん]] [WEAK[2006-03-30 12:43:29 +00:00]]) [33] [CITE@ja[スラッシュドット ジャパン | Googleがcookie有効期間を2年に短縮]] ([CODE[2007-07-22 15:20:11 +09:00]] 版) ([[名無しさん]]) [34] [CITE@en['''['''cs/0105018''']''' HTTP Cookies: Standards, Privacy, and Politics]] ([CODE[2005-09-17 23:32:47 +09:00]] 版) [[RFC]] の中の人の[[論文]]。 ([[名無しさん]]) [35] ほう、 [[Mosaic Netscape 0.9]] が [[Cookie]] を実装していたとはしらなんだ。 [37] [CITE@ja[クッキーの最大サイズ制限について]] ([TIME[2005-11-07 07:42:07 +09:00]] 版) [38] [CITE['''['''http-state''']''' Cookie storage limits (was Re: Updated draft)]] ([TIME[2009-08-18 04:10:26 +09:00]] 版) [39] [CITE@ja[Cookieセッション、BASIC認証マジパネー - p0t]] ([TIME[2010-01-05 20:39:49 +09:00]] 版) [40] [CITE@ja[ここギコ!: 携帯電話のCookie周りについて]] ([TIME[2010-03-17 00:04:26 +09:00]] 版) [59] [CITE[IRC logs: freenode / #whatwg / 20100928]] ( ([TIME[2010-10-10 15:38:22 +09:00]] 版)) [60] [CITE[lcamtuf's blog: HTTP cookies, or how not to design protocols]] ( ([TIME[2010-11-09 05:21:42 +09:00]] 版)) [61] [CITE[サードパーティCookieの歴史と現状 Part1 前提知識の共有 - 最速転職研究会]] ( ([TIME[2011-11-26 02:44:01 +09:00]] 版)) [62] [CITE[サードパーティCookieの歴史と現状 Part2 Webアプリケーションにおける利用とその問題 - 最速転職研究会]] ( ([TIME[2011-12-03 15:04:32 +09:00]] 版)) [63] [CITE[サードパーティCookieの歴史と現状 Part3 広告における利用、トラッキング、ターゲティング広告におけるプライバシーリスク - 最速転職研究会]] ( ([TIME[2011-12-03 15:04:24 +09:00]] 版)) [64] [CITE@en[Safari Trackers « Web Policy]] ( ([TIME[2012-02-18 18:55:52 +09:00]] 版)) [65] [CITE@ja[GoogleがSafariの設定を迂回してユーザーを追跡していたことが判明 - ITmedia ニュース]] ( ([TIME[2012-02-18 18:54:50 +09:00]] 版)) [66] [CITE@en[Safari Trackers « Web Policy]] ( ([TIME[2012-02-18 18:55:52 +09:00]] 版)) [67] [CITE@ja[GoogleがSafariの設定を迂回してユーザーを追跡していたことが判明 - ITmedia ニュース]] ( ([TIME[2012-02-18 18:54:50 +09:00]] 版)) [68] [CITE[HTTP::Cookies - search.cpan.org]] ( ([TIME[2012-03-04 00:36:16 +09:00]] 版)) [69] [CITE[CGI::Cookie - search.cpan.org]] ( ([TIME[2012-03-04 00:41:06 +09:00]] 版))