В чем разница между localStorage и cookies и почему localStorage безопаснее?
Что проверяют
Заметите ли вы, что посылка в вопросе неверна. localStorage не безопаснее, и хороший ответ начинается именно с этого.
Как отвечать
Сначала фактические отличия:
- объём: cookie около 4 КБ,
localStorage5-10 МБ; - передача: cookie автоматически уходят на сервер с каждым запросом к домену,
localStorageне уходит никуда, пока его не отправят из кода; - время жизни: у cookie есть срок и они могут быть сеансовыми,
localStorageживёт до явного удаления; - доступ из кода:
localStorageвиден любому скрипту на странице, cookie с флагомHttpOnlyиз JavaScript не читается вовсе; - интерфейс: у
localStorageпростой API, cookie это одна строка, которую разбирают вручную.
Теперь про безопасность. Утверждение «localStorage безопаснее» неверно. При межсайтовом скриптинге любой чужой скрипт читает localStorage целиком, включая токен, и уносит его. Cookie с HttpOnly в том же сценарии не читается.
У cookie своя слабость: они уходят автоматически, поэтому возможна подделка межсайтового запроса. Лечится флагом SameSite и токеном формы.
Практический вывод: токен сессии надёжнее держать в cookie с HttpOnly, Secure и SameSite. localStorage хорош для того, что не является секретом: настройки интерфейса, черновики, выбранная тема.
Где спотыкаются
Повторяют миф из вопроса, не разобравшись.
Не знают про HttpOnly.
Хранят токен доступа в localStorage и не могут объяснить риск.
Забывают, что обращение к хранилищу может бросить исключение в приватном окне или при отключённых данных сайта.