Что происходит после успешной аутентификации по логину и паролю?

«Что происходит после успешной аутентификации по логину и паролю?» — вопрос из категории Безопасность, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Два основных подхода:

1. Сессии (Stateful)

  • На сервере создается запись сессии (часто в Redis или Memcached) с идентификатором пользователя и метаданными.
  • Клиенту отправляется Session ID (обычно в cookie JSESSIONID).
  • При каждом запросе сервер проверяет ID сессии в хранилище.

2. Токены (Stateless, например, JWT)

  • Сервер генерирует JSON Web Token (JWT), содержащий закодированные данные (claims) о пользователе.
  • Токен подписывается секретным ключом (HMAC) или парой ключей (RSA).
  • Клиент хранит токен (часто в localStorage) и отправляет его в заголовке Authorization: Bearer <token>.

Пример генерации JWT (с использованием библиотеки jjwt):

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;

// После проверки пароля
String username = "user123";
String secret = "your-strong-secret-key";

String token = Jwts.builder()
    .setSubject(username) // Основной claim
    .setIssuedAt(new Date()) // Время выдачи
    .setExpiration(new Date(System.currentTimeMillis() + 86400000)) // Срок действия (24 часа)
    .signWith(SignatureAlgorithm.HS512, secret) // Алгоритм подписи и ключ
    .compact();

// Отправка токена клиенту (например, в теле JSON-ответа)
// {"token": "eyJhbGciOiJIUzUxMiJ9..."}

Последующие запросы: Сервер проверяет подпись и срок действия токена. Если проверка не пройдена, возвращается статус 401 Unauthorized. Для сессий — проверяется их актуальность в хранилище.