Prompt
それぞれのlocalStorageなどのブラウザストレージの保存範囲は?(オリジンやディレクトリなど)
それはブラウザストレージの基本的なセキュリティと隔離に関わる、とても重要な質問だね!🚀
ブラウザストレージの保存範囲は、原則として同一オリジンポリシー (Same-Origin Policy, SOP) に基づいて決定されるよ。つまり、プロトコル、ドメイン名、ポート番号が完全に一致する、**「オリジン」**単位でデータが隔離・保存されるんだ。
ディレクトリ(パス)による違いは、基本的にないよ!
🔑 ブラウザストレージの保存範囲
| ストレージの種類 | 保存範囲の原則 | 備考 |
|---|---|---|
| LocalStorage | オリジン単位 (Origin) | 同一オリジン内なら、すべてのウィンドウやタブで共有される。ディレクトリやサブドメインによる分離はない。 |
| SessionStorage | オリジン + タブ/ウィンドウ単位 | 同一オリジンであっても、タブやウィンドウが異なればデータは共有されない。タブを閉じるとデータは消去される。 |
| IndexedDB | オリジン単位 (Origin) | 大容量データを格納するための構造化DB。LocalStorageと同様に、オリジンが同じであれば共有される。 |
| Cookies | オリジン + パス/サブドメイン単位 | 例外として、Path属性やDomain属性により、オリジン内の特定のパスや、サブドメイン間で共有範囲を制御できる。 |
🌐 1. オリジン(Origin)による隔離
LocalStorage, SessionStorage, IndexedDB の3つは、オリジンという厳格な単位で隔離されているよ。
オリジンの定義(3要素の一致)
オリジンとは、以下の3要素がすべて一致することだよ。
| 要素 | 例 |
|---|---|
| スキーム/プロトコル | http: vs https: |
| ホスト/ドメイン名 | www.example.com vs api.example.com |
| ポート番号 | example.com:80 vs example.com:8080 |
例えば、https://app.example.com のサイトで保存したデータは、http://app.example.com や https://www.example.com からは一切アクセスできないんだ。
ディレクトリ(パス)の影響
LocalStorageやIndexedDBは、URLのディレクトリ部分(例: /users/profile/)が異なっても、オリジンが同じであれば同じデータを共有するよ。
🍪 2. Cookieの例外的な仕組み
Cookieは古い技術であるため、セキュリティ面で柔軟すぎる、例外的なルールを持っているんだ。
A. パス (Path) による制限
Cookieは、設定時にPath属性を指定できるよ。
-
Path=/: オリジン全体でアクセス可能(デフォルト設定)。 -
Path=/api:https://example.com/api/以下のパスからのみアクセス可能。/profile/からはアクセスできない。
B. ドメイン (Domain) による共有
Cookieは、設定時にDomain属性を親ドメインに設定することで、サブドメインを跨いでデータを共有できる。
- Cookieを
.example.comで設定すると、app.example.comとblog.example.comの両方からそのCookieにアクセスできる。
このようにCookieは柔軟性があるけど、これが逆にセキュリティリスク(サブドメインの乗っ取りなど)につながることがあるため、現代のアプリケーションではより安全なLocalStorageやIndexedDBが推奨されることが多いんだ。😊