Механизм работы сессии основан на сохранении состояния пользователя между HTTP-запросами, которые по своей сути stateless. Это достигается за счет использования уникального идентификатора сессии.
Основные шаги:
- Первый запрос пользователя: Пользователь отправляет запрос на веб-сервер.
- Создание сессии: Если запрос от неизвестного пользователя (у него нет идентификатора сессии), сервер создает новую сессию на своей стороне (в памяти, базе данных, файловой системе) и генерирует уникальный идентификатор сессии.
- Отправка идентификатора клиенту: Сервер отправляет этот идентификатор сессии клиенту в виде cookie (
Set-Cookie: SESSIONID=xyz; path=/).
- Сохранение на клиенте: Браузер сохраняет эту cookie и отправляет ее со всеми последующими запросами на тот же домен (
Cookie: SESSIONID=xyz).
- Идентификация на сервере: При получении каждого последующего запроса с cookie, содержащей идентификатор сессии, сервер использует этот идентификатор для поиска соответствующей сессии и получения сохраненных данных пользователя.
- Завершение сессии: Сессия может завершиться по таймауту неактивности, при явном выходе пользователя (logout), или при закрытии браузера (если cookie сессии не имеет срока годности).
Пример использования сессии для хранения авторизационной информации:
java
Хранилища сессий:
- В памяти сервера (подходит для небольших приложений).
- В файловой системе сервера.
- В базе данных (классический вариант, масштабируемый).
- В распределенных кэшах (Redis, Memcached) для масштабирования на несколько серверов.
Безопасность:
- Использование "secure" и "HttpOnly" флагов для cookie сессии.
- Регенерация ID сессии после успешной аутентификации.
- Установка адекватного таймаута сессии.
- Защита от Session Hijacking (перехвата идентификатора сессии).