11 min read

Web Storage Deep Dive: localStorage, sessionStorage, Cookies & Hội Bạn 'Lưu Trữ' Web 💾

Mở Đầu: “Data” Ở Đâu Trong Cái “Mạng” Mênh Mông Này? 🤔

Chào bạn, chắc hẳn trong quá trình “chiến đấu” với front-end, bạn đã không ít lần đau đầu với việc lưu trữ dữ liệu phía client đúng không? Từ những thông tin cấu hình nhỏ nhặt đến cả đống dữ liệu phức tạp, làm sao để “nhớ” chúng mà không cần “làm phiền” server mỗi lần? Đó là lúc chúng ta cần đến sự trợ giúp của “hội bạn” Web Storage: localStorage, sessionStorage, cookies, và cả “người anh em” mạnh mẽ IndexedDB. Bài viết này sẽ không chỉ đơn thuần là “kể tên” và “so sánh” thông số kỹ thuật khô khan. Mình sẽ cùng bạn “mổ xẻ” từng “gương mặt”, hiểu rõ “tính cách”, “sở trường” của mỗi loại, và quan trọng nhất là biết khi nào nên “bắt tay” với ai để giải quyết bài toán của mình. Cùng nhau “lên đồ” thôi nào! 💪

1. sessionStorage: “Nhớ” Trong Chốc Lát, “Quên” Rất Nhanh 💨

sessionStorage đúng như tên gọi, chỉ “nhớ” dữ liệu trong phạm vi một “phiên làm việc” (session) của trình duyệt. Hiểu đơn giản là khi bạn mở một tab hoặc cửa sổ trình duyệt, sessionStorage sẽ bắt đầu “ghi nhớ”. Đến khi bạn đóng tab/cửa sổ đó lại, toàn bộ dữ liệu trong sessionStorage cũng “bay màu” theo.

Tại Sao Lại Có Anh Bạn Này?

sessionStorage sinh ra để phục vụ những nhu cầu lưu trữ dữ liệu tạm thời, chỉ cần thiết trong phiên làm việc hiện tại của người dùng. Ví dụ như thông tin giỏ hàng khi người dùng chưa hoàn tất thanh toán, dữ liệu của một form nhiều bước, hay trạng thái của một số tùy chọn chỉ áp dụng cho phiên hiện tại.

”Tuyệt Chiêu” Của sessionStorage:

  • Phạm vi giới hạn: Dữ liệu chỉ tồn tại trong tab/cửa sổ trình duyệt đã tạo ra nó. Các tab/cửa sổ khác, ngay cả khi thuộc cùng một website, cũng không thể “nhìn thấy”.
  • Tự động “xóa sổ”: Khi đóng tab/cửa sổ, dữ liệu tự động bị xóa, giúp “dọn dẹp” bộ nhớ và đảm bảo tính riêng tư cho người dùng.
  • Dung lượng khá ổn: Thường có dung lượng tương đương localStorage (khoảng 5MB), đủ dùng cho các dữ liệu tạm thời.

Cách Sử Dụng:

// Lưu dữ liệu
sessionStorage.setItem("currentTheme", "light");
sessionStorage.setItem("formData", JSON.stringify({ name: "User A", step: 2 }));

// Lấy dữ liệu
const theme = sessionStorage.getItem("currentTheme");
const formData = JSON.parse(sessionStorage.getItem("formData") || "{}");

console.log(theme); // Output: light
console.log(formData.name); // Output: User A

// Cập nhật dữ liệu (tương tự localStorage)
sessionStorage.setItem("currentTheme", "dark");

// Xóa dữ liệu
sessionStorage.removeItem("formData");

// Xóa sạch "ký ức"
sessionStorage.clear();

Khi Nào Nên “Bắt Tay” Với sessionStorage?

  • Lưu thông tin giỏ hàng tạm thời trước khi thanh toán.
  • Lưu trạng thái của một quy trình nhiều bước (ví dụ: wizard).
  • Lưu các tùy chọn hiển thị chỉ áp dụng cho phiên làm việc hiện tại.

2. localStorage: “Trí Nhớ” Siêu Phàm, “Lưu Trữ” Vô Thời Hạn 💾

Trái ngược với sessionStorage, localStorage có khả năng “ghi nhớ” dữ liệu một cách “dai dẳng”. Một khi dữ liệu đã được lưu vào localStorage, nó sẽ “nằm yên” ở đó cho đến khi bạn chủ động xóa nó đi, hoặc người dùng tự xóa dữ liệu trình duyệt. Kể cả khi tắt trình duyệt, khởi động lại máy tính thì dữ liệu vẫn còn nguyên.

“Lai Lịch” Của localStorage:

localStorage ra đời để giải quyết nhu cầu lưu trữ dữ liệu dài hạn phía client, thay thế cho cookies trong nhiều trường hợp vì cookies có giới hạn về dung lượng và luôn bị gửi kèm theo request lên server, gây tốn băng thông.

”Điểm Mạnh” Của localStorage:

  • “Trường tồn” với thời gian: Dữ liệu không bị xóa khi đóng trình duyệt.
  • Dung lượng lớn: Thường từ 5MB đến 10MB, thoải mái lưu trữ nhiều loại dữ liệu.
  • Không “làm phiền” server: Dữ liệu chỉ nằm ở phía client, không ảnh hưởng đến hiệu năng của các request.

Thao Tác Với localStorage:

// Lưu thông tin người dùng
localStorage.setItem(
  "userSettings",
  JSON.stringify({ theme: "dark", language: "en" })
);
localStorage.setItem("authToken", "your_long_live_token_here");

// Lấy thông tin
const settings = JSON.parse(localStorage.getItem("userSettings") || "{}");
const token = localStorage.getItem("authToken");

console.log(settings.theme); // Output: dark
console.log(token); // Output: your_long_live_token_here

// Cập nhật cài đặt
settings.language = "vi";
localStorage.setItem("userSettings", JSON.stringify(settings));

// Xóa token khi logout
localStorage.removeItem("authToken");

// "Xóa sạch sành sanh"
localStorage.clear();

Khi Nào Nên “Chọn Mặt Gửi Vàng” Cho localStorage?

  • Lưu thông tin cấu hình người dùng (theme, ngôn ngữ, kích thước chữ…).
  • Lưu trạng thái đăng nhập để người dùng không cần đăng nhập lại mỗi khi mở trang web. (Cần cân nhắc kỹ về bảo mật).
  • Lưu dữ liệu offline cho ứng dụng web (ví dụ: dữ liệu đã tải về để xem offline).

3. Cookies: “Cổ Điển” Nhưng Vẫn “Có Giá Trị” 🍪

Cookies là những “mẩu bánh quy” nhỏ bé, là một trong những cơ chế lưu trữ dữ liệu phía client lâu đời nhất. Cookies được server gửi xuống trình duyệt, và trình duyệt sẽ tự động gửi lại cookies đó cho server trong các request tiếp theo.

“Lịch Sử Hình Thành” Của Cookies:

Cookies ban đầu được tạo ra để giải quyết vấn đề “vô trạng thái” của giao thức HTTP, giúp server có thể “nhớ” các thông tin về người dùng giữa các request.

”Công Dụng” Của Cookies:

  • Quản lý phiên: Lưu thông tin phiên đăng nhập để duy trì trạng thái đăng nhập của người dùng.
  • Cá nhân hóa: Lưu các tùy chọn cá nhân hóa của người dùng (ví dụ: theme, ngôn ngữ).
  • Theo dõi và phân tích: Theo dõi hành vi người dùng để phục vụ mục đích quảng cáo hoặc phân tích.

Cách Thức Hoạt Động Của Cookies:

// Thiết lập cookie
document.cookie = "userId=12345; expires=Fri, 15 Jun 2024 12:00:00 UTC; path=/";
document.cookie = "theme=dark; path=/";

// Đọc cookie
const cookies = document.cookie;
console.log(cookies); // Output: userId=12345; theme=dark

function getCookie(name: string) {
  const value = `; ${document.cookie}`;
  const parts = value.split(`; ${name}=`);
  if (parts.length === 2) return parts.pop()?.split(";").shift();
}

const userId = getCookie("userId");
console.log(userId); // Output: 12345

// Xóa cookie (bằng cách đặt thời gian hết hạn về quá khứ)
document.cookie = "userId=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;";

Lưu Ý Khi “Làm Việc” Với Cookies:

  • Dung lượng hạn chế: Chỉ khoảng 4KB.
  • Luôn bị gửi kèm request: Có thể ảnh hưởng đến hiệu năng nếu lạm dụng.
  • Vấn đề bảo mật: Dễ bị tấn công XSS. Cần sử dụng các thuộc tính HttpOnlySecure để tăng cường bảo mật.
  • Vấn đề riêng tư: Cần thông báo và xin phép người dùng trước khi sử dụng cookies để theo dõi hành vi.

Khi nào Cookies Vẫn “Có Ích”?

  • Lưu thông tin phiên đăng nhập (thường kết hợp với server-side session).
  • Lưu các tùy chọn cá nhân hóa cần thiết phải gửi kèm request lên server.
  • Các mục đích theo dõi và phân tích người dùng (cần tuân thủ các quy định về quyền riêng tư).

4. IndexedDB: “Kho Lưu Trữ” Dữ Liệu Khổng Lồ Cho Ứng Dụng Web 🗄️

Nếu như localStoragesessionStorage chỉ phù hợp với việc lưu trữ các cặp key-value đơn giản, thì IndexedDB lại là một hệ thống cơ sở dữ liệu NoSQL mạnh mẽ được tích hợp ngay trong trình duyệt. Nó cho phép bạn lưu trữ lượng lớn dữ liệu có cấu trúc, bao gồm cả files/blobs, và hỗ trợ các truy vấn phức tạp.

“Sức Mạnh” Của IndexedDB:

  • Lưu trữ “khủng”: Dung lượng lưu trữ lớn hơn nhiều so với các loại web storage khác, thường giới hạn bởi dung lượng ổ cứng của người dùng.
  • Dữ liệu có cấu trúc: Lưu trữ được các đối tượng phức tạp, không chỉ là string.
  • Truy vấn hiệu quả: Hỗ trợ indexing, giúp tìm kiếm và truy xuất dữ liệu nhanh chóng.
  • Giao dịch (Transactions): Đảm bảo tính toàn vẹn của dữ liệu khi thực hiện nhiều thao tác cùng lúc.
  • Hoạt động bất đồng bộ: Không gây “treo” trình duyệt khi thực hiện các thao tác tốn thời gian.

Ví Dụ Sử Dụng IndexedDB:

// Mở hoặc tạo database
const request = indexedDB.open("myDatabase", 1);

request.onerror = (event) => {
  console.error("Lỗi khi mở database:", event);
};

request.onsuccess = (event) => {
  const db = (event.target as IDBRequest).result;
  console.log("Mở database thành công");
  // Thực hiện các thao tác với database ở đây
};

request.onupgradeneeded = (event) => {
  const db = (event.target as IDBRequest).result;
  const objectStore = db.createObjectStore("products", { keyPath: "id" });
  objectStore.createIndex("name", "name", { unique: false });
  console.log("Database được nâng cấp hoặc tạo mới");
};

// Thêm dữ liệu
function addData(
  db: IDBDatabase,
  product: { id: number; name: string; price: number }
) {
  const transaction = db.transaction(["products"], "readwrite");
  const objectStore = transaction.objectStore("products");
  const request = objectStore.add(product);

  request.onsuccess = () => {
    console.log("Thêm sản phẩm thành công:", product.name);
  };
  request.onerror = () => {
    console.error("Lỗi khi thêm sản phẩm");
  };
}

Khi nào IndexedDB “Thể Hiện”?

  • Lưu trữ dữ liệu offline cho các ứng dụng web phức tạp (ví dụ: ứng dụng ghi chú, ứng dụng quản lý công việc).
  • Cache lượng lớn dữ liệu hoặc tài nguyên để cải thiện hiệu năng.
  • Lưu trữ dữ liệu người dùng tạo ra (ví dụ: bài viết, bình luận).

Bảng Tổng Kết: “Chân Dung” Các “Anh Tài” Web Storage 📊

Tính NăngsessionStoragelocalStorageCookiesIndexedDB
Thời gian tồn tạiTheo phiên trình duyệtVĩnh viễn (cho đến khi bị xóa)Tùy thuộc vào thời gian hết hạn (expiry)Vĩnh viễn (cho đến khi bị xóa)
Phạm viTheo tab/cửa sổ trình duyệtTheo origin (domain, protocol, port)Theo domain và pathTheo origin
Dung lượngKhoảng 5MBKhoảng 5MB - 10MBKhoảng 4KBLớn (tùy thuộc vào dung lượng ổ cứng)
Gửi kèm requestKhôngKhôngKhông
Bảo mậtÍt bảo mật (dễ bị XSS)Ít bảo mật (dễ bị XSS)Có thể cấu hình HttpOnly, SecureCần cẩn trọng với XSS
Loại dữ liệuStringStringStringStructured data, files/blobs
APIĐơn giản, đồng bộĐơn giản, đồng bộPhức tạp hơnPhức tạp, bất đồng bộ
Use Cases chínhDữ liệu tạm thời cho phiên làm việc hiện tạiDữ liệu dài hạn, cấu hình người dùngQuản lý phiên, cá nhân hóa, theo dõiLưu trữ lượng lớn dữ liệu có cấu trúc, ứng dụng offline

Kết Luận: Sự “Hiểu Nhau” Chính Là Khóa Thành Công 🔑

Vậy là chúng ta đã cùng nhau “điểm danh” và “mổ xẻ” chi tiết về các loại web storage phổ biến. Hy vọng rằng qua bài viết này, bạn đã có cái nhìn rõ ràng hơn về vai trò, cách sử dụng và khi nào nên “triệu hồi” từng “anh tài” để giải quyết từng vấn đề cụ thể trong dự án của bạn. Không có “công thức” chung cho mọi trường hợp, việc lựa chọn loại web storage phù hợp phụ thuộc vào yêu cầu cụ thể của dự án. Hãy cân nhắc kỹ lưỡng về thời gian tồn tại của dữ liệu, dung lượng cần thiết, vấn đề bảo mật và hiệu năng.

Chúc bạn “code” ngày càng “lên tay” và tạo ra những ứng dụng web “xịn sò”! 👍

Tài Liệu Tham Khảo: