Что такое JWT (JSON Web Token)?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
JSON Web Token (JWT) — это компактный, безопасный для URL-адресов способ передачи данных между сторонами в формате JSON.
Принципы работы:
-
Токен состоит из трех частей, разделенных точками (
.):header.payload.signature. -
Header (Заголовок): Содержит метаинформацию о токене, такую как тип токена (JWT) и используемый алгоритм подписи (например, HS256, RS256).
{ "alg": "HS256", "typ": "JWT" } -
Payload (Нагрузка): Содержит "claims" - утверждения или информацию, которую мы хотим передать. Бывает нескольких типов:
- Registered claims: Зарезервированные, но опциональные Claims, такие как
iss(издатель),exp(срок действия),sub(тема). - Public claims: Определяются для публичного использования, должны быть зарегистрированы в IANA JSON Web Token Registry или быть URI, содержащим пространство имен, защищенное от коллизий.
- Private claims: Произвольные утверждения, согласованные между сторонами.
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } - Registered claims: Зарезервированные, но опциональные Claims, такие как
-
Signature (Подпись): Создается путем комбинирования кодированных заголовка и нагрузки с использованием секрета и алгоритма, указанного в заголовке. Это обеспечивает целостность токена - если кто-то изменит заголовок или нагрузку, подпись будет недействительной.
# Пример создания подписи с использованием HS256 import hmac, hashlib header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(Header) payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Payload) secret = 'your_secret_key' # Подпись = HMACSHA256(Base64Url(Header) + "." + Base64Url(Payload), secret) signature = hmac.new( secret.encode('utf-8'), (header_str + '.' + payload_str).encode('utf-8'), hashlib.sha256 ).digest() # Кодирование подписи в Base64Url import base64 signature_b64url = base64.urlsafe_b64encode(signature).rstrip(b'=').decode('ascii') # Итоговый токен: header_str + '.' + payload_str + '.' + signature_b64url
Применение:
- Авторизация: Сервер выдает токен пользователю после успешной аутентификации. Пользователь отправляет этот токен с каждым запросом. Сервер проверяет валидность токена и разрешает доступ к ресурсам.
- Обмен информацией: Безопасная передача небольших объемов данных между различными сервисами.
Преимущества:
- Компактность: Меньше данных для передачи по сравнению с XML.
- Самодостаточность: В токене уже содержится необходимая информация о пользователе, что уменьшает необходимость обращаться к базе данных при каждом запросе.
- Stateless: Серверу не нужно хранить информацию о сессии на своей стороне.
- Криптографическая подпись: Обеспечивает целостность данных.
Недостатки:
- Невозможно отозвать токен: После выдачи токен действует до истечения срока его действия, если не реализован механизм черных списков.
- Хранение секрета: Секретный ключ должен храниться безопасно.
- Размер: С ростом объема данных в
payloadувеличивается размер токена.