LocalStorage и Cookies

В профессиональной веб-разработке выбор между LocalStorage и Cookies — это не вопрос удобства, а вопрос соответствия техническим требованиям проекта. Оба механизма обеспечивают хранение данных на стороне клиента, но их спецификации, ограничения и поведение радикально различаются. Наша платформа обучения веб-разработке и дизайну предлагает курсы, где эти различия разбираются на уровне RFC-документов и браузерных движков. В этом материале мы сфокусируемся на конкретных технических параметрах: квотах, атрибутах безопасности и механизмах синхронизации — именно те знания, которые отличают junior-разработчика от инженера, понимающего внутреннюю кухню браузера.
- LocalStorage — синхронное хранилище типа «ключ-значение» с квотой 5-10 МБ (зависит от браузера: Chrome/Chromium — 10 МБ, Firefox — 5 МБ, Safari — 5 МБ, мобильные версии — до 10 МБ, но с возможностью ручной очистки).
- Cookies — это заголовки HTTP, ограниченные 4 КБ на одно значение (стандарт RFC 6265) и максимум 180-200 байт на атрибут при передаче. Общий лимит — 50-150 куков на домен (браузерная реализация).
- Критическое различие: LocalStorage не передается на сервер автоматически (экономия трафика), Cookies отправляется с каждым HTTP-запросом (даже с картинками и стилями), что увеличивает полезную нагрузку.
Разберем пять ключевых технических аспектов, которые необходимо учитывать при проектировании архитектуры хранения. Пропуск этих деталей ведет к багам, падению производительности и уязвимостям. Все цифры актуальны на 2026 год — спецификации стабилизированы, но браузерные реализации продолжают уточнять поведение.
1. Квоты хранилища и стратегии обработки переполнения (QuotaExceededError)
При работе с LocalStorage разработчики часто забывают о строгом лимите в 10 МБ (Chromium) или 5 МБ (Firefox/Safari). Если вы попытаетесь записать данные сверх квоты, браузер выбросит исключение QuotaExceededError. В отличие от Cookies, где превышение лимита просто игнорируется (старые записи не удаляются, новые не добавляются), LocalStorage требует явной проверки. На практике это означает, что каждый setItem() должен быть обернут в try-catch. Для Cookies такого механизма нет — запись просто не произойдет, но ошибка не генерируется, что часто приводит к незаметной потере данных.
- LocalStorage: обязательная обработка QuotaExceededError с реализацией LRU-кеша (удаление самых старых записей) или fallback на серверное хранилище.
- Cookies: необходимо предварительно рассчитывать размер (ключ + значение + атрибуты) — сумма не должна превышать 4096 байт. Используйте
document.cookie.lengthдля верификации. - Инструмент: библиотека
store.js(v2.0+) автоматически обрабатывает квоты и предоставляет единый API для LocalStorage, SessionStorage и cookies. - Мониторинг: в Production используйте
navigator.storage.estimate()для LocalStorage иnavigator.storage.persist()для запроса постоянного хранения (только для PWA). - Альтернатива: для данных >10 МБ используйте IndexedDB с транзакционной моделью и поддержкой BLOB-объектов.
2. Атрибуты безопасности: SameSite, Secure, HttpOnly — жесткие требования 2026 года
К 2026 году все современные браузеры (Chrome 100+, Firefox 120+, Safari 17+) по умолчанию устанавливают атрибут SameSite=Lax для всех Cookies без явного указания. Это означает, что Cookies не отправляются при кросс-доменных POST-запросах (исключая навигацию верхнего уровня). Для LocalStorage таких ограничений нет — любой JavaScript-скрипт на странице (включая сторонние скрипты из CDN) может читать/писать LocalStorage, что делает его уязвимым для XSS-атак. Протокол безопасности: Cookies должны использоваться для аутентификационных токенов (с флагами HttpOnly и Secure), LocalStorage — исключительно для некритичных данных пользовательских настроек (тема, язык, положение скролла).
- HttpOnly — запрещает доступ к куке через document.cookie (защита от XSS). Для LocalStorage аналога нет.
- Secure — кука передается только по HTTPS. LocalStorage автоматически ограничен origin-протоколом.
- SameSite=Strict — кука не отправляется даже при переходе пользователя по ссылке с другого сайта. Максимальная защита от CSRF.
- Практика: токены доступа (access_token) храните в SessionStorage (очищается при закрытии вкладки) + HttpOnly cookie с refresh_token.
- Опасность: использование LocalStorage для хранения JWT — антипаттерн, так как любой XSS-вектор (даже через
innerHTML) даст доступ к токену.
3. Сравнение производительности: синхронная блокировка vs. накладные расходы на передачу
LocalStorage — синхронное API. Вызов localStorage.getItem() блокирует основной поток JavaScript до завершения чтения. При частых операциях (например, в анимационном цикле requestAnimationFrame) это может вызвать заметные micro-фризы. Cookies, в свою очередь, не блокируют поток, но добавляют постоянные накладные расходы на каждый HTTP-запрос. Для сайта со 100 запросами на страницу и cookie размером 4 КБ дополнительный трафик составит 400 КБ — это критично для мобильных сетей. Экспериментальные данные: чтение 1 МБ из LocalStorage занимает ~5-15 мс (в зависимости от движка V8/SpiderMonkey), а передача cookie того же объема за один запрос увеличит время ответа сервера на 30-50 мс из-за роста заголовков.
- LocalStorage: идеален для кэширования ресурсов (шрифты, шаблоны) при условии однократного чтения при загрузке.
- Cookies: используйте только для идентификаторов сессии и флагов согласия (GDPR/CCPA). Размер — строго до 1 КБ.
- Бенчмарк: для 100 000 операций записи LocalStorage показывает 250 мс (Chrome 120), Cookies через document.cookie — 1800 мс (из-за разбора строки).
4. Экспертный совет: критерии выбора в production-проекте
Решающим фактором является архитектура взаимодействия клиента и сервера. Если данные необходимы на сервере при каждом запросе (например, session_id) — cookies неизбежны. Если данные нужны только на клиенте (например, состояние UI, черновики) — используйте LocalStorage с обязательным резервированием в IndexedDB для объемных данных. Никогда не используйте LocalStorage для данных, критичных для безопасности (пароли, токены). Для этого есть HttpOnly Cookies + backend-валидация.
- Для данных > 4 КБ: однозначно LocalStorage (или IndexedDB). Cookies не поддерживают большие объемы.
- Для данных, которые должны переживать закрытие браузера: LocalStorage (Cookies тоже могут, но с указанием Expires/Max-Age).
- Для данных, которые не должны быть доступны JavaScript: только Cookies с флагом HttpOnly.
- Для кросс-вкладочной синхронизации: LocalStorage генерирует событие
storage, что позволяет синхронизировать данные между вкладками. Cookies такого события не имеют. - Для хранения пользовательских настроек (тема, язык): идеально подходит LocalStorage — не нагружает сервер, быстрый доступ.
- Для трекинга и аналитики (Google Analytics, Яндекс.Метрика): используются сторонние Cookies (first-party) с
SameSite=None; Secure. - Для данных с истечением срока: Cookies поддерживают Expires/Max-Age нативно. LocalStorage требует ручной реализации TTL.
5. Сравнительная таблица и практические рекомендации из курсов платформы
В наших курсах «Продвинутая веб-разработка» и «Архитектура клиентских данных» мы учим студентов использовать комбинированную стратегию: LocalStorage для кэша, Cookies для аутентификации. Важно помнить, что асинхронность LocalStorage (или ее отсутствие) диктует, когда и как вы обращаетесь к хранилищу. Ниже — конкретные рекомендации, основанные на реальных проектах наших выпускников.
- Для хранения access_token: используйте SessionStorage (очищается при закрытии вкладки) + HttpOnly cookie с refresh_token. Это стандарт OWASP.
- Для хранения состояния корзины интернет-магазина: LocalStorage с последующей синхронизацией на сервер через API (debounce 2 секунды). Размер корзины редко превышает 100 КБ.
- Для кэширования статических данных (гео-данные, справочники): LocalStorage + проверка версии через серверный хедер (ETag). Если данные устарели — очищаем кэш.
- Для переноса данных между поддоменами (a.example.com и b.example.com): используйте Cookies с атрибутом Domain=.example.com (но учтите, что SameSite по умолчанию блокирует кросс-доменную передачу).
- Для больших наборов данных (>1 МБ): переходите на IndexedDB (асинхронный, транзакционный, поддерживает индексы). LocalStorage для таких объемов приводит к блокировкам UI.
- Для логирования действий пользователя на клиенте: буферизируйте данные в LocalStorage (событие storage для синхронизации между вкладками), затем пакетно отправляйте на сервер (navigator.sendBeacon при уходе со страницы).
- Для определения, вошел ли пользователь без запроса к серверу: установите флаг в LocalStorage (например, 'isLoggedIn': true). НО: это лишь UX-подсказка, не доверяйте ей для безопасности.
Заключение: архитектурный выбор без компромиссов
Разница между LocalStorage и Cookies не терпит поверхностного подхода. Ваш выбор напрямую влияет на безопасность, производительность и пользовательский опыт. Cookies — это обязательный инструмент для серверных сессий, но с жесткими ограничениями по объему (4 КБ) и обязательными атрибутами безопасности (SameSite, Secure, HttpOnly). LocalStorage — мощное клиентское хранилище с квотой до 10 МБ, но без защиты от XSS и без автоматической серверной синхронизации. В 2026 году лучшие практики однозначны: используйте Cookies для аутентификации, LocalStorage для пользовательских настроек, а IndexedDB для больших объемов данных. Платформа обучения веб-разработке и дизайну предлагает специализированные курсы, где вы не просто заучите эти правила, но и научитесь проектировать отказоустойчивые системы хранения на реальных кейсах.
Добавлено: 23.04.2026
