Ответ
После проверки учетных данных сервер создает токен доступа или сессию, которая идентифицирует аутентифицированного пользователя для последующих запросов.
Два основных подхода:
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. Для сессий — проверяется их актуальность в хранилище.