Web StorageやindexedDBを扱う上でのセキュリティ上の注意点(続編)

先日書いた「Web StorageやindexedDBを扱う上でのセキュリティ上の注意点」の続き。

sessionStorage を使うと解決するか

この用途なら sessionStorage でよい (はてなブックマーク - ssig33 - 2013年3月9日)
sessionStorageはウィンドウあるいはタブが開かれてから閉じるまでの間をひとつのセッションとして管理し、そのセッションの期間中だけデータを保持します。ウィンドウやタブを閉じる際にはセッションは終了し、ストレージ上のデータは破棄されます。通常のWebアプリケーションでは、ログイン/ログアウト間というアプリケーション側が想定しているセッションと、sessionStorageのいうところのセッションとは異なる概念であり、ウィンドウを閉じる前に異なるユーザでログイン/ログアウトを繰り返した場合には同種の問題が発生する可能性がありますので、根本的な解決にはなりません。

機密情報の取り扱い



同じデバイス上のブラウザを複数のユーザで共有して使用する場合、Web StorageやindexedDBに限らず、閲覧履歴や通常のキャッシュ、Cookieなど様々なリソースにそれらの複数ユーザがアクセス可能なことがありますが、Webアプリケーション側でどこまでそういった状況に対処するのかは様々な考え方があるように思います。例えば、そういう状況に関してはOS/ブラウザのユーザ管理機構や最近であればブラウザのプライベートブラウジング機能、あるいはユーザ自身の手によるプライベート情報の削除に期待することでWebアプリケーション側では複数ユーザがブラウザを共有するという状況に対応しないという考え方もあるでしょうし、機密情報を含むあらゆるコンテンツのキャッシュの禁止はもちろん、location.hashにも機密情報となりえる情報を含まないことを徹底することで、複数ユーザがブラウザを共有した場合でもリスクを最小限にするという考え方もあると思います。後者のような考え方であれば、もちろんWeb Storage、indexedDBにも機密情報を含めるべきではないということになると思います。(通常、そもそもあまりこういう条件については考慮しないと思います。)
では、機密情報さえ保存しなければ前回書いた記事のようなWeb StorageやinedxedDBにおけるセキュリティ上の問題は全て解決するのかというと、そうでもないように思います。あまり適切な例ではありませんが、例えば「このデバイスからは常に位置情報を送信する」のような設定値をlocalStorageに保存している場合、そのユーザの公開プロフィール画面や公開されている発言などを見ると外部からもどちらに設定しているかが推測可能であって(ようするに機密情報ではない)、とはいえそのような設定値をログアウト/ログインをまたぐことで複数ユーザ間で混同して使用されてしまった場合には大きな問題となり得ます。そうなってくると、結局のところ、「機密情報を保存してはいけない」ではなく「ユーザに紐づいたデータを保存してはいけない」になってしまうように思います。
現在、Web StorageやindexedDBの恩恵を最大限に受けている種類のソフトウェアのひとつとして、GreaseMonkeyやブラウザ拡張のようなサーバサイドの協力を得ずにクライアント上の処理だけで特定の問題を解決する類のソフトウェアがあるのではないかと思っています。このような種類のソフトウェアに対して、ユーザに紐づくデータをクライアントサイドのストレージに保存してはいけないという制約を課してしまうと、圧倒的に作成可能な幅が狭まるのではないかという気もしないでもないです。
「クライアントサイドのストレージに機密情報を保存してはいけない」という言葉が、そもそも保存すること自体が脆弱であるということなのか、あるいはセキュアに実装するための手段が存在しないから手法そのものを禁じ手としてしまうということなのか、それとも、脆弱性を引き起こしやすいのでしないほうがいいというレベルなのか、徳丸さんの言われていることについて真意がもう少し知りたいなと思いました。