JWT (JSON Web Token) — это статeless токен, который не хранится на сервере, поэтому "выход из системы" (logout) не так прост, как при использовании сессий.
Как реализовать логику выхода из системы при использовании JWT для аутентификации?
JWT (JSON Web Token) — это статeless токен, который не хранится на сервере, поэтому "выход из системы" (logout) не так прост, как при использовании сессий.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
JWT (JSON Web Token) — это статeless токен, который не хранится на сервере, поэтому "выход из системы" (logout) не так прост, как при использовании сессий.
Основные подходы для реализации выхода из системы с JWT:
-
Черный список (Blacklist)
- Хранить на сервере список отозванных токенов.
- При каждом запросе проверять, не находится ли токен в черном списке.
- Минус: требует хранения и проверки токенов, что снижает преимущество stateless.
-
Короткий срок жизни токена + обновление (Refresh tokens)
- Выдавать JWT с небольшим временем жизни (например, 15 минут).
- При выходе просто удалять refresh token на клиенте, чтобы нельзя было получить новый JWT.
- Таким образом, после истечения срока действия токена пользователь будет вынужден заново аутентифицироваться.
-
Изменение секретного ключа или версии токена
- При выходе можно менять секретный ключ или версию токена, что сделает все старые токены недействительными.
- Подходит для систем с небольшим числом пользователей.
Пример простого варианта с коротким сроком жизни:
# При выходе просто удаляем токен на клиенте
# Сервер не хранит состояние
# Настройка JWT с коротким сроком жизни
jwt = create_access_token(identity=user_id, expires_delta=timedelta(minutes=15))
Таким образом, logout — это, по сути, удаление токена на клиенте и, при необходимости, реализация механизма отзыва токенов на сервере.