Отправляются ли данные из localStorage на сервер при HTTP-запросах
Что проверяют
Понимаете ли вы разницу между cookie и Web Storage и какие последствия у этой разницы для авторизации. Вопрос простой по форме, но по ответу видно, знает ли кандидат, почему токен в одном месте уязвим к XSS, а в другом к подделке межсайтового запроса.
Как отвечать
Нет, не отправляются. Браузер сам ничего не добавляет в запрос из localStorage: ни в fetch, ни в XMLHttpRequest, ни при переходе по ссылке, ни при загрузке картинки. Если данные нужны серверу, их читают вручную и кладут в заголовок или тело запроса.
Дальше стоит сравнить с cookie:
- cookie браузер прикрепляет к каждому подходящему по домену и пути запросу автоматически, включая запросы, инициированные другим сайтом. Отсюда и CSRF, и атрибут
SameSiteкак защита от него; localStorageпривязан к источнику, то есть к схеме, хосту и порту, хранит только строки, синхронен и живёт до явной очистки.sessionStorageустроен так же, но живёт в пределах вкладки;- токен в
localStorageчитает любой скрипт на странице, включая стороннюю зависимость, поэтому один XSS означает угон токена. Кука сHttpOnlyиз JavaScript не читается, но требует отдельной защиты от подделки запроса.
Вывод, который ждут: выбор здесь не про то, что безопаснее вообще, а про то, от какой атаки защищаемся и чем за это платим.
Где спотыкаются
Говорят, что localStorage безопаснее куки, раз он не уходит на сервер сам. Отсутствие автоотправки это не защита: хранилище доступно любому коду на странице, и при внедрении скрипта содержимое утекает целиком, вместе с тем, что туда клали на всякий случай.
Второе: забывают про ограничения хранилища. Квота порядка нескольких мегабайт на источник, при переполнении и в некоторых приватных режимах запись бросает исключение, а сериализация крупного объекта на каждое изменение блокирует главный поток, потому что интерфейс синхронный.
Третье: читают localStorage при серверном рендеринге. На сервере такого объекта нет, и код либо падает, либо даёт расхождение разметки: сервер отрисовал одно, клиент после гидратации другое. Значение читают уже после монтирования компонента.