Можно ли читать cookies из клиентского JavaScript
Что проверяют
Знаете ли вы, что именно видно из браузерного кода, и понимаете ли, почему часть cookie невидима специально. Вопрос короткий, но за ним следует «а как вы поймёте, что пользователь вошёл», и вот там отваливается большинство.
Как отвечать
Да, через document.cookie, но с двумя оговорками. Видны только cookie текущего документа, подходящие по домену и пути, и только те, что не помечены HttpOnly. Сессионную cookie обычно как раз помечают, поэтому из кода её нет, и это не поломка, а защита от кражи сессии.
Вторая оговорка про формат. Свойство отдаёт одну строку из пар «имя, значение», разделённых точкой с запятой. Ни срока, ни пути, ни флагов там нет, и узнать их из JavaScript нельзя.
Разбор пишут аккуратно: делят по разделителю, затем по первому знаку равенства, имя сравнивают целиком, значение прогоняют через decodeURIComponent.
const raw = document.cookie
.split("; ")
.find((part) => part.startsWith("theme="));
const theme = raw && decodeURIComponent(raw.slice("theme=".length));Запись работает присваиванием: строка задаёт одну cookie и не затирает остальные, а удаление это установка истёкшего срока с теми же путём и доменом. Есть и современный асинхронный интерфейс хранилища cookie: он отдаёт объекты с атрибутами и уведомляет об изменениях, но поддержка пока неполная, и запасной путь нужен.
Про размер помните, что cookie уезжает на сервер с каждым запросом к домену, и объёмные данные держат в локальном хранилище, а не здесь.
Где спотыкаются
Определяют авторизацию наличием cookie. Если она с HttpOnly, код её не увидит и решит, что пользователь вышел, а если видит, значение подделывается из консоли за секунду. Источник истины это ответ сервера.
Разбирают строку наугад. Деление по всем знакам равенства ломает значения в Base64, а поиск подстроки находит нужное имя внутри другого, более длинного. Сравнивать имя надо целиком, от начала записи.
Забывают, что одноимённые cookie сосуществуют. Две записи с одним именем, но разными путями попадают в строку обе, различить их оттуда нельзя, и удаление без точного пути оставляет одну из них жить. Отсюда знаменитое «удалил, а она вернулась».