Хранилища: Cookies, localStorage, sessionStorage, IndexedDB

↑ 1.1 Как работает веб и браузер · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: junior

Зачем это на собесе

Где хранить токены и данные: вопрос о безопасности и объёмах.

Объяснение

ХранилищеОбъёмВремя жизниУходит на серверДоступ из JS
Cookie~4 КБдо Expires/Max-Age/сессияда, с каждым запросомда (кроме HttpOnly)
localStorage~5 МБпока не очистятнетда
sessionStorage~5 МБвкладканетда
IndexedDBсотни МБ и большепостояннонетда, асинхронно
Cache API / Service Workerпо квотепостояннонетда

Cookie-флаги:

ФлагСмысл
HttpOnlyнедоступна из JS (защита от кражи через XSS)
Secureтолько HTTPS
SameSite=Lax/Strict/Noneограничение отправки при кросс-сайтовых запросах (защита от CSRF)
Domain, Pathобласть действия
localStorage.setItem("theme", "dark");
JSON.parse(localStorage.getItem("cart") ?? "[]");
 
const db = await new Promise((res, rej) => {
  const r = indexedDB.open("app", 1);
  r.onupgradeneeded = () => r.result.createObjectStore("orders", { keyPath: "id" });
  r.onsuccess = () => res(r.result); r.onerror = () => rej(r.error);
});

Выбор: сессия и аутентификация — HttpOnly cookie; настройки UI — localStorage; крупные офлайн-данные — IndexedDB (через обёртки idb, Dexie).

Нюансы и подводные камни

  • localStorage синхронный (блокирует главный поток) и уязвим к XSS — не храните в нём токены доступа без осознанного решения.
  • В режиме приватного просмотра возможны ограничения и исключения при записи: оборачивайте в try/catch.
  • Хранилища привязаны к origin, storage-события позволяют синхронизировать вкладки.
  • Cookie отправляются с каждым запросом: не храните большие данные.
  • Пользователь и браузер могут очистить данные — не считайте их надёжной базой.

Практика

  1. Сохраните тему оформления в localStorage и синхронизируйте между вкладками через событие storage.
  2. Настройте cookie с HttpOnly; Secure; SameSite=Lax на сервере.
  3. Сохраните 10 000 записей в IndexedDB и выполните поиск по индексу.

Вопросы с ответами

Связанные темы