Cookie、Local Storage、IndexedDB:セッションの正体

サインインすると、3つの別々の場所に書き込まれます。どれがどれかを知ると、セッションがある操作では残り、別の操作では壊れる理由と、プロファイルの同期が3つすべてを移す必要がある理由が分かります。
「ログインしている」状態は1つのことのように感じられます。実際には少なくとも3つで、3つの異なる場所に、3つの異なる寿命で保存されており、その違いが、セッションをマシン間で移すときに人々が出くわす混乱した挙動の大部分を説明します。
Cookie
小さなキーと値のペアで、それを設定したサイトへのすべてのリクエストとともに自動的に送信されます。セッショントークンは通常ここにあります。
- ドメインとパスにスコープされ、有効期限があります。
- `Secure`のCookieはHTTPSでのみ送信され、`HttpOnly`のCookieはページのJavaScriptからは見えません。
- セッションCookieには有効期限がなく、ブラウザを閉じると消えることを意図しています。
Cookieは3つの中で最も小さく、最も重要な役割を担っています。失えば、サインアウトされます。
Local StorageとSession Storage
文字列のキーと値のストレージで、ページのJavaScriptが読み書きし、オリジンごとにスコープされます。リクエストとともに送信されることはなく、ページが意図的に読み取る必要があります。
アプリケーションは、設定、キャッシュしたプロフィールの詳細、機能フラグ、そしてしばしばリフレッシュトークンをここに保存します。Local Storageは消去されるまで残り、Session Storageはタブが開いている間だけ続きます。
IndexedDB
ブラウザ内の本格的なデータベースで、構造化されたレコード、インデックス、トランザクションを備えます。最新のウェブアプリケーションが、キャッシュしたメッセージ履歴、オフラインキュー、エンドツーエンド暗号化機能の暗号鍵など、規模のあるものをすべて保管する場所です。
プロファイルにとってなぜ重要か
これは「分離」に正確な意味を与えます。2つのプロファイルが分離されているとは、これら3つがすべて別々で、さらにキャッシュと拡張機能の状態も別々であるということです。Cookieだけを分離してIndexedDBを共有するツールは、問題の簡単な3分の1しか分離していません。
また、プロファイルをマシン間で移す際の基準にもなります。Cookieだけを運んでも、セッションの形を再現するだけで、中身は再現されません。
| ストア | 書き込む主体 | 主に保持するもの |
|---|---|---|
| Cookie | サーバーとページのスクリプト | セッショントークン、設定、トラッキング用識別子 |
| Local Storage | ページのスクリプト | リフレッシュトークン、UIの状態、キャッシュしたプロフィールの詳細 |
| Session Storage | ページのスクリプト | タブごとの状態、タブを閉じると破棄される |
| IndexedDB | ページのスクリプト | キャッシュデータ、オフラインキュー、暗号鍵 |
自分のマシン間でセッションを移す
PowerOpsは、プロファイルを閉じるときにCookie、Local Storage、IndexedDBを取得し、別の場所で開くときに復元します。各カテゴリはワークスペース全体、または個別のプロファイルに対するスイッチになっているので、移したい分だけを正確に移せます。
この仕組みについて知っておく価値のある性質が2つあります。
- スナップショットは、元のマシン上でワークスペースに属する鍵によって暗号化され、プロファイルを開くマシンで復号されます。これはエンドツーエンド暗号化ではありません。他のコンピュータが受け取れるように、サービスがその鍵のコピーを保持しています。
- プロファイルは、同時に1台のマシンでしか開かれません。開いている間はリースを保持し、他のデバイスには、セッションが2つの食い違うコピーに分岐するのを許す代わりに、どのデバイスが保持しているかが通知されます。
2点目は意図的な制限です。2台のマシンが1つのセッションを独立して編集すると、半分だけ有効なセッションが2つできて、しばしば両方でアカウントがサインアウトされます。Cookieの保管場所には、マージの競合を解決する手段がありません。
実践上のポイント
プロファイルは強制終了せず、閉じてください。閉じるときの書き出しがセッションを持ち運べるものにしており、このリストの中で最も手間のかからない習慣です。

