JWT и OAuth2
JWT (JSON Web Token) — самодостаточный токен, который содержит информацию о пользователе прямо внутри себя, в отличие от сессионных куки (см. тему «Form login, роли»), где сервер хранит состояние сам.
Три части: header (алгоритм подписи), payload (данные — id пользователя, роли, срок действия), signature (подпись, чтобы никто не подделал содержимое).
// клиент отправляет токен в каждом запросе
GET /api/orders
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...
Сервер не хранит сессии — просто проверяет подпись токена и достаёт из него нужные данные. Это и называется stateless аутентификация — сервер ничего не “помнит” между запросами.
Копнуть глубже
JWT vs сессионные куки:
| Сессия + куки | JWT | |
|---|---|---|
| Где хранится состояние | на сервере | внутри самого токена |
| Масштабирование | нужна общая сессия между серверами (или sticky session) | любой сервер сам проверит токен, не нужно общее хранилище |
| Отзыв до истечения | просто — удалить сессию на сервере | сложнее — токен валиден, пока не истечёт (если не вести чёрный список) |
OAuth2 — протокол для делегирования доступа третьим лицам, классический пример — «Войти через Google». Пользователь логинится не на твоём сайте, а у Google, который выдаёт твоему серверу токен, подтверждающий личность пользователя, без передачи пароля от Google твоему приложению.
Access token и refresh token — разделение по времени жизни: короткоживущий access token (используется для запросов, истекает быстро — минимизирует ущерб при краже) и долгоживущий refresh token (используется только для получения нового access token, не для прямых запросов к API). Подробнее — в теме «Access / refresh».
• разницу JWT и сессионных куки, и идею OAuth2 (если дошёл до 3-го слоя).