Sobes.tech
Назад к вопросам
Junior — Middle
43

Что отличает стандартный токен аутентификации от JSON Web Token (JWT)?

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

Стандартный токен — это обычно просто случайная строка-идентификатор, которая хранится на сервере и по которой сервер находит сессию или данные пользователя. JWT — это самодостаточный токен с зашифрованно-подписанной структурой, в которой можно хранить claims и проверять их без обращения к базе сессий. Главное отличие — JWT обычно stateless, а обычный токен часто требует серверного хранилища состояния.

Определение:

Обычный токен аутентификации — это opaque token, то есть «непрозрачный» идентификатор: клиент передает его, а сервер сверяет с тем, что хранит у себя. JWT (JSON Web Token) — это компактный токен в формате header.payload.signature, где payload содержит набор утверждений о пользователе или контексте, а подпись позволяет проверить целостность и подлинность токена.

Пример использования:

Обычный токен удобно использовать в классической сессионной схеме: после логина сервер выдает случайный токен, сохраняет его в Redis или БД, а затем на каждом запросе ищет сессию по этому значению. JWT чаще используют в API и микросервисах, когда нужно проверять пользователя без постоянного обращения к хранилищу сессий.

# Пример концептуально: обычный токен как ключ к серверной сессии
sessions = {
    "abc123": {"user_id": 42, "role": "admin"}
}

token = "abc123"
session = sessions.get(token)

if session:
    print("Пользователь аутентифицирован:", session["user_id"])
else:
    print("Токен недействителен")

Пояснение кода:

Код показывает принцип работы обычного токена, поэтому JWT здесь не требуется. Сначала сервер хранит словарь активных сессий, где ключ — токен, а значение — данные пользователя. Затем пришедший от клиента токен используется как ключ для поиска. Если запись найдена, пользователь считается аутентифицированным; если нет — токен недействителен или истек. Для JWT логика была бы другой: сервер проверял бы подпись токена и извлекал данные из payload без поиска записи в хранилище сессий.

Ключевые моменты:

  • Обычный токен обычно является случайным идентификатором без встроенных данных.
  • JWT содержит данные и подпись, поэтому его можно проверять без серверной сессии.
  • JWT удобен для распределенных систем, но сложнее в отзыве до истечения срока жизни.
  • Обычный токен проще централизованно инвалидировать: достаточно удалить запись на сервере.
  • JWT не означает шифрование: payload обычно можно прочитать, если он не зашифрован отдельно.
  • Выбор зависит от задачи: сессии и контроль отзыва — чаще обычный токен, масштабирование и stateless-подход — чаще JWT.