Аутентификация на основе куков

Аутентификация на основе куков #

Васильев Андрей Михайлович, 2025

Версии презентации


Куки в протоколе HTTP #

HTTP cookie — это небольшой фрагмент данных, отправляемый сервером на браузер пользователя, который может сохранить и отсылать обратно с новым запросом к серверу

Используются в веб-приложениями для:

  • Управления сеансами пользователя, аутентификации
  • Персонализации содержимого передаваемых документов
  • Мониторинга поведения пользователя

diagram


Заголовки Set-Cookie и Cookie #

Заголовки Set-Cookie устанавливаются сервером в рамках своего ответа

Простой заголовок может выглядит так:

Set-Cookie: <имя cookie>=<значение cookie>

Таких заголовков в ответе сервера может быть несколько:

Set-Cookie: yummy_cookie=choco
Set-Cookie: tasty_cookie=strawberry

Браузер будет передавать их клиенту в рамках заголовка Cookie:

Cookie: yummy_cookie=choco; tasty_cookie=strawberry

От клиента на сервер будут переданы все куки, которые соответствуют пути запроса документа от веб-браузера


Время жизни куков #

  • Сессионные cookie удаляются при закрытии клиента, то есть существуют только на протяжении текущего сеанса
    • Правила завершения сеанса определяет разработчик веб-браузера
    • Сеанс может длится бесконечно (невообразимо долго)
  • Постоянные cookie удаляются не по завершении сессии, а при наступлении определённого интервала времени, например:
Set-Cookie: id=5aoeu; Expires=Wed, 20 Nov 2010 10:15:00 GMT;

Пользователь может удалить или установить куки на стороне клиента самостоятельно


Безопасность HTTP куков #

  • Данные передаются в открытом виде, для защиты нужно использовать SSL-шифрование
  • Для защиты данных куки от доступа из контекста кода на JavaScript, необходимо использовать атрибут HttpOnly
  • Можно явно указать доменные имена, с которых будет доступна информация с помощью атрибутов Domain и пути с помощью Path
  • «Раздражающее» сообщение о куках необходимо по законодательству стран сообщать пользователю об их использовании веб-приложением и их назначением
  • Многие JavaScript-библиотеки добавляют свои куки, чтобы следить за пользователем

Аутентификация по имени и паролю #

Нет строгого стандарта (RFC), который определял бы процедуру авторизации с использованием формы, каждый разработчик может реализовать логику самостоятельно

Ключевая задача — сформировать токен аутентификации и сохранить его в куки

diagram

Следующие запросы будут выполнять аутентификацю по токену из куков


Сложности аутентификации по паролю #

  • Что делать, если злоумышленник получил доступ к кукам конкретного пользователя?
    • Необходимо реализовывать систему отзыва всех ранее выданных токенов
    • Для смены пароля учётной записи необходимо как минимум запрашивать текущий пароль
  • Что делать с пользователем, который постоянно выполняет процедуру получения нового токена?
    • Необходимо внедрять системы защиты от DoS-атак
    • Количество токенов, выданных для конкретного пользователя должно быть ограничено
  • Как упростить жизнь пользователю корпоративных систем, чтобы он один вводил пароль один раз (и не записывал его на бумажке у компьютера)?

Для решения этих задач процедуру аутентификации делегируют единой системе, а другие приложения интегрируются с ней с помощью протоколов OpenID Connect и OAuth 2.0

© A. M. Васильев, 2025, CC BY-SA 4.0, andrey@crafted.su