前回からのつづき

前回、 OPFS について、IndexedDB との比較を交え、基本的な使い方まで説明を行ってきました。今回は、その続きとして、OPFS に対する誤解や、セキュリティについてまとめていきたいと思います。


よくある勘違い( CORS との関係)

CORS(Cross-Origin Resource Sharing)は、「この Web API は、どのサイトからのアクセスを許可するか?」をサーバー側がブラウザに伝える仕組みです。詳細については、過去記事、「モダンJavaScript入門/fetch API(XHR からの進化)」を参照してください。

OPFS 自体はローカルストレージ機能であり、CORS の対象ではありません。

例えば、

const root = await navigator.storage.getDirectory();

のような操作では、CORS 設定は不要です。

ただし、外部サーバーからデータを取得する場合は通常どおり CORS 制約を受けます。

const response = await fetch("https://api.example.com/data.json");

この時点で CORS チェックが行われます。

取得したデータを OPFS へ保存すること自体には制限はありません。

つまり、

外部サーバー
 ↓
fetch
 ↓
CORSチェック
 ↓
OPFSへ保存

という流れになります。

👉 OPFS が CORS の対象なのではなく、データ取得時の通信が CORS の対象になります。


実践的な使い方

実際のアプリでは、IndexedDB や SQLite WASM と組み合わせて利用するケースが多くあります。

例えば画像管理アプリなら、

IndexedDB or SQLite WASM
 ├─ id
 ├─ fileName
 ├─ createdAt
 └─ tags

OPFS
 ├─ image001.jpg
 ├─ image002.jpg
 ├─ image003.jpg
 └─ app.db

のような構成になります。

検索やメタ情報管理は IndexedDB または SQLite WASM

実ファイルは OPFS

それぞれの得意分野を活かす構成です。

👉 この構成の利点は、OPFS に検索機能を付加することができることです。


OPFS のセキュリティ

OPFS はブラウザが提供するプライベートなファイルシステムですが、必ずしも万能なセキュリティ機能ではありません。

安全に利用するためには、OPFS の強みと弱みを理解しておくことが重要です。

【強い点】

■ 同一オリジン制約によって保護される

OPFS はブラウザの同一オリジンポリシー( Same-Origin Policy )によって保護されています。

例えば、

https://example.com

で保存されたデータは、

https://sample.com

https://sub.example.com

など、別オリジンの Web サイトからアクセスすることはできません。

これは Cookie や IndexedDB などと同様です。

そのため、別サイトから勝手に OPFS 内のデータを読み取られる心配はありません。

【弱い点(重要)】

■ JavaScript から自由にアクセスできる

OPFS は JavaScript から自由にアクセスできることが大きな特徴です。

しかし、これは同時にリスクでもあります。

Web アプリケーション上で実行される JavaScript は、通常の API を利用して OPFS 内のデータを読み書きできます。

つまり、

正規のアプリ
↓
OPFS へアクセス可能

悪意のある JavaScript
↓
OPFS へアクセス可能

ということです。

■ XSS があると全データを取得される

OPFS 最大のリスクは、XSS( Cross Site Scripting )です。

アプリケーションに XSS 脆弱性が存在すると、攻撃者が任意の JavaScriptを 実行できる可能性があります。

その結果、

  • OPFS 内のファイル一覧取得
  • ファイル内容の読み取り
  • データの外部送信
  • ファイルの削除や改ざん

などが行われる恐れがあります。

つまり、

XSS 成立
 ↓
悪意のある JavaScript 実行
 ↓
OPFS へアクセス
 ↓
データ漏洩

という流れです。

OPFS は外部サイトから保護されていますが、同一オリジン上で実行される JavaScript からは保護されません。

そのため、XSS 対策が最も重要なセキュリティ対策になります。


実務で必要なセキュリティ対策

■ HTTPS を使用する

OPFS はセキュアコンテキストでのみ利用できます。そのため、本番環境では HTTPS を使用することが前提となります。

通信経路の盗聴や改ざんを防ぐためにも、HTTPS は必須です。

■ CSP( Content Security Policy )を設定する

CSP( Content Security Policy )は、ブラウザに対して「どのスクリプトの実行を許可するか」を指示する仕組みです。

適切に設定することで、XSS 攻撃の成功率を大きく下げることができます。

例えば、JavaScriptファイルの読み込み元を同一オリジンに制限する

Content-Security-Policy:
  default-src 'self';
  script-src 'self';

のような設定が利用されます。

■ コードの XSS 対策を徹底する

最も重要なのは、アプリケーション自体に XSS 脆弱性を作らないことです。

例えば、

  • ユーザー入力を適切にエスケープする
  • innerHTML の使用を避ける
  • 信頼できない HTML を直接挿入しない
  • ライブラリやフレームワークの推奨方法を利用する

といった対策が必要です。

XSS 脆弱性が存在すると、 OPFS 内のデータがすべて取得・改ざんされる可能性があります。

そのため、実務では「 OPFS の保護」ではなく、「 JavaScript を安全に実行させること」が最も重要な対策となります。

■ 機密情報は、アプリケーション側で暗号化

OPFSはアクセス制御の仕組みであって、機密情報を自動的に暗号化してくれる仕組みではありません。そのため、機密情報を保存する場合は、アプリケーション側で暗号化を検討する必要があります。


まとめ

  • OPFS はブラウザ内のプライベートファイルシステム
  • 大容量データとの相性が良い
  • IndexedDB や SQLite WASM と組み合わせると実践的
  • 利用上の注意点
    • オリジンごとに独立して管理される。
    • HTTPS 環境が必要(localhostは例外)
    • ユーザーは直接アクセスできない。
    • ブラウザごとに容量制限がある。
    • Sync Access Handle 利用時は追加ヘッダーが必要な場合がある。
    • OPFS 自体は CORS の対象ではない。
    • OPFS には特別なセキュリティ上の制限や暗号化の仕組みはない。
    • OPFS は下記の対策を実施することで、初めて安全に利用できる。
      • 同一オリジン制約による保護
      • HTTPS
      • CSP
      • XSS対策

👉 OPFS は IndexedDB の代替ではなく、ファイル管理を得意とする補完的な技術です。