Gernar
Frontend DeveloperBrowser API

Интервью-вопрос

Больше данных хранится в cookie или в localStorage

Обычно больше данных можно хранить в localStorage, но это не делает его заменой cookie. В ответе важно связать размер с сетью, безопасностью и жизненным циклом данных.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 60 правильно

Как лучше сказать про объем хранения?

Вы сейчас отвечаете, где обычно можно хранить больше данных: в cookie или localStorage.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

На вопрос "где хранится больше данных" прямой ответ такой: обычно в localStorage. Cookie рассчитаны на маленькие значения, потому что они участвуют в HTTP-запросах. localStorage рассчитан на клиентское хранение и обычно дает несколько мегабайт на origin.

Но сильный ответ должен сразу добавить ограничение. localStorage не является базой данных без лимитов. Квота зависит от браузера, режима, устройства и политики хранения. Если квота закончилась, запись может выбросить ошибку, и интерфейс не должен ломаться.

Cookie отличаются от localStorage не только лимитом. Подходящие cookie браузер автоматически добавляет в HTTP-запросы к домену и пути. Если положить туда большой JSON, каждый запрос может получить лишние байты в заголовках.

Практический риск простой: медленнее сеть, больше трафика, выше шанс упереться в ограничения на размер заголовков. Поэтому cookie хороши для небольших значений, которые действительно нужны серверу, например идентификатора сессии.

Когда что выбрать

На интервью удобно отвечать через сценарий. Если серверу нужно получать значение автоматически, выбирайте cookie. Если это клиентская настройка вроде темы, закрытого баннера или небольшого кеша, можно использовать localStorage. Если данных много и они структурированные, localStorage уже слабый вариант.

Как выбрать хранилище

1Данные должны автоматически приходить на сервер с запросом?
Используйте cookie, лучше выставленную сервером через Set-Cookie.
2Это клиентская настройка, флаг интерфейса или небольшой кеш?
Подойдет localStorage, если данные не чувствительные и объем небольшой.
3Нужно хранить много структурированных данных или офлайн-кеш?
Смотрите в сторону IndexedDB, потому что localStorage синхронный и строковый.
4Данные чувствительные и их не должен читать JavaScript?
Не кладите их в localStorage. Рассмотрите HttpOnly cookie и серверную модель сессии.

Безопасность и токены

Главная ловушка в теме: "localStorage больше, значит туда можно положить все". Так говорить опасно. Данные в localStorage доступны любому JavaScript-коду на странице. Если в приложении случится XSS, злоумышленник сможет прочитать токен или другие секреты.

Cookie тоже не магически безопасны. Но у них есть атрибуты, которые помогают строить сессии: HttpOnly скрывает cookie от JavaScript, Secure требует HTTPS, SameSite снижает риск CSRF в типичных сценариях. Важно сказать, что HttpOnly выставляется сервером через Set-Cookie, а не через document.cookie.

React и SSR нюанс

localStorage существует только в браузере. Если читать его на верхнем уровне модуля или во время серверного рендера, SSR-страница может упасть с ошибкой, а React может получить разные начальные значения на сервере и клиенте.

Безопаснее иметь дефолтное состояние, а браузерное значение читать после mount или за проверкой typeof window !== "undefined". Для UI это означает: сначала показываем предсказуемую дефолтную тему или skeleton, потом аккуратно применяем сохраненную настройку без падения страницы.

Пример с localStorage

Нормальный сценарий для localStorage: сохранить небольшую нечувствительную настройку интерфейса.

try {
  localStorage.setItem("theme", "dark");
} catch (error) {
  // Хранилище может быть недоступно или переполнено.
  // Интерфейс должен остаться рабочим с дефолтной темой.
}

Плохой вариант: хранить здесь пароль, refresh token или большой кеш каталога. В первом случае вы получаете риск кражи при XSS, во втором можете заблокировать основной поток и упереться в квоту.

Cookie для сессии обычно задает сервер, потому что только сервер может выставить HttpOnly.

Set-Cookie: sid=abc123; HttpOnly; Secure; SameSite=Lax; Path=/; Max-Age=3600

Если вы создаете cookie из браузера через document.cookie, не говорите, что можете сделать ее HttpOnly. Такую cookie JavaScript сможет читать и менять в пределах правил домена, пути и политики браузера.

Как звучит сильный ответ

Хорошая формулировка не спорит о точной цифре лимита. Она показывает, что вы понимаете назначение механизмов.

"Больше обычно помещается в localStorage, потому что cookie маленькие, около нескольких килобайт, и автоматически уходят с запросами. Но я не стал бы хранить в localStorage секреты или большие структуры. Для сессии лучше cookie с правильными атрибутами, а для большого клиентского кеша лучше IndexedDB".

Безопаснее для ответа
  1. 1Назвать разницу в размере
  2. 2Объяснить автоматическую отправку cookie
  3. 3Уточнить риск XSS для localStorage
  4. 4Предложить IndexedDB для больших данных
Опасный ответ
  1. 1Сказать только про мегабайты
  2. 2Забыть про заголовки запросов
  3. 3Посоветовать localStorage для токенов
  4. 4Не упомянуть лимиты и ошибки записи

Частые ошибки

Где обычно ошибаются

Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.

  1. 1

    Сводить выбор только к размеру

    Размер важен, но это не весь ответ. Cookie участвуют в HTTP-обмене, а localStorage доступен JavaScript-коду и не имеет срока жизни. На интервью лучше сразу связать выбор с сетью, безопасностью и жизненным циклом данных.
  2. 2

    Хранить токены в localStorage без оговорок

    При XSS любой скрипт на странице сможет прочитать значение через localStorage.getItem(). Более безопасная формулировка: для сессий часто используют cookie с HttpOnly, Secure и SameSite, а конкретная схема зависит от угроз проекта.
  3. 3

    Пытаться ставить HttpOnly из браузерного JavaScript

    Атрибут HttpOnly нельзя выставить через document.cookie. Его задает сервер в заголовке Set-Cookie. Если сказать обратное, это быстро проверят уточняющим вопросом.
  4. 4

    Класть большие JSON-объекты в localStorage

    localStorage хранит строки и работает синхронно. Большая сериализация через JSON.stringify и чтение через JSON.parse могут подвесить интерфейс, а при превышении квоты запись упадет. Для крупных данных лучше использовать IndexedDB.
  5. 5

    Не обрабатывать ошибки хранения

    В приватном режиме, при заполненной квоте или ограничениях браузера запись может не пройти. Код должен обрабатывать исключения, иначе пользователь потеряет настройку или увидит сломанный сценарий без понятной причины.
  6. 6

    Читать localStorage там, где нет браузера

    В SSR-коде и во время серверного рендера объекта localStorage нет. Если читать его без проверки, страница может упасть или получить mismatch при гидрации. В React безопаснее читать настройку после mount, хранить дефолтное состояние и обновлять UI, когда браузерное значение доступно.

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, которыми проверяют понимание браузерного хранения, лимитов и безопасности.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание