В чем разница между JWT и сессионным (непрозрачным) токеном?

Ответ

Основное различие заключается в том, где хранится состояние и информация.

JWT (JSON Web Token) — это самодостаточный токен. Он содержит всю необходимую информацию о пользователе (payload) в виде JSON, закодирован в Base64 и криптографически подписан. Серверу не нужно обращаться к базе данных для проверки токена, достаточно проверить подпись.

  • Структура: Состоит из трех частей, разделенных точками: Header.Payload.Signature.
  • Stateless: Сервер не хранит состояние токена, что упрощает масштабирование.
  • Отзыв: Отозвать JWT до истечения его срока жизни (поля exp) сложно. Обычно для этого используют черные списки (blocklist).

Сессионный (непрозрачный) токен — это просто случайная строка (например, UUID), которая служит идентификатором сессии. Сам по себе токен не несет никакой информации.

  • Stateful: Сервер хранит токен (или его хеш) в базе данных или в кэше (например, Redis) и связывает его с данными пользователя.
  • Проверка: При каждом запросе сервер должен найти токен в своем хранилище, чтобы проверить его валидность и получить данные пользователя.
  • Отзыв: Легко отозвать — достаточно удалить запись о токене из хранилища.

Пример генерации в Go:

// JWT: информация внутри токена
token := jwt.NewWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
    "user_id": 123,
    "roles":   []string{"user", "reader"},
    "exp":     time.Now().Add(time.Hour * 24).Unix(), // Срок жизни
})
signedToken, _ := token.SignedString([]byte("your-secret-key"))

// Непрозрачный токен: просто уникальный идентификатор
sessionToken := uuid.New().String()
// ...далее сохраняем sessionToken в Redis с user_id и TTL
ХарактеристикаJWTСессионный токен
Хранение данныхВ самом токене (клиент)На сервере (БД, кэш)
СостояниеStateless (без состояния)Stateful (с состоянием)
РазмерБольшеМеньше
БезопасностьНе хранить чувствительные данные в payloadДанные на сервере, безопаснее
Отзыв токенаСложно (нужен blocklist)Легко (удалить из БД)
МасштабируемостьЛегко, не требует общей БД сессийСложнее, требует общего хранилища сессий