Gernar
Frontend DeveloperБезопасность

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

Что такое HTTPOnly cookie

HTTPOnly cookie нельзя прочитать через JavaScript, но браузер продолжает отправлять ее в HTTP-запросах. На практике это снижает риск кражи токена при XSS, но не заменяет защиту от XSS, CSRF и перехвата по сети.

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

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

🐰0
🥚0

Мини-квиз

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

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

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

Что ответить про главное свойство HTTPOnly cookie?

Вы объясняете базовую идею на интервью.

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

Разбор

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

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

Базовая идея

HTTPOnly cookie это обычная cookie с дополнительным атрибутом HttpOnly. Сервер отправляет ее в ответе через Set-Cookie, а браузер сохраняет и отправляет обратно по правилам cookie.

Главное отличие для frontend-кода такое. Эта cookie не видна в document.cookie. Если на странице появится вредный скрипт, он не сможет просто прочитать токен и отправить его злоумышленнику.

Но cookie не исчезает для HTTP. Если запрос подходит по домену, пути, сроку жизни, SameSite и другим правилам, браузер приложит ее к запросу автоматически.

Что сказать коротко на интервью

Хорошая короткая формулировка может звучать так:

HTTPOnly cookie это cookie, недоступная для JavaScript. Она помогает не дать XSS-скрипту украсть значение сессии или токена через document.cookie. Но она все равно отправляется браузером в запросах, поэтому для безопасности нужны еще Secure, SameSite, CSRF-защита и нормальная защита от XSS.

В этой формулировке есть главное. Вы показываете поведение браузера, практический смысл и границу защиты. Это звучит сильнее, чем просто cookie для безопасности, потому что вы называете конкретную угрозу.

Как это выглядит в HTTP

Пример ответа сервера:

Set-Cookie: refreshToken=abc123; HttpOnly; Secure; SameSite=Lax; Path=/auth/refresh; Max-Age=604800

В frontend-коде вы не сможете сделать так:

// Плохая идея: HttpOnly cookie так не читается
const token = document.cookie
  .split("; ")
  .find((row) => row.startsWith("refreshToken="));

Такой код не найдет refreshToken. Если на нем построить авторизацию, UI может уйти в вечный loading, начать повторять запросы или ошибочно показать logout. Надежнее считать сервер источником правды. Отправьте запрос с cookie, получите профиль или 401, затем обновите состояние интерфейса.

Если архитектура строится на HTTPOnly cookie, frontend не должен доставать токен и вручную собирать Authorization. Он должен отправлять запросы так, чтобы браузер мог приложить cookie. Сервер должен проверить сессию и вернуть понятный статус, например 401.

Как выбрать безопасную схему

Что проверить перед использованием HTTPOnly cookie

1Нужно хранить сессию или refresh-токен?
Рассмотрите HttpOnly cookie с короткой областью действия и ротацией.
2Запросы идут только по HTTPS?
Добавьте Secure. Для production это почти всегда обязательное правило.
3Есть кросс-сайтовые сценарии?
Выберите SameSite осознанно и проверьте CSRF-защиту.
4SPA делает fetch к API на другом origin?
Настройте credentials на клиенте и точный CORS на сервере, без wildcard для credentials.

Для same-origin API браузер обычно сам отправит cookie в запросе. Для запросов на другой origin часто нужно явно включить credentials на клиенте и разрешить их на сервере.

await fetch("https://api.example.com/profile", {
  method: "GET",
  credentials: "include",
});

Практический риск простой. Если забыть credentials, пользователь будет выглядеть неавторизованным, хотя сессия есть. Не превращайте это в бесконечный retry. Покажите нормальное состояние ошибки или предложите войти заново после ответа 401. Если открыть CORS слишком широко, можно получить дыру в безопасности. Для запросов с credentials сервер не должен отвечать wildcard-значением Access-Control-Allow-Origin: *.

Какие флаги использовать вместе

Какой риск закрывает каждый флаг

Кража токена через XSSHttpOnly

Скрипт не прочитает значение cookie. Но сам XSS все равно надо исправлять, иначе скрипт сможет нажимать кнопки и отправлять запросы.

Отправка по HTTPSecure

Cookie не уйдет по незашифрованному соединению. Без этого токен можно перехватить в небезопасной сети.

Кросс-сайтовый запросSameSite

Ограничивает автоматическую отправку cookie с чужого сайта. Для чувствительных действий часто нужен еще CSRF-токен.

Область действияPath, Domain

Сужают, куда браузер отправляет cookie. Слишком широкий Domain повышает риск при проблемах на поддоменах.

На интервью полезно говорить не ставим все флаги и готово, а объяснять роль каждого флага. HttpOnly защищает от чтения cookie скриптом. Secure снижает риск перехвата в сети. SameSite помогает с кросс-сайтовой отправкой cookie.

Для auth-cookie обычно стоит начинать с максимально строгих настроек, а затем ослаблять их только под реальный сценарий. Например, интеграция с внешним доменом, SSO или платежный callback могут потребовать более аккуратной настройки SameSite.

Главная ловушка: XSS и CSRF разные угрозы

XSS это когда вредный JavaScript выполняется в вашем приложении. HTTPOnly не дает этому скрипту прочитать cookie, но скрипт все еще может кликать, отправлять формы, читать доступные данные со страницы и делать запросы из контекста пользователя.

CSRF это когда чужой сайт пытается заставить браузер пользователя отправить запрос к вашему сайту. Здесь проблема как раз в том, что cookie прикладывается автоматически. Поэтому HTTPOnly не является CSRF-защитой.

Сильный ответ на интервью показывает эту границу. Вы не обещаете невозможного, а называете правильный набор защит. Безопасный рендеринг, CSP, HttpOnly, Secure, SameSite, CSRF-токен или серверная проверка намерения пользователя.

Практический вывод для frontend

Если backend хранит авторизацию в HTTPOnly cookie, frontend должен строить UX вокруг серверного статуса, а не вокруг чтения токена. Например, после загрузки приложения можно запросить /me, получить профиль или 401, и по этому состоянию показать интерфейс. На время запроса показывайте отдельный loading state, чтобы не мигал приватный экран и не появлялся ложный logout.

Это также влияет на logout. Недостаточно удалить состояние в React. Нужно вызвать endpoint, который сбросит cookie через Set-Cookie с истекшим сроком или пустым значением. Иначе браузер продолжит отправлять старую cookie, если она еще действительна. После logout отмените или игнорируйте устаревшие запросы к профилю, чтобы поздний ответ не вернул пользователя в авторизованное состояние.

Еще один вывод: не храните копию чувствительного токена в localStorage для удобства. Так вы разрушаете смысл HTTPOnly и возвращаете риск кражи токена через XSS.

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

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

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

  1. 1

    Называть HTTPOnly полной защитой от XSS

    HttpOnly мешает украсть значение cookie через document.cookie, но не убирает вредный скрипт со страницы. Если XSS уже есть, скрипт может отправлять запросы от имени пользователя или читать данные из DOM. На интервью лучше сказать, что это слой защиты от кражи секрета, а не замена безопасному рендерингу и CSP.
  2. 2

    Забывать про CSRF

    Cookie автоматически прикладывается браузером к подходящим запросам. Это удобно для авторизации, но создает риск CSRF, если сервер принимает опасные действия без дополнительной проверки. Называйте SameSite, CSRF-токен или другой серверный механизм защиты.
  3. 3

    Пытаться прочитать токен в SPA

    Если cookie помечена как HttpOnly, frontend не увидит ее значение. Код, который строит заголовок Authorization из такой cookie, просто не сможет работать. В UI это часто превращается в вечный loading, лишние повторы запроса или ложный logout. В такой схеме запросы отправляют с cookie, а сервер сам проверяет сессию.
  4. 4

    Не проектировать состояние авторизации вокруг 401

    При HTTPOnly cookie клиент узнает о сессии по ответу сервера, а не по наличию токена в JavaScript. Если не обработать loading, 401 и ошибку сети отдельно, пользователь увидит мигание приватного UI, бесконечный спиннер или неверное сообщение "вы вышли" при временном сбое.
  5. 5

    Ставить HttpOnly без Secure в production

    Без Secure cookie может уйти по HTTP, если приложение или окружение допустит незашифрованный запрос. Это открывает риск перехвата секрета в сети. Для production чувствительные cookie должны отправляться только по HTTPS.
  6. 6

    Делать слишком широкие Domain и Path

    Широкая область действия заставляет браузер отправлять cookie туда, где она не нужна. Если один поддомен уязвим, риск для общей cookie становится выше. Лучше ограничивать Domain и Path минимально нужной областью.

Follow-up

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

Короткие ответы на вопросы, которыми проверяют понимание cookie, XSS, CSRF и авторизации в SPA.

Живые ответы

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

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

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

Содержание