Ответ
Основное различие заключается в том, где хранится состояние и информация.
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) | Легко (удалить из БД) |
Масштабируемость | Легко, не требует общей БД сессий | Сложнее, требует общего хранилища сессий |