Интервью-вопрос
Что такое cookie
Cookie - это небольшие данные сайта, которые браузер хранит и отправляет с подходящими HTTP-запросами. Для frontend-разработчика главный риск в том, что cookie влияют на авторизацию, CORS, CSRF, XSS и размер запросов.
- Добавлен
- Редакция
Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.
Мини-квиз
Проверка перед разбором
Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.
Вопрос 1 из 50 правильно
Разбор
Разобраться, а не зазубрить
Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.
Базовая идея
Cookie - это не просто файл в браузере и не полный аналог localStorage. Это механизм HTTP, который связывает небольшое значение с доменом и путем. Когда запрос подходит под эти ограничения, браузер сам добавляет cookie в запрос.
Типичный обмен выглядит так:
HTTP/1.1 200 OK
Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Lax; Path=/; Max-Age=3600После этого браузер может отправлять cookie в следующих запросах:
GET /api/me HTTP/1.1
Host: example.com
Cookie: sessionId=abc123Для интервью главное вот что. Cookie удобны, когда серверу нужно узнавать пользователя между запросами. Но автоматическая отправка делает их чувствительными к настройкам безопасности и кросс-доменным правилам.
Как это сказать на интервью
Короткий ответ может звучать так:
Cookie - это небольшие данные, которые браузер хранит для сайта и отправляет с подходящими HTTP-запросами. Их часто используют для сессий, авторизации, настроек и аналитики. Для авторизационных cookie важны HttpOnly, Secure, SameSite, срок жизни и область действия. На фронтенде я не считаю наличие cookie доказательством логина, а проверяю сессию по ответу сервера.
Такая формулировка сильнее, чем ответ cookie хранят данные пользователя. Вы сразу показываете механизм, применение, риск и практическое действие в UI.
Когда выбирать cookie
На фронтенде не стоит говорить, что cookie всегда лучше или хуже Web Storage. Правильный выбор зависит от того, кто должен читать значение и должно ли оно автоматически уходить на сервер.
Как выбрать место хранения
Рассмотрите cookie, но держите значение коротким и ограничьте срок жизни.Лучше ставить его на сервере с HttpOnly, Secure и подходящим SameSite.Можно использовать cookie, если настройка нужна серверу при первом рендере. Иначе чаще проще localStorage.Не кладите его в cookie. Храните данные на сервере или используйте короткий идентификатор.Например, тему интерфейса можно хранить в localStorage, если она нужна только после загрузки приложения. Но если сервер рендерит страницу и должен сразу отдать HTML в правильной теме, cookie может быть удобнее, потому что она придет вместе с запросом.
Атрибуты, которые стоит назвать
На собеседовании не нужно перечислять все возможные атрибуты cookie. Достаточно уверенно назвать те, которые влияют на безопасность, срок жизни и область действия. Так вы показываете, что думаете не только о синтаксисе, но и о последствиях для продукта.
Что проверять в cookie
Нет доступа из JSСнижает риск кражи сессионного значения через XSS. Ставится сервером, через document.cookie его не добавить.
Только HTTPSНе дает отправлять cookie по обычному HTTP. Без него сессионная cookie может утечь в небезопасной сети.
Lax / Strict / NoneУправляет отправкой cookie в кросс-сайтовых переходах. Помогает против CSRF, но выбор режима влияет на OAuth, iframe и внешние переходы.
Срок жизниОпределяет, когда cookie исчезнет. Без срока жизни cookie обычно считается сессионной и может пропасть после завершения сессии браузера.
Область действияОграничивает, каким хостам и путям доступна cookie. Слишком широкая область повышает риск случайной отправки и конфликтов имен.
Практический пример во frontend-коде
Плохой пример для авторизации:
// Плохо: токен доступен любому JavaScript на странице.
document.cookie = `token=${token}; path=/`;Если на странице появится XSS, злоумышленник сможет прочитать такую cookie через document.cookie и унести токен. Еще одна проблема в том, что фронтенд не может поставить HttpOnly. Поэтому сессионную cookie лучше выдавать с сервера через Set-Cookie.
Более безопасная схема:
Set-Cookie: sessionId=abc123; HttpOnly; Secure; SameSite=Lax; Path=/; Max-Age=3600Фронтенд в таком случае не читает сам секрет. Он делает запрос, обрабатывает статусы 200, 401, 403 и обновляет UI по ответу сервера. Например, показывает загрузку при проверке сессии, переводит пользователя на экран входа при 401 и не оставляет кнопку "Выйти" после неуспешного logout.
Жизненный цикл cookie при авторизации
- 1Сервер выдает короткую сессионную cookie через Set-Cookie.
- 2Добавляет HttpOnly, Secure, SameSite и разумный срок жизни.
- 3Фронтенд проверяет статус ответа и не читает секрет из JavaScript.
- 4При logout сервер удаляет cookie тем же именем, доменом и путем.
- 1Фронтенд кладет токен в document.cookie без HttpOnly.
- 2Cookie уходит на слишком широкий домен и живет слишком долго.
- 3Код считает наличие cookie доказательством авторизации.
- 4При ошибке logout UI скрывает кнопку, но серверная сессия остается активной.
Не говорите, что наличие cookie в браузере само доказывает авторизацию. Источник правды находится на сервере. Cookie может устареть, быть удалена, не подойти по домену или не отправиться из-за настроек браузера. Поэтому UI должен уметь показать проверку сессии, обработать неавторизованный ответ и не показывать пользователю ложное состояние.
Кросс-доменные запросы и CORS
Частая frontend-ловушка выглядит так. API находится на другом origin, сервер прислал Set-Cookie, но пользователь остается неавторизованным. В таком сценарии нужно проверять не только код приложения, но и правила браузера.
Для fetch с cookie на другой origin часто нужен такой запрос:
await fetch("https://api.example.com/me", {
method: "GET",
credentials: "include",
});Но одной настройки на фронтенде недостаточно. Сервер должен разрешить credentials в CORS, вернуть конкретный origin вместо *, а cookie должна иметь подходящие SameSite, Secure, Domain и Path. Если не проверить все части, можно долго искать баг в React, хотя проблема в HTTP-настройках. Практический симптом для пользователя это бесконечный loading, повторный запрос профиля или внезапный редирект на login после успешной формы входа.
Ограничения и риски
Cookie маленькие. На практике ориентируются на лимит около нескольких килобайт на одну cookie и ограниченное количество cookie на домен. Поэтому не стоит класть туда большой JSON, корзину целиком или профиль пользователя. Такие данные увеличат каждый запрос и могут упереться в лимиты заголовков.
Еще один риск это доверие к клиенту. Пользователь может удалить или изменить доступную cookie. Если значение влияет на права доступа, цену, роль или состояние заказа, сервер обязан проверять его сам, а не верить строке из браузера.
Частые ошибки
Где обычно ошибаются
Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.
- 1
Называть cookie полным аналогом localStorage
Cookie участвуют в HTTP-обмене автоматически, аlocalStorageнет. Поэтому cookie влияют на безопасность, CORS, размер запросов и серверную авторизацию. На интервью сразу отделяйте эти инструменты друг от друга. - 2
Хранить секреты в доступной JavaScript cookie
Если cookie доступна черезdocument.cookie, XSS может прочитать ее значение. Для сессионных идентификаторов безопаснее серверная установка сHttpOnly,Secureи ограниченным сроком жизни. Не превращайте такую cookie в место для произвольных секретов. - 3
Забывать, что cookie отправляются с запросами
Большая cookie раздувает каждый подходящий запрос, включая запросы к картинкам, API и страницам. Это портит производительность и может привести к ошибкам из-за лимитов заголовков. В cookie лучше хранить короткие значения, а большие данные держать на сервере или в клиентском хранилище. - 4
Полагаться только на SameSite
SameSiteснижает риск CSRF, но не заменяет проверку опасных действий на сервере. Для мутаций нужны корректные методы, проверка происхождения запроса, CSRF-токены или другие серверные меры. Иначе один атрибут даст ложное чувство безопасности. - 5
Не учитывать кросс-доменные настройки
Если API находится на другом origin, cookie не начнет работать сама по себе. На фронтенде может понадобитьсяcredentials: "include", а на сервере точныйAccess-Control-Allow-OriginиAccess-Control-Allow-Credentials. Без этого логин выглядит сломанным, хотя заголовокSet-Cookieмог прийти. - 6
Обновлять UI по догадке о cookie
Проверкаdocument.cookieне доказывает, что пользователь авторизован. Cookie может бытьHttpOnly, устареть, не отправиться из-заSameSiteили уже не соответствовать сессии на сервере. Надежнее после login, reload и logout запрашивать профиль или статус сессии и показывать loading, error или неавторизованное состояние по ответу API.
Follow-up
Что могут спросить дальше
Короткие ответы на вопросы, которыми проверяют понимание cookie, безопасности и поведения браузера.
Живые ответы
Видео с похожим вопросом
Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.
Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.
Что такое DOM-дерево 😎
DOM-дерево это объектное представление HTML-документа, с которым JavaScript работает через браузерный API. На странице разбираем, как объяснить DOM на интервью, чем он отличается от HTML и почему прямые изменения DOM могут ломать безопасность, производительность и React-приложения.
Что такое полифил 😎
Полифил добавляет в старую среду недостающий стандартный API, чтобы код мог работать в целевых браузерах. Разбираем, чем он отличается от транспиляции, когда он нужен и какой риск он добавляет во фронтенд.