Sobes.tech
Junior

JWT (JSON Web Token) nima?

sobes.tech AI

AIdan javob

JSON Web Token (JWT) — bu JSON formatida ma'lumotlarni tomonlar o'rtasida URL uchun mos, xavfsiz va ixcham uzatish usuli.

Ishlash prinsiplari:

  • Token uch qismdan iborat, nuqta (.) bilan ajratilgan: header.payload.signature.

  • Header (Sarlavha): Token haqida meta ma'lumotlarni o'z ichiga oladi, masalan, token turi (JWT) va imzolash algoritmi (masalan, HS256, RS256).

    {
      "alg": "HS256",
      "typ": "JWT"
    }
    
  • Payload (Yuklama): "claims" - da'volar yoki o'tkazmoqchi bo'lgan ma'lumotlar. Bir nechta turlari mavjud:

    • Ro'yxatdan o'tgan claims: Rezervlangan, ammo ixtiyoriy claims, masalan, iss (chiqargan), exp (muddati), sub (mavzu).
    • Jamoat claims: Umumiy foydalanish uchun belgilangan, IANA JSON Web Token Registryda ro'yxatdan o'tgan yoki nomlar bo'sh joyini himoya qiladigan URI bo'lishi kerak.
    • Maxfiy claims: Tomonlar o'rtasida kelishilgan tasdiqlovlar.
    {
      "sub": "1234567890",
      "name": "John Doe",
      "iat": 1516239022
    }
    
  • Imzo (Signature): Encoded header va payloadni maxfiy va headerda ko'rsatilgan algoritm yordamida birlashtirish orqali yaratiladi. Bu tokenning yaxlitligini ta'minlaydi; agar kimdir header yoki payloadni o'zgartirsa, imzo invalid bo'ladi.

    # HS256 yordamida imzo yaratish misoli
    import hmac, hashlib
    
    header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(Header)
    payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Payload)
    secret = 'your_secret_key'
    
    # Imzo = HMACSHA256(Base64Url(Header) + "." + Base64Url(Payload), secret)
    signature = hmac.new(
        secret.encode('utf-8'),
        (header_str + '.' + payload_str).encode('utf-8'),
        hashlib.sha256
    ).digest()
    
    # Imzoni Base64Url ga kodlash
    import base64
    signature_b64url = base64.urlsafe_b64encode(signature).rstrip(b'=').decode('ascii')
    
    # Yakuniy token: header_str + '.' + payload_str + '.' + signature_b64url
    

Qo'llanmalari:

  • Autentifikatsiya: Server muvaffaqiyatli autentifikatsiyadan so'ng foydalanuvchiga token beradi. Foydalanuvchi har bir so'rovda bu tokenni yuboradi. Server tokenning haqiqiyligini tekshiradi va resurslarga kirishga ruxsat beradi.
  • Ma'lumotlar almashinuvi: Turli xizmatlar o'rtasida xavfsiz kichik hajmdagi ma'lumotlarni uzatish.

Afzalliklari:

  • Ixcham: XML bilan taqqoslaganda kamroq ma'lumot uzatish.
  • O'z-o'zini yetarli: Token allaqachon foydalanuvchi haqida zarur bo'lgan ma'lumotlarni o'z ichiga oladi, bu esa har bir so'rovda ma'lumotlar bazasiga murojaat qilishni kamaytiradi.
  • Stateless: Server o'z tomonida sessiya ma'lumotlarini saqlashga ehtiyoj sezmaydi.
  • Kriptografik imzo: Ma'lumotlarning yaxlitligini ta'minlaydi.

Kamchiliklari:

  • Tokenni bekor qilish mumkin emas: Bir marta berilgan token, uning muddati o'tguncha amal qiladi, agar qora ro'yxat mexanizmi joriy etilmagan bo'lsa.
  • Maxfiy kalitni saqlash: Maxfiy kalit xavfsiz saqlanishi kerak.
  • Hajmi: payload ichidagi ma'lumotlar hajmi oshgani sayin, tokenning o'lchami ham oshadi.