← HTTP / Browser Protocols

WEB PROTOCOLS · 88

Cookie / Session / localStorage / sessionStorage:狀態到底放哪裡

HTTP 本身不會自動記住「這是同一個 user」。網站需要額外 state mechanism。Cookie、server session、localStorage、sessionStorage 都能保存資訊,但 storage location、傳輸方式、lifetime、security property 完全不同。

Learning outcomes

1. Cookie 是 Browser 儲存的小型 name/value state

Set-Cookie:
  session_id=abc123;
  HttpOnly;
  Secure;
  SameSite=Lax

符合 domain/path/policy 的 cookie 可能隨後續 HTTP request 自動帶上。

2. Session 常代表 server-side state

Browser cookie:
  session_id=abc123

Server store:
  abc123 → {
    userId: 42,
    expiresAt: ...
  }

Cookie 只存 session identifier;真正 session data 可以在 server/database/cache。

3. localStorage

localStorage.setItem(
  "theme",
  "dark"
);

同 origin 可持久保存,JavaScript 可讀。這意味著 XSS 風險下,不應把它當高敏感 secret vault。

4. sessionStorage

sessionStorage.setItem(
  "draft",
  "..."
);

通常綁定單一 tab/session lifecycle;和 cookie/server session 不是同一概念。

5. Storage 選擇依資料責任

資料較合理位置
theme preferencelocalStorage 可考慮
server login sessioncookie + server/session mechanism
temporary form draftsession/local storage 視需求
database admin secret不可放 Browser

Project checkpoint:Request Map v3

設計 Course Workspace 的 theme、draft、login identity 分別放哪,並寫出理由。

theme
  → client preference

draft
  → tab/client state

auth session
  → verified server context

Debug evidence:登入後刷新就登出

檢查 session state 存哪裡、cookie 是否真的 Set-Cookie 成功、Domain/Path/SameSite/Secure 是否符合、server session 是否仍存在。

Knowledge check

  1. Cookie 與 server session 是否同一個東西?
  2. HttpOnly 主要限制誰讀 cookie?
  3. localStorage 是否會自動隨每個 HTTP request 傳送?
  4. 替四種 app state 選 storage 並說明 trade-off。