HTML5のストレージ技術とプライベートブラウジング
Web SQL Database、Local Storage、Session Storage(いずれもWeb Storageで規定)のそれぞれのストレージ技術が各ブラウザのプライベートブラウジングモードで使えるかを試してみた。
プライベートブラウジング
プライベートブラウジング機能はWebの閲覧記録を一切残さない機能であり、各種ブラウザで実装されている。
- Internet Explorer: プライベートブラウジング(InPrivateモード)。8.0から実装。
- Firefox: プライベートブラウジング。3.5から実装。
- Opera: プライベートブラウジング。10.50から実装。
- Safari: プライベートブラウジング。2.0から実装。
- Google Chrome: シークレットモード(Incognito Mode)。1.0から実装。
同じプライベートブラウジングとは言っても、実際の動作は大きく分類して2種類になるようだ。
1つが通常モードでのブラウザはそのまま起動された状態で、プライベートモードが起動されるパターンだ。Internet Explorer、Opera、Google Chromeがこれに分類される。通常モードで起動されている各ブラウザの中からプライベートブラウジングを起動すると、別ウィンドウが開き*1、その中の操作では一切の記録が残らない。既存の通常モードのブラウザウィンドウはプライベートモードとは独立であるため、プライベートモードを終了しなくても、通常モードで起動されているブラウザウィンドウで通常の履歴の残る操作を行うことも出来る。
もう1つがモードを切り替えるパターンだ。FirefoxとSafariがこの方式だ。通常モードで起動されている各ブラウザの中からプライベートブラウジングの開始を行うと、現在の状態を一度保存し、プライベートモードへと移行する。通常モードでのブラウザウィンドウがそのままプライベートモードのブラウザに移行することになるので、通常モードとプライベートモードを共存させることは出来ない。プライベートモードが終了すると、通常モードに復帰する。
プライベートブラウジングでのHTML5ストレージの振る舞い
このプライベートブラウジング中にどのようにHTML5のストレージ技術が振舞うかを調査してみた。
Web SQL DatabaseはWebKit系ブラウザ(SafariやGoogle Chromeなど)とOperaで実装されており、local StorageとSession Storageはすべてのブラウザで実装されている。
それぞれの動作をまとめると、以下のようになる。
- Web SQL Databaseはサポートしているブラウザであっても、プライベートモードでは動作しない。
- Local StorageはSafariは何故か動作せず、ほかのブラウザはブラウザを閉じるとLocal Storage内に保存されていたデータが削除される。すなわち、セッションをまたがってデータを保持するというLocal Storageの機能が動作しない。
- Session StorageはSafariではLocal Storageと同じく何故か動作しないが、そのほかのブラウザでは動作する。Session Storageであるので、セッションをまたがって、すなわちブラウザを再起動させた後にはデータは引き継がれない。
表にすると次のようになる。
Web SQL Database | Local Storage | Session Storage | |
---|---|---|---|
Internet Explorer | N/A(ブラウザとしてWeb SQL Databaseをサポートしていない) | ブラウザ再起動すると値がリセットする | 動作する |
Firefox | N/A(ブラウザとしてWeb SQL Databaseをサポートしていない) | ブラウザ再起動すると値がリセットする | 動作する |
Opera | 動作しない | ブラウザ再起動すると値がリセットする | 動作する |
Safari | 動作しない | 動作しない | 動作しない |
Google Chrome | 動作しない | ブラウザ再起動すると値がリセットする | 動作する |
プライベートブラウジングの目的が履歴を残さないということなので、この結果は正しい*2。
Webアプリケーション側での対応
プライベートブラウジングにおいてストレージ技術が機能しないのがプライベートブラウジングの目的にあっているとはいえ、そのままではWebアプリケーションでストレージ技術を使っている場合、ユーザーがプライベートブラウジングモードでアクセスしてきた際に適切に動作しないことになる。プライベートブラウジングの場合にはストレージ技術を使わないようにしたり、ユーザーに警告を出すようにする方が親切だ。
ただ、プライベートブラウジングかどうかはユーザーエージェントなどで簡単に分かるようにはなっていない。プライバシーを最大限に尊重して欲しいというモードにしているので、不必要な情報はWebサーバー/アプリケーション側には渡さない。
1つ比較的簡単に利用出来るのが、Stanford Web Security Research/Detecting Incognitoで紹介されている方法だ。これは、あるユニークなURLにアクセスし、CSSの:visitedセレクタを確認することにより、ブラウザがプライベートブラウジングモードかどうかを判定する方法だ。:visitedセレクタが変更されていなかったら、プライベートブラウジング中だと判断出来る。
ただし、この方法がいつまで有効かわからない。CSS :visitedセレクタはウェブの閲覧履歴を取得することが出来る*3ため、プライバシー強化にむけてこの振る舞いを変えようという動きがある(例: modest / Mozilla Hacks (hacks.mozilla.org) / CSS の :visited に行われるプライバシー対策、Safari Realized/Safari 5 で :visited の挙動が変更に)。行動ターゲッティング広告などに利用されているため、その是非をめぐって議論が続いていたものだ。FirefoxとWebKit系ブラウザでは早晩この方法は使えなくなる。
したがって、現在では将来に渡って確実にプライベートブラウジング中かどうかを判別する方法は無さそうだ。もしご存知の方がいたら教えて欲しい。