В чем разница между куками, sessionStorage и localStorage
Что проверяют
Знаете ли вы не только объём и срок жизни, но и главное различие: куки уходят на сервер, а Web Storage живёт только в браузере. Следующий вопрос почти всегда про безопасность: где хранить токен авторизации и почему.
Как отвечать
Сравните три механизма по одним и тем же осям:
- куки: около 4 КБ на одну куку, браузер сам прикладывает их к каждому запросу на подходящий домен и путь. Срок задаётся
ExpiresилиMax-Age, без них кука сессионная. ФлагHttpOnlyпрячет её от JavaScript,Secureпускает только по HTTPS,SameSiteограничивает отправку с чужих сайтов; - localStorage: порядка 5 МБ на origin, данные живут, пока их не удалят, и общие для всех вкладок одного origin. Другие вкладки узнают об изменениях через событие
storage; - sessionStorage: тот же API и похожий лимит, но область видимости одна вкладка. Данные переживают перезагрузку страницы и исчезают при закрытии вкладки, соседняя вкладка того же сайта их не видит.
Общее у Web Storage: только строки, синхронный API в главном потоке, недоступность на сервере. Объекты сериализуют через JSON.stringify, а крупные или структурированные данные лучше класть в IndexedDB. Ещё деталь: куки привязаны к домену и не различают порты, а хранилище привязано к origin, то есть к схеме, хосту и порту вместе.
Про токены ответ такой: всё, что лежит в localStorage, прочитает любой скрипт на странице, поэтому XSS уносит токен целиком. Кука с HttpOnly от этого защищена, но открывает риск CSRF, который закрывают SameSite и CSRF-токен. Выбор между ними это выбор, от какой атаки вы защищаетесь в первую очередь.
Где спотыкаются
Говорят, что sessionStorage очищается при закрытии браузера. Граница его жизни это вкладка: закрыли вкладку, данные пропали, даже если браузер открыт.
Кладут объект напрямую через setItem, а потом достают строку [object Object].
Считают localStorage надёжным хранилищем. Пользователь чистит данные сайта, приватный режим стирает их после сессии, а Safari может удалить записанное скриптом после семи дней без визитов на сайт.