Интервью-вопрос
Больше данных хранится в cookie или в localStorage
Обычно больше данных можно хранить в localStorage, но это не делает его заменой cookie. В ответе важно связать размер с сетью, безопасностью и жизненным циклом данных.
- Добавлен
- Редакция
Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.
Мини-квиз
Проверка перед разбором
Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.
Вопрос 1 из 60 правильно
Разбор
Разобраться, а не зазубрить
Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.
Базовая идея
На вопрос "где хранится больше данных" прямой ответ такой: обычно в localStorage. Cookie рассчитаны на маленькие значения, потому что они участвуют в HTTP-запросах. localStorage рассчитан на клиентское хранение и обычно дает несколько мегабайт на origin.
Но сильный ответ должен сразу добавить ограничение. localStorage не является базой данных без лимитов. Квота зависит от браузера, режима, устройства и политики хранения. Если квота закончилась, запись может выбросить ошибку, и интерфейс не должен ломаться.
Почему размер cookie особенно важен
Cookie отличаются от localStorage не только лимитом. Подходящие cookie браузер автоматически добавляет в HTTP-запросы к домену и пути. Если положить туда большой JSON, каждый запрос может получить лишние байты в заголовках.
Практический риск простой: медленнее сеть, больше трафика, выше шанс упереться в ограничения на размер заголовков. Поэтому cookie хороши для небольших значений, которые действительно нужны серверу, например идентификатора сессии.
Когда что выбрать
На интервью удобно отвечать через сценарий. Если серверу нужно получать значение автоматически, выбирайте cookie. Если это клиентская настройка вроде темы, закрытого баннера или небольшого кеша, можно использовать localStorage. Если данных много и они структурированные, localStorage уже слабый вариант.
Как выбрать хранилище
Используйте cookie, лучше выставленную сервером через Set-Cookie.Подойдет localStorage, если данные не чувствительные и объем небольшой.Смотрите в сторону IndexedDB, потому что localStorage синхронный и строковый.Не кладите их в 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
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Назвать разницу в размере
- 2Объяснить автоматическую отправку cookie
- 3Уточнить риск XSS для localStorage
- 4Предложить IndexedDB для больших данных
- 1Сказать только про мегабайты
- 2Забыть про заголовки запросов
- 3Посоветовать localStorage для токенов
- 4Не упомянуть лимиты и ошибки записи
Частые ошибки
Где обычно ошибаются
Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.
- 1
Сводить выбор только к размеру
Размер важен, но это не весь ответ. Cookie участвуют в HTTP-обмене, аlocalStorageдоступен JavaScript-коду и не имеет срока жизни. На интервью лучше сразу связать выбор с сетью, безопасностью и жизненным циклом данных. - 2
Хранить токены в localStorage без оговорок
При XSS любой скрипт на странице сможет прочитать значение черезlocalStorage.getItem(). Более безопасная формулировка: для сессий часто используют cookie сHttpOnly,SecureиSameSite, а конкретная схема зависит от угроз проекта. - 3
Пытаться ставить HttpOnly из браузерного JavaScript
АтрибутHttpOnlyнельзя выставить черезdocument.cookie. Его задает сервер в заголовкеSet-Cookie. Если сказать обратное, это быстро проверят уточняющим вопросом. - 4
Класть большие JSON-объекты в localStorage
localStorageхранит строки и работает синхронно. Большая сериализация черезJSON.stringifyи чтение черезJSON.parseмогут подвесить интерфейс, а при превышении квоты запись упадет. Для крупных данных лучше использовать IndexedDB. - 5
Не обрабатывать ошибки хранения
В приватном режиме, при заполненной квоте или ограничениях браузера запись может не пройти. Код должен обрабатывать исключения, иначе пользователь потеряет настройку или увидит сломанный сценарий без понятной причины. - 6
Читать localStorage там, где нет браузера
В SSR-коде и во время серверного рендера объектаlocalStorageнет. Если читать его без проверки, страница может упасть или получить mismatch при гидрации. В React безопаснее читать настройку после mount, хранить дефолтное состояние и обновлять UI, когда браузерное значение доступно.
Follow-up
Что могут спросить дальше
Короткие ответы на вопросы, которыми проверяют понимание браузерного хранения, лимитов и безопасности.
Живые ответы
Видео с похожим вопросом
Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.
Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.
Что такое Long Polling 😎
Long Polling держит HTTP-запрос открытым до появления данных или таймаута, а клиент сразу отправляет следующий запрос. На странице разбираем, чем он отличается от polling, WebSocket и SSE, и какие риски важно обработать во фронтенде.
Что происходит, когда пользователь вводит URL в браузере 😎
Браузер разбирает URL, находит сервер через DNS, устанавливает защищенное соединение, получает ответ и постепенно строит страницу. Разбираем порядок этапов и практические риски для frontend-разработчика.