ブラウザーのストレージ制限と削除基準
クライアント側 (すなわちローカルディスク) に何らかのデータを保存するウェブ技術は何種類かがあります。ブラウザーがどれだけの容量をウェブデータストレージに割り当てるかや、容量の上限に達したときにどのデータを削除するかのプロセスは単純ではなく、またブラウザーにより異なります。この記事では、必要なローカルストレージの容量を確保するために、いつどのローカルコンテンツを破棄するのかをどうやって特定するのかを説明します。
メモ: 以下の情報はほとんどの最新ブラウザーでおおむね正確ですが、既知の詳細情報も記載しています。 Opera および Chrome は、すべての場合において同じ動作になるでしょう。 Opera Mini (Presto ベースで、サーバー側でレンダリングする) は、クライアントにデータを保存しません。
ブラウザーのデータストレージを使用する技術は何か?
Firefox では以下の技術が、必要なデータを保存するためにブラウザーのデータストレージを使用します。ここではそれらの技術を "クォータクライアント" と呼びます。
メモ: Firefox では、 Web Storage もすぐに同じストレージ管理ツールとして使えるようになり、それはこの文書で記述します。
メモ: プライベートブラウジングモードは、大半のデータストレージに対応していません。ローカルストレージのデータと Cookie は保存されますが、短命です。 — 最後のプライベートブラウジングウィンドウを閉じた時にデータは消去されます。
生成元の "最終アクセス日時" は、これらのいずれかによってアクティブ化/非アクティブ化される origin eviction によって、すべてのクォータクライアントでデータ削除が行われたときに更新されます。
Chrome/Opera では、 Quota Management API が AppCache, IndexedDB, WebSQL, File System API のクォータ管理を制御しています。
さまざまな種類のデータストレージ
同じブラウザー内で同じ保存方法を使用していても、解釈されるデータストレージの種類はさまざまです。この章では、さまざまなブラウザーで見つけられる多様なストレージについて説明します。
ストレージは 2 種類に分けられます。
- 永続的: 長期間にわたって保持されることを意図するデータです。これはユーザーが決断した場合にのみ削除されます (例えば Firefox では、各ページのページ情報ダイアログに "ストレージを消去" ボタンがあります)。
- 一時的: 長期間にわたって維持する必要がないデータです。ストレージの容量制限に達すると、もっとも過去に使用されたものから削除されます (LRU ポリシー)。
Firefox では、永続的なストレージが使用されると、ユーザーにはデータが永続的になることを警告するポップアップが表示され、それが良いかどうかを尋ねます。一時的データストレージは明示的にユーザーにプロンプトを表示しません。
既定では、一時的なストレージがほとんどの使用環境 (例えば、標準的な Web アプリ) で使用され、永続的なストレージはインストールされたアプリ (例えば、Firefox OS やデスクトップ版 Firefox にインストールした Firefox アプリ、および Chrome アプリ) で使用されます。
データの保存先は?
それぞれのストレージタイプが別々のリポジトリに相当しており、ユーザーの Firefox プロファイル内のディレクトリーとは以下のように対応づけられます (ほかのブラウザーでは、若干異なるでしょう):
<profile>/storage
— クォータマネージャ (後述) に管理されている、ストレージの主要なトップレベルディレクトリーです。<profile>/storage/permanent
— 永続的なデータストレージのリポジトリです。<profile>/storage/temporary
— 一時的なデータストレージのリポジトリです。<profile>/storage/default
— 既定のデータストレージのリポジトリです。
メモ: Storage API の導入後は、"permanent" フォルダーは廃止されると考えられます。"permanent" フォルダーは IndexedDB の永続的なタイプのデータベースのみ保存します。ボックスモードが "best-effort" や "persistent" であっても、データは <profile>/storage/default 以下に保存されます。
メモ: Firefox では URL バーに about:support
と入力して移動して、プロファイルフォルダー の隣にある フォルダーを開く ボタン (Mac OS X では Finder で開く) を押下すると、プロファイルのフォルダーを見つけることができます。
メモ: プロファイルフォルダーでデータを保存する場所を見ていると、第 4 のフォルダー persistent
が見つかるかもしれません。本来は更新や移行を単純化するため、少し前に persistent
フォルダーを permanent
フォルダーに改名しました。
メモ: ユーザーが <profile>/storage
の配下に、独自のディレクトリーやファイルを作成すべきではありません。このようなことを行うと、ストレージの初期化が失敗します。例えば、open()
でエラーイベントが発生します。
ストレージの制限
ブラウザーのストレージの最大容量は動的であり、ハードディスクドライブのサイズに応じて変わります。グローバルリミットはディスクの空き量量の 50% に決められます。Firefox では、クォータマネージャと飛ばれる内部のブラウザーツールが生成元ごとにどれだけディスク容量を使用しているかを絶えず注視しており、必要に応じてデータを削除します。
従ってハードディスクドライブが 500GB であれば、ブラウザーの合計ストレージサイズは 250GB になります。上限に達すると origin eviction と呼ばれる処理を実行して、ストレージの総量が再び上限を下回るまで、生成元全体に相当するデータを削除します。生成元内の一部分を削除するような縮小法はありません。生成元内のひとつのデータベースだけ削除すると、矛盾の問題が発生するおそれがあります。
また、グループリミットというもうひとつの制限もあります。これは、グローバルリミットの 20% として定義されます。それぞれの生成元は、グループ (生成元のグループ) の一部です。グループは、eTLD+1 ドメインごとに 1 つ作られます。例えば次の通り:
mozilla.org
— グループ 1、生成元 1www.mozilla.org
— グループ 1、生成元 2joe.blogs.mozilla.org
— グループ 1、生成元 3firefox.com
— グループ 2、生成元 4
このグループでは mozilla.org
、www.mozilla.org
、joe.blogs.mozilla.org
が、合わせてグローバルリミットの 20% を上限としてストレージを使用できます。firefox.com
は、別に 20% の上限を持ちます。
これら 2 種類の制限は、制限に達したときの動作が異なります:
- グループリミットは "ハードリミット" とも呼ばれます。 origin eviction を発生させません。
- グローバルリミットは、いくらかの領域が解放されて処理を継続できる可能性がありますので "ソフトリミット" です。
メモ: グループリミットは、上記で触れた最小のグループリミットにかかわらず、グローバルリミットより大きくすることはできません。グローバルリミットが 8MB といった本当に低メモリな状況では、グループリミットも 8MB となります。
メモ: グループリミットに達したとき、あるいは origin eviction で十分な空き容量を確保できないときは、ブラウザーで QuotaExceededError
が発生します。
メモ: Chrome では、ソフトおよびハードのストレージのクォータの限界が M66 から変更されました。詳しい情報はこちらにあります。
LRU ポリシー
使用可能なディスク領域がすべて埋まったときは、クォータマネージャーが LRU ポリシーに基づいてデータの削除処理を始めます。もっとも過去に使用された生成元のデータが始めに削除され、上限に達しなくなるなるまで削除を繰り返します。
一時的なストレージを使用して、生成元ごとに "最終アクセス日時" を記録しています。一時的なストレージがグローバルリミットに達する (後に上限をさらに超える) と、現在使用していない (すなわち、データストアを開き続けているタブやアプリがない) 生成元をすべて発見しようとします。これらは、"最終アクセス日時" によって整列されます。 origin eviction を発生させたリクエストを満たすのに十分な領域を確保するまで、もっとも過去に使用された生成元を削除し続けます。
関連情報
- Working with quota on mobile browsers, by Eiji Kitamura. モバイルブラウザーのクライアント側ストレージについて詳しく分析した記事。
- Quota Management API: Fast Facts, by Eiji Kitamura. Chrome/Blink (Opera も含まれるでしょう) の Quota Management API について見ていく記事。