ブラウザの保存先 7 種 — 読まれる・入る・消える
5 分で読む
ブラウザの保存先は、localStorage・sessionStorage・Cookie・IndexedDB・Cache Storage・オリジンプライベートファイルシステム(OPFS)の 6 種と、拡張機能だけが使う chrome.storage の 7 種です。「どれが安全か」は、何から守りたいのかで答えが変わります。IT連携マップ編集部は、Chrome 156・Edge 156・Safari 26.6.2 で同じ試験を各 3 回行い、3 回とも同じだった結果を 4 つの軸で比べました。XSS(クロスサイトスクリプティング)は、攻撃者が用意したスクリプトが、利用者が開いているページの中で動いてしまう弱点です。
結論は、保存先を変えても XSS は防げなかった、です。localStorage から IndexedDB に移しても、暗号化して置いても、同じページで動くスクリプトは読めました。守りになるのは、保存先の選び方より、攻撃者のスクリプトをページの中で動かさせないことでした。
7 種類の保存先は、何が違うのか?
| 保存先 | 使われ方 | 入る量 | 閉じたあと |
|---|---|---|---|
| localStorage | 同じオリジンのページが文字列を保存する | 約 520 万文字 | 残る |
| sessionStorage | タブごとの文字列 | 約 520 万文字 | 消える |
| Cookie | サーバーへ自動で送られる。ログインの印に使われる | 1 つで約 4 KB | 期限まで残る |
| IndexedDB | 大量のデータを構造のまま保存する | 10 GiB | 残る |
| Cache Storage | 通信の応答を保存する | 10 GiB | 残る |
| OPFS | ページ専用のファイル置き場 | 10 GiB | 残る |
| chrome.storage | 拡張機能だけが使う(local・sync・session) | local 10 MiB | session は消える |
入る量は Chrome・Edge での測定値です。では、XSS でスクリプトを動かされると、何が読まれたのでしょうか。
XSS では、何が読まれたのか?
- 6 種は全部読めた: localStorage・sessionStorage・通常の Cookie・IndexedDB・Cache Storage・OPFS は、スクリプト 1 本で読めました。
- 暗号化しても読めた: 取り出せない設定の鍵(extractable: false)で暗号化しても、スクリプトはページと同じ呼び出しで復号できました。
- HttpOnly は値を守ったが、使われた: HttpOnly の Cookie は読めませんでしたが、fetch で、その Cookie を付けた要求を送れました。
MDN(Set-Cookie header)原文
a cookie that has been created with HttpOnly will still be sent with JavaScript-initiated requests
出典を開く確認 2026-11-02
- chrome.storage は呼べなかった: ページのスクリプトには、拡張機能の API が渡されないためです。
スクリプトはページと同じ権限で動くので、ページが使える手段は何でも使えます。では、呼べなかった chrome.storage は、ほかの誰から読めるのでしょうか。
拡張機能の chrome.storage は、誰から読めるのか?
同じ拡張機能のコンテンツ スクリプトは、local と sync を読めました。公式文書も、既定で公開されると説明しています。 出典を開く確認 2026-11-02 出典を開く確認 2026-11-02Chrome for Developers(chrome.storage)原文
By default, it’s exposed to content scripts, but this behavior can be changed by calling browser.storage.local.setAccessLevel()
Chrome for Developers(chrome.storage)原文
By default, it’s not exposed to content scripts, but this behavior can be changed by calling browser.storage.session.setAccessLevel()
setAccessLevel で公開した後は読めました。別の拡張機能は、ページの localStorage は読めましたが、標的の拡張機能の保存先には届きませんでした。詳しくは拡張機能の保存先です。では、どれだけ入るのでしょうか。
どれだけ入るのか?
localStorage と sessionStorage は、公式の説明と同じ約 5 MiB でした。 出典を開く確認 2026-11-02 出典を開く確認 2026-11-02 出典を開く確認 2026-11-02MDN(Storage quotas and eviction criteria)原文
Browsers can store up to 5 MiB of local storage, and 5 MiB of session storage per origin.
web.dev(Storage for the web)原文
An origin can use up to 60% of the total disk space.
unlimitedStorage の権限があると 128 MiB まで書けました。Chrome for Developers(chrome.storage)原文
The storage limit is 10 MB (5 MB in Chrome 113 and earlier), but can be increased by requesting the "unlimitedStorage" permission.
どんなときに消えるのか?
| 消える場面 | 公式の説明 | 測定 |
|---|---|---|
| 空き容量が足りない | 最近使っていないオリジンから消せる web.dev(Storage for the web)原文Chromium-based browsers will begin to evict data when the browser runs out of space, clearing all site data from the least recently used origin first, then the next, until the browser is no longer over the limit.出典を開く確認 2026-11-02 |
測っていない |
| Safari で 7 日間操作しない | スクリプトが書いた保存先が消える WebKit(ブログ)原文deleting all of a website’s script-writable storage after seven days of Safari use without user interaction on the site出典を開く確認 2026-11-02 |
測っていない |
| 閲覧データの削除 | 範囲による | 上の図 |
| persist()(永続を求める) | 利用の履歴で自動に許可か拒否 MDN(Storage quotas and eviction criteria)原文Safari and most Chromium-based browsers, such as Chrome or Edge, automatically approve or deny the request based on the user's history of interaction with the site and do not show any prompts to the user.出典を開く確認 2026-11-02 |
新しいプロファイルは拒否 |
閲覧データの削除(拡張機能の API で実行)では、ページ側の 6 種が消え、chrome.storage は、どの操作でも消えませんでした。対策はデータが消えるときにあります。では、ディスクの上ではどんな形なのでしょうか。
ディスクの上では、どんな形で残るのか?
| 保存先 | ブラウザを閉じたあとのファイル(Chrome・Edge) |
|---|---|
| localStorage・sessionStorage・IndexedDB・Cache Storage・OPFS | 書いた文字列がそのまま見つかった |
| chrome.storage の local・sync | 書いた文字列がそのまま見つかった |
| chrome.storage の session | 見つからない(メモリの中だけ)Chrome for Developers(chrome.storage)原文Items in the session storage area are stored in-memory and will not be persisted to disk.出典を開く確認 2026-11-02 |
| Cookie(通常・HttpOnly) | 暗号化した列に入っていた |
| 取り出せない設定の鍵 | 生のバイトが IndexedDB のファイルに見つかった |
ファイルを読めるのは、その PC のファイルを読める人やソフトウェアです。XSS とは別の脅威で、守る手段も別です。では、何をどこに置けばよいのでしょうか。
結局、何をどこに置けばよいのか?
理由はどのデータをどこに置くかにあります。
| 置くもの | 向く保存先 | 注意すること |
|---|---|---|
| ログインの印 | Cookie(HttpOnly を付ける) | 使われることは防げない。XSS を防ぐ対策が先 |
| なくなっても困らない一時データ | localStorage | 日本語は Safari で半分 |
| 大きなデータ | IndexedDB・OPFS | XSS では読まれる。閲覧データの削除で消える |
| 拡張機能の内部の状態 | chrome.storage | ディスクの上では平文(session 以外) |
ここから先は調査の詳細です(約 3 分)。上のカードだけで決められます。調べた 1 件ずつの記録は IT連携マップ に、出典 URL と調査日つきで公開しています。
調査の詳細
IT連携マップ編集部は、2026 年 11 月 2 日に、次の 3 つのブラウザで、同じ試験を各 3 回行いました。3 回とも同じだった結果だけを載せています。
| ブラウザ | OS | 機械のディスク |
|---|---|---|
| Chrome 156 | macOS | 総量 460.4 GiB・空き 10 GiB |
| Edge 156 | Windows 10 Pro | 総量 110.7 GiB・空き 約 15 GiB |
| Safari 26.6.2 | macOS | 総量 460.4 GiB・空き 9.8 GiB |
Edge は Windows 10 の機械で、Safari は拡張機能と、ディスクの上の検索を測っていません。
オリジンは、https://example.com のように、スキーム・ホスト・ポート番号の組です。localStorage から OPFS までの 6 種は、オリジンごとに分かれます。
試験の作り
実験用のページが、入力した文字をそのまま HTML に出力する弱点を持ち、別のオリジンから攻撃側のスクリプトを読み込みます。攻撃側のスクリプトは、7 種の保存先に、各回で違う目印の文字列を読みに行き、結果を別のサーバーへ送ります。拡張機能は、unlimitedStorage の有無で 2 つ、別の拡張機能(ホスト権限あり)で 1 つを読み込み、読めたかどうかを、自分の manifest を取得できる対照つきで確かめました。ディスクの上は、ブラウザを正常に閉じたあと、プロファイルのファイルから、目印の文字列と鍵の生のバイトを検索しました。正の対照(履歴の URL・localStorage・IndexedDB の目印が見つかること)が通った回だけ使っています。
公式の説明と合わなかったこと
- ページの上限: 公式の説明は、1 つのオリジンがディスクの 60% まで、Chrome は常に 60% を返す
web.dev(Storage for the web)原文
An origin can use up to 60% of the total disk space.
出典を開く確認 2026-11-02
です。測定では、Chrome と Edge が 10 GiB、Safari が 76.8 GiB でした。普段使いの Chrome でも 10 GiB で、ディスクの空きを約 2 GiB 減らしても変わりませんでした。理由は分かっていません。web.dev(Storage for the web)原文
Chrome does not, and will always report 60% of the actual disk size.
出典を開く確認 2026-11-02
- persist(): 新しいプロファイルの Chrome 156・Edge 156・Safari 26.6.2 では、通知を許可した後も拒否でした。普段使いの Chrome 155 では 3/3 で許可でした。履歴の違いか版の違いかは、切り分けていません。
公式文書が言っていること
- Safari の 7 日: Safari を使っても、そのサイトを 7 日間操作しないと、スクリプトが書いた保存先が消えます。ホーム画面に追加した Web アプリは Safari とは別に使った日数を数え、データを消す意図はないと WebKit は書いています。
WebKit(ブログ)原文
deleting all of a website’s script-writable storage after seven days of Safari use without user interaction on the site
出典を開く確認 2026-11-02
WebKit(ブログ)原文
Web applications added to the home screen are not part of Safari and thus have their own counter of days of use.
出典を開く確認 2026-11-02
- 機密性の高いデータ(拡張機能): 公式文書は、機密性の高いデータには storage.session を使うよう勧めています。この測定では、session は既定でコンテンツ スクリプトから読めず、ディスクにも書かれませんでした。
Chrome for Developers(chrome.storage)原文
If you’re working with sensitive user data, instead use storage.session
出典を開く確認 2026-11-02
測っていないこと
Firefox・スマートフォンのブラウザ・Windows の Chrome・設定画面からの手動の削除・Safari の 7 日の規則とディスクが逼迫したときの自動の削除・Content Security Policy などの XSS の対策側は、測っていません。