Можно ли получить доступ к localStorage с другого домена
Что проверяют
Знаете ли вы, что такое origin, и отличаете ли изоляцию хранилища от правил доступа к сетевым ресурсам. Половина кандидатов начинает рассказывать про заголовки CORS, которые к хранилищу отношения не имеют вовсе.
Как отвечать
Нет. Хранилище привязано к origin, а origin это тройка: схема, хост, порт. Разный протокол, поддомен или порт означают разное хранилище. Обратиться к чужому напрямую нельзя даже не из-за запрета, а потому что такого API не существует: объект localStorage всегда принадлежит текущей странице.
Легальный способ обмена ровно один: владелец домена сам отдаёт данные. На своей странице вы встраиваете его фрейм, внутри фрейма работает его код, читает своё хранилище и отвечает сообщением. Обе стороны обязаны проверять источник:
window.addEventListener("message", (e) => {
if (e.origin !== "https://trusted.example") return;
handle(e.data);
});Тут же уместна оговорка, которая отличает подготовленного кандидата: современные браузеры разделяют хранилище стороннего фрейма по сайту верхнего уровня, поэтому старая схема с общим доменом-хранилищем на несколько проектов в общем случае больше не работает.
Где спотыкаются
Путают хранилище с куками. У куки видимость задаётся атрибутом домена, она общая для поддоменов и сама уезжает на сервер с каждым запросом. Хранилище так не умеет, зато и трафик не раздувает.
Второе: считают его безопасным местом для токена. Это обычный синхронный API, доступный любому скрипту на странице, поэтому одна найденная дыра с внедрением кода выносит токен целиком. Куку с признаком HttpOnly скрипт прочитать не может.
Третье: поднимают фрейм-посредник и не проверяют источник сообщения в обработчике. Получается открытый шлюз: любой сайт встраивает тот же фрейм и просит отдать данные, а тот честно отдаёт.