Mục lục

Storage & State: Cookie vs LocalStorage vs Session

Phân biệt 5 loại bộ nhớ trình duyệt. Khi nào dùng cái nào để lưu Token? Bảo mật dữ liệu người dùng.

Lập trình viên thường bối rối giữa hàng tá lựa chọn lưu trữ dưới Client. Chọn sai có thể dẫn đến lỗ hổng bảo mật (XSS Token Theft).

1. Bảng so sánh nhanh

LoạiDung lượngThời hạnGửi lên Server?Truy cập bằng JS?Mục đích
LocalStorage5MB-10MBVĩnh viễn (đến khi xóa)KhôngCó (Rủi ro XSS)Config, Theme, Draft
SessionStorage5MBĐóng Tab là mấtKhôngForm data tạm thời
Cookie4KBTùy chỉnh (Expires)Có (Mỗi request)Có (Trừ khi HttpOnly)Auth Token, Tracking
IndexedDB> 250MBVĩnh viễnKhôngCó (Async)Dữ liệu lớn, Offline

2. Cookies: Cũ nhưng Quyền lực

Cookie không chỉ là nơi lưu trữ, nó là cơ chế duy nhất để Server "đánh dấu" Client.

Các cờ bảo mật (Security Flags) quan trọng

Khi set cookie từ Server, Luôn dùng các cờ sau cho Token:

  1. HttpOnly: JS client (document.cookie) KHÔNG thể đọc được. -> Chống XSS ăn cắp token.
  2. Secure: Chỉ gửi qua HTTPS.
  3. SameSite:
    • Strict: Chỉ gửi cookie nếu đang ở đúng trang đó.
    • Lax: Gửi cookie khi navigate từ trang khác sang (VD click link từ Facebook sang). Đây là default tốt nhất.
http:
Set-Cookie: session_id=xyz; HttpOnly; Secure; SameSite=Lax

3. LocalStorage & SessionStorage

Dễ dùng (localStorage.setItem), đồng bộ (Synchronous).

  • Tuyệt đối KHÔNG lưu Sensitive Data (Password, Access Token) vào đây nếu không có cơ chế mã hóa. Vì XSS script có thể đọc sạch LocalStorage chỉ bằng 1 dòng code.
  • Thích hợp lưu: Dark mode preference, trạng thái Sidebar collapsed, dữ liệu giỏ hàng (Cart) tạm thời.

4. IndexedDB: The Heavy Lifter

Cơ sở dữ liệu NoSQL ngay trong trình duyệt.

  • Hỗ trợ Transaction, Index.
  • Bất đồng bộ (Async).
  • Dùng cho các App phức tạp: Google Docs (offline editing), Figma, cache API response lớn.
  • Thư viện khuyên dùng: idb hoặc Dexie.js ( vì API gốc rất khó dùng).

Kết luận: Lưu Auth Token ở đâu?

Đây là tranh cãi ngàn năm.

  1. Lưu ở LocalStorage:

    • Dễ làm. Header Authorization: Bearer <token> dễ setup.
    • Rủi ro: Dính XSS là mất Token.
  2. Lưu ở HttpOnly Cookie:

    • An toàn trước XSS (JS không đọc được).
    • Rủi ro: Dính CSRF (nhưng đã có SameSite cookie cookie chặn).
    • Khó setup hơn (Cần proxy nếu API khác domain).

=> Khuyến nghị: Dùng HttpOnly Cookie cho các App quan trọng (Banking, Enterprise). Dùng LocalStorage cho các dự án nhỏ/trung bình nếu tự tin kiểm soát được XSS.

Quảng cáo
mdhorizontal