Интервью-вопрос
Что такое HTTPOnly cookie
HTTPOnly cookie нельзя прочитать через JavaScript, но браузер продолжает отправлять ее в HTTP-запросах. На практике это снижает риск кражи токена при XSS, но не заменяет защиту от XSS, CSRF и перехвата по сети.
- Добавлен
- Редакция
Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.
Мини-квиз
Проверка перед разбором
Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.
Вопрос 1 из 50 правильно
Разбор
Разобраться, а не зазубрить
Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.
Базовая идея
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
Рассмотрите HttpOnly cookie с короткой областью действия и ротацией.Добавьте Secure. Для production это почти всегда обязательное правило.Выберите SameSite осознанно и проверьте CSRF-защиту.Настройте 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: *.
Какие флаги использовать вместе
Какой риск закрывает каждый флаг
HttpOnlyСкрипт не прочитает значение cookie. Но сам XSS все равно надо исправлять, иначе скрипт сможет нажимать кнопки и отправлять запросы.
SecureCookie не уйдет по незашифрованному соединению. Без этого токен можно перехватить в небезопасной сети.
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
Называть HTTPOnly полной защитой от XSS
HttpOnly мешает украсть значение cookie черезdocument.cookie, но не убирает вредный скрипт со страницы. Если XSS уже есть, скрипт может отправлять запросы от имени пользователя или читать данные из DOM. На интервью лучше сказать, что это слой защиты от кражи секрета, а не замена безопасному рендерингу и CSP. - 2
Забывать про CSRF
Cookie автоматически прикладывается браузером к подходящим запросам. Это удобно для авторизации, но создает риск CSRF, если сервер принимает опасные действия без дополнительной проверки. НазывайтеSameSite, CSRF-токен или другой серверный механизм защиты. - 3
Пытаться прочитать токен в SPA
Если cookie помечена какHttpOnly, frontend не увидит ее значение. Код, который строит заголовокAuthorizationиз такой cookie, просто не сможет работать. В UI это часто превращается в вечный loading, лишние повторы запроса или ложный logout. В такой схеме запросы отправляют с cookie, а сервер сам проверяет сессию. - 4
Не проектировать состояние авторизации вокруг 401
При HTTPOnly cookie клиент узнает о сессии по ответу сервера, а не по наличию токена в JavaScript. Если не обработатьloading,401и ошибку сети отдельно, пользователь увидит мигание приватного UI, бесконечный спиннер или неверное сообщение "вы вышли" при временном сбое. - 5
Ставить HttpOnly без Secure в production
БезSecurecookie может уйти по HTTP, если приложение или окружение допустит незашифрованный запрос. Это открывает риск перехвата секрета в сети. Для production чувствительные cookie должны отправляться только по HTTPS. - 6
Делать слишком широкие Domain и Path
Широкая область действия заставляет браузер отправлять cookie туда, где она не нужна. Если один поддомен уязвим, риск для общей cookie становится выше. Лучше ограничиватьDomainиPathминимально нужной областью.
Follow-up
Что могут спросить дальше
Короткие ответы на вопросы, которыми проверяют понимание cookie, XSS, CSRF и авторизации в SPA.
Живые ответы
Видео с похожим вопросом
Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.
Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.
С какими системами авторизации работал 😎
На такой вопрос лучше отвечать через реальный опыт, схему входа, хранение токенов и обработку ошибок. Разбираем, как не звучать общо и показать понимание рисков безопасности на фронтенде.
Какие тесты вы писали 😎
Сильный ответ показывает не список инструментов, а какие риски вы закрывали тестами. Разбираем, как говорить про unit, интеграционные и e2e тесты без выдуманного опыта.