[IE] Cookieの保管場所

Cookieの扱いが昔といろいろ変わっていたのでまとめ。
Cookieの保管場所が何種類かになっていた。

IEのツールで見えるデフォルトの場所
C:\Users\Username\AppData\Local\Microsoft\Windows\Temporary Internet Files

low priorityのプログラムのクッキー
C:\Users\Username\AppData\Roaming\Microsoft\Windows\Cookies\Low

期限付きのもの
C:\Users\Username\AppData\Roaming\Microsoft\Windows\Cookies

Cookie についての一次情報をさがしていて行き当った以下のmsdn blogに書かれているInternet Explorer Cookie Internals (FAQ)は関係者によるポストなので、おそらく正確だろう。

http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx

このFAQを自分用に抄訳(いろいろ違うかも)。

Q1. IEのCookieはRFC2109RFC2965をサポートしてないみたいですが?
A. そのとおり。IE(IE8含む)はcookie用のRFCサポートをしていません。 WinINET (IEのネットワークスタック) はRFCになる前のNetscapeのdraft specを実装しました。 ということは、max-ageのようなディレクティブ、versioned cookie、などはIEのどのバージョンでも サポートしていません。

Q2. DOMAIN attributeで、先頭の . がなくても IEは気にしませんか?
A そのとおり。現在のバージョンのブラウザはどれも先頭の . をあるものと思って処理するようです。 テストケースはこちら

Q3. DOMAIN attributeを指定しないとサブドメインにもcookieを送信しますか?
A  そのとおり。example.comにセットされたcookieは sub1.sub2.example.comに送信されます。この点ではIEはほかのブラウザと異なります。テストケースはこちら

Q4. IEは各サイトごとにいくつのcookieを保持しますか?
A 2007/8の時点ではper-hostの上限は20から50に増加しました。IE5,6,7が対象です。  IE8は50個までサポートできますし、Firefoxも同じ上限。

Q5. hostname/domainが _ を含む場合にIEはcookieをセットしないのでは?
A そのとおり。_はDNSで許される文字ではないので、Windowsでは_を含むホスト名は設定できますが、問題があるという警告が出ます。問題を1つ上げると、WinINETはそういうホスト名にcookieをセットする、ということがあります。

Q6. IEは、ある種のドメイン名、たとえばhttp://xx.yyなどにはcookieをセットしないのですか?
A そのとおり。これは無関係なサイトが共有するトップレベルのドメインにはセットしない、という考えです。xx.yyという形式のccTLDは有効なトップレベルなので、そこにcookieをセットすべきではないということです。この方法論(原文heuristic)は完璧ではないが15年以上変わっておらず、すぐに変わることはないでしょう。この問題だけでblogの長いポストになるので、いつか書くかも。(書いたものはこちら)

Q7. 自分のサイトは別サイトのIFRAMEで運用するとcookieを受信しないのですが。

A IEには3rd party cookieの制限があります。3rd party cookieとは、ブラウザが表示しているトップレベルのコンテキストとは別のドメインのリソースに対してセットあるいは送信されたもの。IEのprivacy settingをAccept All cookiesに変えると、この問題の根本がP3P/Cookieの制限であることが簡単にわかります。

このcookieが確実に送信されるには、cookieをセットするときにP3Pヘッダを送る必要があります。

FiddlerのPrivacy Inspectorを使うとP3Pヘッダを表示・解析できます。IEのP3PサポートについてはMSDNこちら

Q7b. 自分のページがSECURITY=RESTRICTED attributeのあるIFRAMEで表示されているときにはcookieを受信・セットできません。

A. IFRAMEのSECURITY=RESTRICTED attributeは、ブラウザにこのコンテンツはRestricted Sites zoneから来ているものとして扱う指示になります。Cookieは送信されず、受信されてもセットされません。この問題を解決するには、必要な状態情報をほかの手段(URLのtokenなど)で伝達する必要があります。

Q8. HTML DOM document.cookieプロパティに何か制限はありますか?

A. IE5,6,7では、cookie 文字列が4096以上だと document.cookie プロパティは空文字列を返します。IE8では制限は10Kbまで増えています。

WinINETのInternetGetCookieの実装にあるわかりにくいバグのせいで、filenameを含むpath attributeと共に送信されたときは、IEのdocument.cookieはcookieを返しません。

たとえば、pageが自分自身にcookieをセットしたとき:

Set-Cookie: HTTPSet-PathCookie=PASS;path=/check.htm

cookieはHTTP requestで送信されるが、document.cookieコレクションには出てきません。

Q9. Cross-Site Scripting アタックでcookieが盗まれます。どうしたら。。

A. cookieをサイト上のscriptにアクセスを許すかどうか決めましょう。もし自分のサーバでだけcookieを使い、かつ、scriptがcookieにアクセスしなくてもいいなら、HttpOnly attributeを使ってcross-site scripting攻撃からcookieを守る助けにしましょう。

Set-CookieヘッダにHttpOnly attributeを付けると、ページで実行されるscriptからcookieが使えなくなります。HttpOnly attribute付きのcookieはHTTP requestで送信されているが、scriptがアクセスするdocument.cookieには出てこなくなります。ということは、cross-site scriptingのホールを見つけたハッカーがいたとしても簡単にはlog-onしているサイト訪問者のcookieを盗めないのです。

HttpOnly attributeは(IE6以降、FF3以降、Safari4, Chrome, Opera 9.5以降)などの現在のすべてのブラウザでサポートされています。

Q10. アプリケーションやnative codeのadd-onはどうやってcookieをセットできますか?

A. アプリケーションはInternetSetCookieExを使ってcookieをセットするべきです。3rd partyのコンテキストでセットされているならそのことを示すフラグと利用できるP3Pディレクティブがあればそれも関数に渡します。Exなしのバージョンは無条件にcookieをセットします。IEの設定で”Block all cookies”がセットされていてもです。その場合のcookieは”Block all cookies”がセットされていればサーバには送信されません。

注意:Windows Vista以降では、IEはインターネットのコンテンツではProtected modeで(独立したcookie ストアを持つsandboxで) 実行されるようになりました。Medium integrity(IEから見て外部)からProtected Mode sandboxにcookieをセットするには、IESetProtectedModeCookieをつかわなければなりません。このAPIはIE8から追加され、IE7では不幸なことに素直な代替手段がありません。APIにはいくつかの制限があります。特に、High integrity(Admin)で走るプロセスからは呼べません。また、cookieをセットするときにはP3P policyをセットするオプションはありません。

Q11. アプリケーションはnative codeのadd-onはどうやってcookieを読めますか。

A . InternetGetCookieExを使ってください。

注意:デフォルトでは、この関数が返すcookieにはHTTPOnly cookieは含まれません。HTTPOnly cookieを取り出すには IE8以降で使えるINTERNET_COOKIE_HTTPONLYフラグを渡す必要があります。このフラグを渡すには、返値をscriptにコントロール可能なコンテキストに見せないようにしておかなければなりません。(IE7の累積updateでINTERNET_COOKIE_HTTPONLYのサポートが付いたようです)

注意:

注意:Windows Vista以降では、IEはインターネットのコンテンツではProtected modeで(独立したcookie ストアを持つsandboxで) 実行されるようになりました。Medium integrity(IEから見て外部)からProtected Mode sandboxのcookieを取り出すには、IEGetProtectedModeCookieをつかわなければなりません。このAPIはIE8から追加され、IE7では不幸なことに素直な代替手段がありません。APIにはいくつかの制限があります。特に、High integrity(Admin)で走るプロセスからは呼べません。また、cookieをセットするときにはP3P policyをセットするオプションはありません。

Q12. ウェブアプリケーションに複数回log in するには?IE ウィンドウ間でcookieを共有できますか?

A 良い質問です。IE8では答えが少し変わりました。丸丸これについてのポストをIEBlogに書きました。

Q13. cookieをコントロール(ブロック、ダウングレード、許可)するにはどうすれば?

A. Internet Explorer Cookie Controlを見てください。

広告

コメントを残す

コメントを投稿するには、以下のいずれかでログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。