1.5. Управление сессиями (Session management)

Сессионное управление в веб-технологиях — это процесс управления состоянием пользователя на веб-сайте. Когда пользователь заходит на сайт, ему автоматически присваивается уникальный идентификатор сессии. Этот идентификатор используется для отслеживания активности пользователя на сайте, сохранения его настроек и данных формы, а также для обеспечения безопасности.

В современных веб приложениях идентифицировать и отслеживать пользователей является очень важной задачей. Например, представим себе интернет-магазин, где пользователь добавляет товары в корзину. Информация о товарах сохраняется в сессии пользователя, пока он не завершит покупку. Если пользователь закроет браузер и затем вернется на сайт, информация о добавленных товарах все еще будет доступна в его сессии.

Однако протокол HTTP является протоколом без сохранения состояния, то есть он не запоминает ни пользователя, ни устройства, на котором работает пользователь. Поэтому для идентификации пользователей и сессий применялись следующие методы:

  • HTTP заголовки
    • From
    • User-Agent
    • Referer
    • Client-ip
    • X-Forwarded-For
  • Fat URL
  • Авторизация пользователей
  • Идентификаторы/Токены сессий в заголовках Cookie и скрытых формах

Теперь обо всем по порядку.

Перечисленные HTTP заголовки определенным образом позволяли идентифицировать пользователей. В качестве идентификаторов выступали IP адрес отправителя, его email, тип браузера и операционной системы. однако они были ненадежными и неуникальными. В настоящее время данный способ не используется.

Fat URL содержат в себе уникальный идентификатор, который генерируется сервером для каждого пользователя. Такие URL выглядят следующим образом: https://example.com/documents/002-1145265-8016838.

Все действия пользователей отслеживаются и запоминаются сервером, однако данный способ также не лишен недостатков, поэтому в настоящее время хоть и используется, но редко.

Авторизация пользователей – это еще один способ управления сессиями. Дело в том, что HTTP поддерживает встроенные механизмы авторизации с помощью заголовков WWW-Authenticate, Authorization. При этом в окне браузера появляется окно для ввода логина и пароля. Принцип работы представлен ниже на рисунке:

Принцип работы авторизации на сайте

При последующих обращениях к ресурсам сервера приходится заново авторизоваться, однако браузеры могут запомнить логин и пароль и автоматически подставлять их в запросы серверу. Такой способ также крайне неудобен и в настоящее время используется очень редко.

Самым распространенным и хорошо себя зарекомендовавшим методом является управление сессиями через заголовки Set-Cookie и Cookie.

Принцип довольно прост. Сервером генерируется уникальный идентификатор или токен, который передается клиенту. Клиент в свою очередь сохраняет токен и передает его серверу во всех запросах. Сервер, получив токен от клиента, проверяет его по базе данных и таким образом «узнаёт» пользователя:

Принцип работы Cookie на сайте

Куки могут быть сессионными (временными) и постоянными. Временные куки действительны пока открыта вкладка сайта в браузере, после чего они удаляются. Постоянные куки сохраняются даже после закрытия браузера и перезагрузки системы. Именно эти куки используются для идентификации пользователей, поэтому пользователям не нужно повторно вводить логин и пароль при посещении сайта.

На рисунке ниже представлена структура заголовков Set-Cookie и Cookie:

Структура Cookie

Как вы заметили куки имеют специальные атрибуты. Опишем вкратце, что они означают.

  • - 'Name' и 'Value' — имя и значение куки
  • - 'Expires' — дата истечения срока действия куки
  • - 'Domain' — домен, который может использовать куки
  • - 'Path' — путь на сервере, на который должен быть отправлен куки
  • - 'Secure' — указывает, что куки должны использоваться только при использовании безопасного протокола HTTPS
  • - 'HttpOnly' — указывает, что куки должны использоваться только внутри HTTP-заголовков и недоступны из JavaScript

Мы еще вернемся к более подробному рассмотрению данных атрибутов, когда будем изучать некоторые виды атак и способы защиты от них.

Также в качестве идентификаторов используются скрытые HTML формы, которые содержат специальные токены. То есть здесь уже не используются стандартные HTTP заголовки. Вместо этого идентификаторы передаются в теле ответа в HTML коде, причем значения токенов скрыты от пользователей. В большинстве случаев они используется для защиты от атак типа CSRF.