Ответ вслух Middle Безопасность фронтенда спрашивают часто обновлено

Где хранить токен авторизации

Вопрос

Где хранить токен авторизации на фронтенде: в cookie или в localStorage? Объясни плюсы и минусы.

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

У обоих вариантов разные угрозы. localStorage читается любым JavaScript на странице, поэтому любая XSS сразу уносит токен, и атакующий может пользоваться им со своей машины. Зато браузер сам его никуда не прикладывает, и CSRF не работает.

Что должно прозвучать в ответе

  • localStorage доступен любому скрипту страницы, при XSS токен украдут

  • Токен в localStorage браузер сам не отправляет, поэтому CSRF ему не страшен

  • HttpOnly-кука не читается из JS, но автоматически отправляется, нужна защита от CSRF

  • Защита куки: HttpOnly, Secure, SameSite Lax или Strict, плюс CSRF-токен или проверка Origin

  • Частый компромисс: короткий access-токен в памяти, refresh-токен в HttpOnly-куке

  • XSS опасен в любом случае: он может делать запросы от имени пользователя

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

  • Если токен в памяти, что будет при перезагрузке страницы?
  • Зачем ротировать refresh-токен?
  • Как SameSite влияет на сценарий, когда фронт и API на разных поддоменах?

Разбор

У обоих вариантов разные угрозы. localStorage читается любым JavaScript на странице, поэтому любая XSS сразу уносит токен, и атакующий может пользоваться им со своей машины. Зато браузер сам его никуда не прикладывает, и CSRF не работает. Кука с HttpOnly недоступна скрипту, её нельзя украсть через XSS, но браузер прикладывает её автоматически, значит нужна защита от CSRF: SameSite Lax или Strict, Secure и для чувствительных действий CSRF-токен или проверка Origin. На практике я выбираю схему с коротким access-токеном в памяти приложения и refresh-токеном в HttpOnly-куке с ротацией. При этом помню, что XSS остаётся опасной в любой схеме: внедрённый скрипт может действовать от имени пользователя прямо в его браузере, поэтому базовая защита это не допускать XSS.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме