Карта / Аутентификация / Логин, сессия, cookie

Логин, сессия, cookie

Аутентификация — ответ на вопрос «кто ты?» Авторизация — «что тебе можно?». Это разные вещи, хотя часто путают.

Как работает вход через сессии:

  1. Пользователь вводит логин/пароль — сервер проверяет.
  2. Если всё ок — создаёт сессию в памяти (или в Redis/БД) и выдаёт клиенту session ID.
  3. Браузер сохраняет session ID в cookie и автоматически отправляет при каждом следующем запросе.
  4. Сервер по session ID находит данные о пользователе.
POST /login  →  Set-Cookie: JSESSIONID=abc123
GET /profile →  Cookie: JSESSIONID=abc123  →  сервер находит сессию, знает кто ты

Cookie — небольшой фрагмент текста, который браузер хранит и автоматически прикладывает к запросам к тому же домену. Ключевые атрибуты безопасности:

  • HttpOnly — JavaScript не может читать cookie (защита от XSS)
  • Secure — передаётся только по HTTPS (не по HTTP)
  • SameSite=Strict — не отправляется в запросах с других сайтов (защита от CSRF)
Копнуть глубже

Сессия на сервере vs токен у клиента. Классический подход — сессия хранится на сервере: при каждом запросе сервер ищет сессию по ID (в памяти, в Redis, в базе). Это означает состояние на стороне сервера: при масштабировании на несколько серверов нужно либо sticky sessions (один пользователь всегда попадает на один сервер), либо общее хранилище сессий (Redis). JWT (см. тему «Access / refresh») решает эту проблему по-другому: весь контекст хранится в токене у клиента.

CSRF-атака и почему SameSite важен. Если злоумышленник заставит ваш браузер открыть страницу evil.com, которая делает POST-запрос на bank.com/transfer, браузер автоматически приложит cookie сессии к этому запросу. SameSite=Strict не даёт браузеру отправлять cookie в запросах, инициированных с другого домена, — это полная защита от CSRF. SameSite=Lax (по умолчанию в современных браузерах) разрешает GET-запросы между сайтами, но блокирует POST.

Где Spring управляет сессиями. В Spring Security сессии создаются автоматически при успешном логине через form login (см. тему «Form login, роли»). SecurityContextHolder хранит контекст безопасности текущего запроса. Для stateless API с JWT сессии отключают явно: sessionManagement().sessionCreationPolicy(STATELESS).

🎤 Закрыл тему, если можешь объяснить:
• что такое сессия и как cookie её идентифицирует;
• зачем атрибуты HttpOnly, Secure и SameSite на cookie (если дошёл до 2-го слоя).