Аутентификация на основе куков
#
Васильев Андрей Михайлович, 2025
Версии презентации
Куки в протоколе HTTP
#
HTTP cookie — это небольшой фрагмент данных, отправляемый сервером на браузер пользователя, который может сохранить и отсылать обратно с новым запросом к серверу
Используются в веб-приложениями для:
- Управления сеансами пользователя, аутентификации
- Персонализации содержимого передаваемых документов
- Мониторинга поведения пользователя
Заголовки 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), который определял бы процедуру авторизации с использованием формы, каждый разработчик может реализовать логику самостоятельно
Ключевая задача — сформировать токен аутентификации и сохранить его в куки
Следующие запросы будут выполнять аутентификацю по токену из куков
Сложности аутентификации по паролю
#
- Что делать, если злоумышленник получил доступ к кукам конкретного пользователя?
- Необходимо реализовывать систему отзыва всех ранее выданных токенов
- Для смены пароля учётной записи необходимо как минимум запрашивать текущий
пароль
- Что делать с пользователем, который постоянно выполняет процедуру получения
нового токена?
- Необходимо внедрять системы защиты от DoS-атак
- Количество токенов, выданных для конкретного пользователя должно быть
ограничено
- Как упростить жизнь пользователю корпоративных систем, чтобы он один вводил пароль один раз (и не записывал его на бумажке у компьютера)?
Для решения этих задач процедуру аутентификации делегируют единой системе, а
другие приложения интегрируются с ней с помощью протоколов OpenID Connect и
OAuth 2.0