Sobes.tech
Junior

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
    }
    
  • Signature (Кол коюу): Коддолгон баштама жана жүктүн бириктирилиши менен түзүлөт, сырткы ачкыч жана баштамада көрсөтүлгөн алгоритм колдонулат. Бул токендин бүтүндүгүн камсыздайт - эгер кимдир бирөө баштама же жүктү өзгөртсө, кол коюу жараксыз болот.

    # HS256 колдонуп кол коюу түзүү мисалы
    import hmac, hashlib
    
    header_str = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9' # Base64Url(Баштама)
    payload_str = 'eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ' # Base64Url(Жүк)
    secret = 'your_secret_key'
    
    # Кол коюу = HMACSHA256(Base64Url(Баштама) + "." + Base64Url(Жүк), сыр)
    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 ичинде маалымат көбөйгөн сайын, токендин өлчөмү да өсөт.