Khác nhau ở dung lượng, vòng đời, và có tự gửi lên server hay không.
- Cookie — ~4KB mỗi cookie, tự động đính kèm mọi request cùng origin (kể cả ảnh, API). Có
Expires, và quan trọng là cóHttpOnlyđể JS không đọc được. Dùng cho phiên đăng nhập. - localStorage — ~5-10MB, sống mãi tới khi bị xóa tay, dùng chung cho mọi tab cùng origin, API đồng bộ (chặn main thread nếu ghi dữ liệu lớn). Dùng cho cấu hình UI: theme, ngôn ngữ, trạng thái sidebar.
- sessionStorage — giống localStorage nhưng riêng từng tab và mất khi đóng tab. Dùng cho state tạm của một luồng: bước wizard, vị trí scroll khi quay lại.
- IndexedDB — database bất đồng bộ, dung lượng lớn (hàng trăm MB, theo quota), lưu được cả object và
Blob. Dùng cho offline data, cache danh sách lớn, file đính kèm.
Tiêu chí chọn: server có cần đọc không → cookie. Vài chuỗi nhỏ → localStorage/sessionStorage. Dữ liệu có cấu trúc và lớn → IndexedDB.
Lưu ý: cả ba loại storage phía client đều JS đọc được, nên không đặt secret ở đó.