← Назад к вопросам

Что такое JWT-токен?

1.6 Junior🔥 202 комментариев
#Безопасность

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое JWT-токен?

JWT (JSON Web Token) — это открытый стандарт (RFC 7519), предназначенный для безопасной передачи информации между сторонами в виде компактного и самодостаточного объекта в формате JSON. Токен является подписанным и/или зашифрованным, что позволяет проверять его целостность и аутентичность. В контексте Backend-разработки на PHP JWT чаще всего используется для аутентификации и авторизации пользователей в API и веб-приложениях, заменяя собой традиционные сессии на основе cookies.

Структура JWT

JWT состоит из трёх частей, разделённых точками:

header.payload.signature
  1. Header (заголовок) — содержит метаданные о типе токена и алгоритме шифрования (например, HMAC SHA256 или RSA).

    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  2. Payload (полезная нагрузка) — содержит утверждения (claims) — утверждения о пользователе и дополнительных данных. Пример:

    {
      "sub": "1234567890",
      "name": "Иван Петров",
      "admin": true,
      "iat": 1516239022
    }
    

    Основные стандартные утверждения:

    • sub (subject) — идентификатор пользователя.
    • exp (expiration) — время истечения срока действия.
    • iat (issued at) — время создания токена.
  3. Signature (подпись) — создаётся путём кодирования header и payload с использованием секретного ключа и алгоритма, указанного в header. Подпись гарантирует, что токен не был изменён. Пример создания на PHP с использованием библиотеки firebase/php-jwt:

    use Firebase\JWT\JWT;
    use Firebase\JWT\Key;
    
    $key = 'your-secret-key';
    $payload = [
        'user_id' => 123,
        'email' => 'user@example.com',
        'exp' => time() + 3600 // Токен действителен 1 час
    ];
    
    $jwt = JWT::encode($payload, $key, 'HS256');
    echo $jwt; // Выведет строку вида "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
    

Принцип работы JWT в веб-приложении

  1. Аутентификация: Пользователь отправляет логин и пароль на сервер.
  2. Генерация токена: Сервер проверяет данные, создаёт JWT и возвращает его клиенту (обычно в ответе API или в cookie).
  3. Передача токена: Клиент сохраняет токен (часто в localStorage или cookie) и отправляет его с каждым запросом к защищённым эндпоинтам (обычно в заголовке Authorization: Bearer <token>).
  4. Верификация: Сервер проверяет подпись токена, его срок действия и данные в payload. Пример проверки на PHP:
    try {
        $decoded = JWT::decode($jwt, new Key($key, 'HS256'));
        $user_id = $decoded->user_id; // Данные из payload
        // Доступ разрешён
    } catch (Exception $e) {
        // Токен недействителен — доступ запрещён
        http_response_code(401);
        echo json_encode(['error' => 'Unauthorized']);
    }
    

Преимущества и недостатки JWT

Преимущества:

  • Stateless (без состояния): Серверу не нужно хранить сессии в памяти или БД, что упрощает масштабирование.
  • Универсальность: Токены могут использоваться в разных системах (мобильные приложения, микросервисы).
  • Безопасность: Подпись защищает от изменений данных.

Недостатки:

  • Невозможность отзыва: Токен действителен до истечения срока (exp). Для решения используют чёрные списки токенов или короткие сроки жизни с обновлением через refresh-токены.
  • Размер: JWT больше, чем session ID, что увеличивает нагрузку на сеть.
  • Уязвимости: При неправильной реализации (например, слабый секретный ключ или отключение проверки подписи) возможны атаки.

Безопасность JWT в PHP

  • Всегда используйте стойкие алгоритмы (HMAC SHA256, RSA).
  • Храните секретные ключи в защищённых местах (например, в переменных окружения).
  • Устанавливайте короткие сроки жизни токенов (минуты/часы).
  • Проверяйте все обязательные утверждения (exp, iss, aud).
  • Для критичных операций добавляйте дополнительную проверку (например, двухфакторную аутентификацию).

JWT стал де-факто стандартом для RESTful API благодаря своей простоте и гибкости, но требует внимательной реализации с учётом безопасности. В PHP для работы с JWT рекомендую библиотеки firebase/php-jwt или lcobucci/jwt, которые предоставляют удобный интерфейс и соответствуют современным стандартам.