Junior
Šta je JWT (JSON Web Token)?
sobes.tech АИ
Одговор од АИ
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 који садржи namespace, заштићен од сукоба.
- Private claims: произвољне изјаве, договорене између страна.
{ "sub": "1234567890", "name": "John Doe", "iat": 1516239022 } - Registered claims: Регистроване, али опционалне claims, као што су
-
Signature (Потпис): креира се комбинацијом кодиране заглавља и терета коришћењем тајног кључа и алгоритма наведеног у заглављу. Ово обезбеђује целост токена - ако неко промени заглавље или терет, потпис ће бити неважећи.
# Пример креирања потписа са HS256 import hmac, hashlib header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(Заглавље) payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Терет) secret = 'your_secret_key' # Потпис = HMACSHA256(Base64Url(Заглавље) + "." + Base64Url(Терет), 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, расте и величина токена.