Понимание cookies

Cookies — небольшие текстовые файлы, сохраняемые браузером от имени веб-сайта. Это основной механизм поддержания состояния в stateless-протоколе HTTP.

Атрибуты cookies

АтрибутНазначениеВлияние на безопасность
Name=ValueХранимые данныеНе должны содержать чувствительные данные в открытом виде
DomainКакой домен может обращатьсяCookie для .example.com доступна sub.example.com
PathКакой URL-путь может обращатьсяCookie /admin не отправляется для /public
Expires/Max-AgeКогда истекаетСессионные cookies истекают при закрытии браузера
SecureТолько по HTTPSПредотвращает передачу без шифрования
HttpOnlyНедоступна JavaScriptЗащищает от кражи через XSS
SameSiteУправляет кросс-сайтовой отправкойStrict, Lax или None — предотвращает CSRF

Тестирование атрибутов cookies

Откройте DevTools > Application > Cookies и проверьте каждую cookie:

  1. Cookies аутентификации должны иметь флаги Secure, HttpOnly и SameSite
  2. Сессионные cookies не должны иметь длинный Expires/Max-Age
  3. Domain должен быть максимально ограничительным
  4. Path должен быть ограничен соответствующим разделом

Типы cookies

Сессионные cookies: Без даты истечения. Удаляются при закрытии браузера. Для временной аутентификации.

Постоянные cookies: С датой истечения. Переживают перезапуск браузера. Для «Запомнить меня» и настроек.

Сторонние cookies: От других доменов. Для отслеживания и рекламы. Всё чаще блокируются.

Механизмы клиентского хранения

localStorage

  • Пары ключ-значение как строки
  • Сохраняется до явной очистки
  • Приблизительно 5-10 МБ на источник
  • Доступен любому JavaScript на том же источнике
  • НЕ защищён от XSS

sessionStorage

  • Тот же API, что у localStorage
  • Ограничен вкладкой — не делится между вкладками
  • Очищается при закрытии вкладки

IndexedDB

  • Полноценная база данных в браузере
  • Структурированные данные, файлы и блобы
  • Значительно больший объём (сотни МБ)
  • Асинхронный API
  • Используется PWA для офлайн-хранения

Тестирование механизмов хранения

Для каждого механизма проверьте:

  1. Данные корректно сохраняются после действий пользователя
  2. Данные корректно извлекаются при загрузке страницы
  3. Приложение обрабатывает отсутствующие или повреждённые данные
  4. Ограничения хранилища обрабатываются правильно
  5. Очистка данных браузера удаляет ожидаемые элементы
  6. Корректное поведение в режиме инкогнито

Жизненный цикл сессии

Вход → Сессия создана → Активное использование → Предупреждение о таймауте →
Сессия истекла → Повторная аутентификация → Сессия восстановлена/новая

Тестирование жизненного цикла

  1. Создание: После входа проверить cookie с правильными атрибутами
  2. Поддержание: Сессия должна обновляться при активности
  3. Предупреждение: Перед истечением показать предупреждение с возможностью продления
  4. Истечение: После таймаута перенаправить на вход
  5. Повторная аутентификация: После повторного входа восстановить контекст
  6. Уничтожение: После выхода сессия инвалидируется на сервере

Продвинутое тестирование cookies и сессий

Тестирование кросс-доменных cookies

Когда приложение охватывает несколько поддоменов:

  • Корректно ли делятся cookies между поддоменами?
  • Может ли cookie одного поддомена мешать другому?
  • Корректно ли работают ограничения SameSite для кросс-доменных API-вызовов?

Ограничения размера cookies

Браузеры ограничивают cookies ~4 КБ на cookie и 20-50 на домен:

  • Что происходит при достижении ограничения?
  • Добавление новой cookie молча не удаётся или вызывает ошибку?

Тестирование квоты хранилища

  1. Заполните localStorage до предела через консоль
  2. Попробуйте добавить больше — обрабатывается ли QuotaExceededError?
  3. Показывается ли осмысленное сообщение?

Упражнение: Аудит безопасности хранилища

  1. Cookies: Список всех, проверка флагов безопасности
  2. Local Storage: Поиск чувствительных данных
  3. Session Storage: Проверка области видимости
  4. Удалите элементы вручную, проверьте восстановление
  5. Проверьте в режиме инкогнито
ХранилищеКлючСодержитПроблема?
Cookiesession_idТокен сессииОтсутствует HttpOnly
localStorageauth_tokenJWT-токенДолжен быть HttpOnly cookie

Предотвращение session fixation

  1. Запишите значение cookie сессии до входа
  2. Войдите с валидными данными
  3. Проверьте — значение должно измениться
  4. Если тот же ID — уязвимость session fixation

Ключевые выводы

  • Cookies — основной механизм состояния, всегда проверяйте флаги безопасности
  • HttpOnly предотвращает кражу через XSS; Secure — передачу в открытом виде; SameSite — CSRF
  • localStorage уязвим для XSS — никогда не храните там токены аутентификации
  • Тестируйте полный жизненный цикл сессии
  • Проверяйте ограничения и обработку квот хранилища
  • ID сессии должны меняться после входа