Sobes.tech
Junior
197

JWT (JSON Web Token) nədir?

AI-dan cavab

sobes.tech Süni İntellekt

JSON Web Token (JWT) — bu formatı kiçik, URL üçün təhlükəsiz və JSON formatında tərəflər arasında məlumatların ötürülməsi üçün yoldur.

İş prinsipləri:

  • Token üç hissədən ibarətdir, nöqtə (.) ilə ayrılmış: header.payload.signature.

  • Header (Başlıq): Token haqqında meta məlumatlar, məsələn, token növü (JWT) və istifadə olunan imzalama algoritmi (məsələn, HS256, RS256).

    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  • Payload (Yük): "claims" - iddialar və ya ötürmək istədiyimiz məlumatlar. Bir neçə növü var:

    • Qeydiyyatdan keçmiş claims: Rezerv olunmuş, lakin opsional claims, məsələn, iss (nəşr edən), exp (müddət), sub (mövzu).
    • İctimai claims: Ümumi istifadə üçün müəyyən edilmiş, IANA JSON Web Token Registry-də qeydiyyatdan keçməli və ya mübahisələrdən qorunan ad məkanını ehtiva edən URI olmalıdır.
    • Özəl claims: Tərəflər arasında razılaşdırılmış təsdiqlər.
    {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    
  • İmza (Signature): Başlıq və yük kodlaşdırılmış şəkildə gizli və başlıqda göstərilən algoritm istifadə edilərək birləşdirilir. Bu, token-in bütövlüyünü təmin edir; əgər kimsə başlıq və ya yükü dəyişdirsə, imza etibarsız olacaq.

    # HS256 istifadə edərək imza nümunəsi
    import hmac, hashlib
    
    header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(Başlıq)
    payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Yük)
    secret = 'your_secret_key'
    
    # İmza = HMACSHA256(Base64Url(Başlıq) + "." + Base64Url(Yük), secret)
    signature = hmac.new(
        secret.encode('utf-8'),
        (header_str + '.' + payload_str).encode('utf-8'),
        hashlib.sha256
    ).digest()
    
    # İmzanın Base64Url ilə kodlanması
    import base64
    signature_b64url = base64.urlsafe_b64encode(signature).rstrip(b'=').decode('ascii')
    
    # Tokenin son forması: header_str + '.' + payload_str + '.' + signature_b64url
    

Tətbiqlər:

  • Doğrulama: Server istifadəçiyə uğurlu autentifikasiya sonrası token verir. İstifadəçi hər sorğuda bu tokenı göndərir. Server tokenın düzgünlüyünü yoxlayır və resurslara girişə icazə verir.
  • Məlumat mübadiləsi: Müxtəlif xidmətlər arasında təhlükəsiz kiçik məlumatların ötürülməsi.

Üstünlüklər:

  • Kiçik: XML-ə nisbətən daha az məlumat ötürülür.
  • Özünə kifayət edir: Token artıq istifadəçi haqqında lazım olan məlumatları ehtiva edir, bu da hər sorğuda verilənlər bazasına müraciət etmə ehtiyacını azaldır.
  • Stateless: Server öz tərəfində sessiya məlumatlarını saxlamaq məcburiyyətində deyil.
  • Kriptografik imza: Məlumatların bütövlüyünü təmin edir.

Çətinliklər:

  • Token-in ləğv edilə bilməməsi: Bir dəfə verildikdən sonra, token müddəti bitənə qədər qüvvədədir, əgər qara siyahı mexanizmi tətbiq edilməyibsə.
  • Gizli açarın təhlükəsiz saxlanması: Gizli açar təhlükəsiz şəkildə saxlanmalıdır.
  • Həcmi: payload içindəki məlumatların həcmi artdıqca, tokenin ölçüsü də artır.