Что такое сессия?
Сессия (session) — механизм сохранения состояния взаимодействия пользователя с сервером на протяжении нескольких HTTP-запросов, компенсирующий stateless-природу протокола HTTP.
Аналогия из жизни: сессия — это как номерок в гардеробе. Вы сдали пальто (данные), получили номерок (session ID). При следующем обращении предъявляете номерок, и гардеробщик (сервер) находит ваше пальто (данные).
Сессия начинается при первом запросе пользователя и завершается при явном выходе (logout), по истечении тайм-аута бездействия (обычно 30 минут) или при обрыве связи. Данные сессии хранятся на сервере, а клиент хранит только идентификатор сессии (session ID), обычно в cookie.
Как работает сессия
- Клиент отправляет первый запрос на сервер
- Сервер создаёт объект сессии и генерирует уникальный session ID
- Session ID отправляется клиенту в cookie (
JSESSIONIDв Java) - При каждом следующем запросе браузер автоматически отправляет session ID
- Сервер находит объект сессии по ID и восстанавливает контекст пользователя
Где хранятся данные сессии
| Хранилище | Плюсы | Минусы |
|---|---|---|
| In-memory (JVM Heap) | Быстро, просто | Теряется при рестарте, не масштабируется |
| Redis / Memcached | Масштабируется, переживает рестарт | Сетевые задержки |
| БД | Персистентность | Медленнее всего |
| JWT-токен (клиент) | Stateless, масштабируется | Нельзя отозвать до истечения, размер |
В Spring-приложениях сессиями управляет HttpSession, а для распределённых систем — Spring Session с Redis-бэкендом.
На собеседовании: объясните связь между сессией и cookies: cookie хранит только session ID, а данные — на сервере. Частый вопрос: «Что будет, если пользователь отключил cookies?» — session ID можно передавать через URL-rewriting, но это менее безопасно.