Какво е JWT (JSON Web Token)?
sobes.tech AI
Отговор от 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, размерът на токена се увеличава.