Բլոգ

Ի՞նչ է JWT-ը և ինչպես է այն աշխատում․ ամբողջական ուղեցույց սկսնակների համար

Իմացեք, թե ինչ է JWT-ը (JSON Web Token), ինչպես են աշխատում թոքենները, ինչ մասերից են կազմված և ինչու են օգտագործվում ժամանակակից վեբ հավելվածներում նույնականացման համար։

JWT-ի կառուցվածքը պատկերող նկար՝ Header, Payload և Signature բաժիններով։

Ի՞նչ է JWT-ը և ինչպես է այն աշխատում

Եթե երբևէ աշխատել եք ժամանակակից վեբ հավելվածների հետ, հավանաբար հանդիպել եք JWT կամ JSON Web Token հասկացությանը։ JWT-ն տվյալների անվտանգ փոխանցման ամենատարածված մեթոդներից մեկն է և լայնորեն օգտագործվում է օգտատերերի նույնականացման (Authentication), թույլտվությունների կառավարման (Authorization) և API-ների պաշտպանության համար։

Այս հոդվածում կիմանաք, թե ինչ է JWT-ը, ինչպես է այն աշխատում, ինչ կառուցվածք ունի և ինչու է այն դարձել ժամանակակից վեբ ծրագրավորման ստանդարտներից մեկը։


Ի՞նչ է JWT-ը

JWT (JSON Web Token)-ը բաց ստանդարտ է (RFC 7519), որը նախատեսված է երկու կողմերի միջև տվյալների անվտանգ փոխանցման համար՝ կոմպակտ JSON օբյեկտի տեսքով։

Յուրաքանչյուր JWT թվային ստորագրված է, ինչի շնորհիվ հնարավոր է համոզվել, որ այն չի փոփոխվել։

Սեսիաների վրա հիմնված նույնականացումից տարբեր՝ JWT-ն անհրաժեշտ տեղեկատվությունը պահում է հենց թոքենի ներսում, այլ ոչ թե սերվերում։


JWT-ի կառուցվածքը

JWT-ն բաղկացած է երեք մասից, որոնք բաժանված են կետերով։

xxxxx.yyyyy.zzzzz

1. Header (Վերնագիր)

Header-ը պարունակում է տեղեկատվություն թոքենի և օգտագործվող ստորագրման ալգորիթմի մասին։

Օրինակ՝

{
"alg": "HS256",
"typ": "JWT"
}

Այստեղ՝

  • alg — ստորագրման ալգորիթմ
  • typ — թոքենի տեսակ

Այնուհետև Header-ը կոդավորվում է Base64Url ձևաչափով։


2. Payload (Տվյալներ)

Payload-ը պարունակում է օգտատիրոջ մասին տեղեկություններ (claims)։

Օրինակ՝

{
"userId": 15,
"email": "john@example.com",
"role": "admin"
}

Այստեղ կարող են պահվել՝

  • օգտատիրոջ ID
  • անուն
  • էլ․ հասցե
  • դեր
  • իրավունքներ
  • ժամկետի ավարտ

Կարևոր է հասկանալ, որ Payload-ը չի գաղտնագրվում։ Յուրաքանչյուր մարդ կարող է այն վերծանել։


3. Signature (Ստորագրություն)

Signature-ը օգտագործվում է ստուգելու համար, որ թոքենը փոփոխված չէ։

Այն ստեղծվում է հետևյալ կերպ՝

HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret
)

Գաղտնի բանալին հայտնի է միայն սերվերին։


Ինչպե՞ս է աշխատում JWT-ը

Սովորական նույնականացման գործընթացը հետևյալն է․

  1. Օգտատերը մուտք է գործում համակարգ։
  2. Սերվերը ստուգում է տվյալները։
  3. Սերվերը ստեղծում է JWT։
  4. Թոքենը փոխանցվում է հաճախորդին։
  5. Հաճախորդը պահպանում է JWT-ն։
  6. Յուրաքանչյուր հարցման ժամանակ JWT-ն ուղարկվում է սերվերին։
  7. Սերվերը ստուգում է ստորագրությունը։
  8. Եթե ամեն ինչ ճիշտ է՝ մուտքը թույլատրվում է։

Այս մոտեցումը վերացնում է սերվերում սեսիաներ պահելու անհրաժեշտությունը։


Որտե՞ղ է օգտագործվում JWT-ը

JWT-ն լայնորեն օգտագործվում է՝

  • օգտատերերի նույնականացման համար,
  • REST API-ներում,
  • React, Vue և Angular SPA նախագծերում,
  • բջջային հավելվածներում,
  • OAuth 2.0-ում,
  • միկրոսերվիսային համակարգերում,
  • API Gateway-ներում։

JWT-ի առավելությունները

JWT-ն ունի բազմաթիվ առավելություններ.

  • Stateless նույնականացում
  • Փոքր չափ
  • Արագ ստուգում
  • Հարմար է բազմաթիվ ծառայությունների միջև օգտագործելու համար
  • Հարմար է բջջային հավելվածների համար
  • Հեշտ է մասշտաբավորվում

JWT թե՞ Session

JWT Session
Պահվում է հաճախորդի մոտ Պահվում է սերվերում
Stateless Stateful
Լավ է API-ների համար Լավ է դասական կայքերի համար
Հեշտ է մասշտաբավորվում Պահանջում է session storage

Երկու տարբերակներն էլ կիրառվում են՝ կախված նախագծի ճարտարապետությունից։


Արդյո՞ք JWT-ն անվտանգ է

JWT-ն անվտանգ է, եթե ճիշտ է օգտագործվում։

Լավագույն պրակտիկաներն են՝

  • օգտագործել HTTPS,
  • սահմանել թոքենի ժամկետ,
  • Payload-ում չպահել գաղտնի տվյալներ,
  • օգտագործել անվտանգ ստորագրման ալգորիթմներ,
  • պարբերաբար փոխել գաղտնի բանալին,
  • ստուգել յուրաքանչյուր թոքենի ստորագրությունը։

Ամենատարածված սխալները

Սկսնակները հաճախ՝

  • պահում են գաղտնաբառերը JWT-ում,
  • չեն սահմանում ժամկետի ավարտ,
  • չեն ստուգում ստորագրությունը,
  • օգտագործում են թույլ գաղտնի բանալիներ,
  • փոխանցում են JWT-ն HTTP-ով։

Այս սխալներից խուսափելը զգալիորեն բարձրացնում է անվտանգության մակարդակը։


JWT-ի օրինակ

Սովորական JWT-ն ունի հետևյալ տեսքը․

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJ1c2VySWQiOjE1LCJyb2xlIjoiYWRtaW4ifQ.
SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Թեև այն կարծես պատահական տեքստ լինի, իրականում այն բաղկացած է Header, Payload և Signature հատվածներից։


Եզրակացություն

JWT-ն այսօր հանդիսանում է նույնականացման ամենատարածված տեխնոլոգիաներից մեկը։ Այն ապահովում է տվյալների անվտանգ և արագ փոխանցում հաճախորդի և սերվերի միջև՝ առանց սեսիաներ պահելու անհրաժեշտության։

Եթե ստեղծում եք REST API, SPA կամ բջջային հավելվածներ, ապա JWT-ի աշխատանքի սկզբունքների իմացությունը պարտադիր հմտություն է։ HTTPS-ի, ճիշտ ստորագրման և անվտանգության կանոնների պահպանման դեպքում JWT-ն դառնում է հուսալի և արդյունավետ լուծում։