Cookie、Local Storage 與 IndexedDB:工作階段到底是什麼

登入會寫入三個不同的地方。了解它們各是什麼,就能明白為什麼工作階段能熬過某些情況、卻在另一些情況下失效,以及為什麼同步設定檔必須搬移這三者。
"已登入"感覺像是一件事。實際上它至少是三件事,存在三個不同的地方,各有不同的生命週期,而這些差異可以解釋人們在機器之間搬移工作階段時遇到的大部分令人困惑的行為。
Cookie
小型的鍵值對,會隨每個送往設定它的網站的請求自動送出。工作階段權杖通常就存放在這裡。
- 範圍限定於網域和路徑,並有到期日。
- `Secure` Cookie 只會透過 HTTPS 送出;`HttpOnly` Cookie 則是頁面 JavaScript 看不到的。
- 工作階段 Cookie 沒有到期日,設計上在瀏覽器關閉時就會消失。
Cookie 是三者中最小的,也是最關鍵的。失去它們,你就會被登出。
Local Storage 與 Session Storage
字串形式的鍵值儲存空間,由頁面 JavaScript 讀寫,範圍限定於各個來源。它絕不會隨請求送出,頁面必須主動去讀取。
應用程式會把偏好設定、快取的個人資料、功能旗標,以及經常還有重新整理權杖存放在這裡。Local Storage 會持續保存到被清除為止;Session Storage 只會持續到分頁關閉。
IndexedDB
瀏覽器裡一個真正的資料庫:有結構化的紀錄、索引和交易。現代網路應用程式的所有重要資料都放在這裡:快取的訊息記錄、離線佇列,以及端對端加密功能的加密金鑰。
為什麼這對設定檔很重要
這讓「隔離」有了明確的定義。當這三者都是分開的,再加上快取和擴充功能的狀態,兩個設定檔才算是隔離的。只隔離 Cookie 卻共用 IndexedDB 的工具,只解決了問題中容易的三分之一。
這也為在機器之間移動設定檔設下了門檻。只帶著 Cookie 走,只能重現工作階段的外形,卻沒有它的實質。
| 儲存空間 | 由誰寫入 | 通常存放 |
|---|---|---|
| Cookie | 伺服器與頁面指令碼 | 工作階段權杖、偏好設定、追蹤識別碼 |
| Local Storage | 頁面指令碼 | 重新整理權杖、介面狀態、快取的個人資料 |
| Session Storage | 頁面指令碼 | 每個分頁的狀態,分頁關閉時即丟棄 |
| IndexedDB | 頁面指令碼 | 快取資料、離線佇列、加密金鑰 |
在你自己的機器之間移動工作階段
PowerOps 會在設定檔關閉時擷取 Cookie、Local Storage 和 IndexedDB,並在它於其他地方開啟時還原。每個類別都是一個開關,可針對整個工作區或單一設定檔設定,因此你可以只搬移你打算搬移的部分。
關於這套機制,有兩點值得知道:
- 快照在來源機器上以屬於工作區的金鑰加密,並在開啟設定檔的機器上解密。這不是端對端加密:服務端會保留該金鑰的副本,好讓你的其他電腦能夠接收。
- 同一時間,一個設定檔只會在一台機器上開啟。它開啟期間持有一份租約,其他裝置會被告知是哪一台裝置持有它,而不是被允許把工作階段分岔成兩份各自發展的副本。
第二點是刻意設下的限制。兩台機器各自獨立編輯同一個工作階段,會產生兩個各只有一半有效的工作階段,而且往往讓兩邊的帳號都被登出。Cookie 存放區沒有辦法解決合併衝突。
實務上的重點
請正常關閉設定檔,而不是強制終止。關閉時的寫出動作,才讓工作階段得以搬移,這是這份清單上成本最低的習慣。

