2
view-button 47
JWT-tinin lokalda etibarlı şəkildə saxlanılması

Yazı haqqında xəbər ver

Əgər yazıda qeyri etik və ya təhqir xarakerli sözlər varsa bizə xəbər verməyiniz rica olunur.

JWT-tinin lokalda etibarlı şəkildə saxlanılması

elvinhuseynov

JWT (JSON Web Token), müştəri-server tətbiqlərində identifikasiya üçün istifadə olunan giriş tokeni yaratmaq üçün gözəl bir JSON əsaslı standartdır. Bu tokenləri istifadə edərkən, tətbiqin frontend hissəsində onları necə etibarlı şəkildə saxlamağınız barədə sual yaranır. Bu məsələ serverdə yaradılan və tətbiqin müştəri tərəfinə ötürüldükdən dərhal sonra həll edilməlidir.

Tərcümə etdiyimiz məqalə, JWT-lərin saxlanması üçün brauzerin lokalında (localStorage) və ya cookie istifadəsinin müsbət və mənfi cəhətlərinin təhlilinə həsr edilmişdir.

Token növləri

  • Giriş tokeni (access tokens), server tərəfindən imzalanmış qısa müddətli JWTlərdir. Bunlar müştərinin serverə etdiyi hər HTTP sorğusuna daxildir.

  • Sorğuları təsdiqləmək üçün istifadə olunan tokenlər. Yeniləmə tokeni (refresh tokens) verilənlər bazasında saxlanılan və əvvəlki tokenin yaşam sürəsi sona çatdıqda yeni giriş əldə etmək üçün istifadə olunur.

Front-da tokenlər tam olaraq harada saxlanılmalıdır?

Frontda tokenlərin saxlamağın 2 ümumi yolu var: brauzerin local yaddaşında və peçenyedə. 😂 Zarafat edirəm cookie-də. Hansı metodun daha yaxşı olduğu barədə çox mübahisə var. Əksər proqrmçılr daha yaxşı təhlükəsizlik üçün cookie-ə meyl edirlər.

Gəlin o zaman localStorage və Cookie müqayisə edək. Kimin qalib gələcəyinə siz qərar verin.

LocalStorage

Üstünlükləri

Local-da saxlamanın əsas üstünlüyü istifadəsi rahat olmasıdır.

  • LocalStorage ilə işləmək çox rahatdır, burada təmiz JavaScript istifadə olunur. Əgər tətbiqinizdə backend servisləri yoxdursa və üçüncü tərəf API-lər ilə işləyirsinizsə, hərzaman bu API-lərdən saytınız üçün xüsusi cookie təyin etməsini istəyə bilməyəcəksiniz.

  • Lokalda istifadə edərək, sorğu başlığına giriş tokenini yerləşdirilməsini tələb edən API ilə işləmək rahatdır. Məsələn - bu kimi: Authorization Bearer $ {access_token}.

Çatışmazlıqları

LocalStorage-də saxlamanın əsas çatışmazlığı XSS hücumlarına qarşı həssaslığıdır.

  • XSS hücumu edərkən istənilən təcavüzkar saytınızdakı JavaScript kodlarını işlədə bilər. Bu təcavüzkarın localStorage-də saxlanan giriş tokeninə daxil ola bilməsi deməkdir.

  • XSS hücumunun mənbəyi saytınıza daxil olan üçüncü JavaScript kodu ola bilər. Bu React, Vue, jQuery, Google Analytics skript və sair kimi bir şey ola bilər. Müasir veb tərtibatda (web development), üçüncü tərəf kitabxanalardan istifadə etməyərək bir sayt hazırlamaq demək olar ki mümkün deyil.

Cookie

Üstünlükləri

Cookie-lərin əsas üstünlüyü ondadır ki, onlar JavaScript-dən istifadə edilə bilməz. Nəticədə, localStorage-dəki kimi XSS hücumlarına qarşı həssas deyillər.

  • Əgər HttpOnly və təhlükəsiz cookies istifadə etsəniz, o zaman JavaScript bu faylları əldə edə bilməz. Yəni təcavüzkar kodunuzu səhifənizdə işlədə bilsə də, cookie-dən giriş tokenini oxuya bilməyəcəkdir.

  • Cookies avtomatik olaraq hər HTTP sorğusunda serverə göndərilir.

Çatışmazlıqları

Xüsusi vəziyyətlərdən asılı olaraq cookie-də tokenlərin saxlanıla bilinməməsi baş verə bilər.

  • Cookie-lərin ölçüsü 4 KB ilə məhdudlaşır. Buna görə, böyük JWT-lərdən istifadə etsəniz, onları cookie şəklində saxlamaq sizin üçün çətin olacaqdır.

  • Cookie-ləri API serverinizə ötürə bilmədiyiniz ssenarilər var. Bəzi API-lər Authorization başlığına tokenin yerləşdirilməsini tələb edir. Bu vəziyyətdə, tokeni cookie-də saxlaya bilməyəcəksiniz.

XSS hücumları

localStorage XSS hücumlarına qarşı olduqca həssasdır, çünki JavaScript-dən istifadə edərək onu rahat idarə etmək mümkündür. Buna görə təcavüzkar tokeni əldə edə və onlardan öz xeyirlərinə istifadə edə bilər. Bundan başqa, HttpOnly cookies-ləri JavaScript-dən əldə etmək mümkün olmasa da, giriş tokenlərini oğurlamaq üçün cookies istifadə edərək XSS hücumlarından qorunmağınız demək deyil.

Təcavüzkar JS kodunu tətbiqetmənizdə işlədə bilərsə, bu, sadəcə serverinizə sorğu göndərə biləcəyini bildirir və token avtomatik olaraq bu sorğuya daxil olacaqdır. Belə bir iş sxemi təcavüzkar üçün sadəcə o qədər də əlverişli deyil, çünki tokenin məzmununu oxuya bilmir. Lakin təcavüzkarlar nadir hallarda buna ehtiyac duyurlar. Bundan əlavə, bu iş sxemi ilə təcavüzkarın özündən çox, qurbanının kompüterindən istifadə edərək serverə hücum etməsi daha sərfəli ola bilər.

Cookie və CSRF hücumları

CSRF hücumları, istifadəçinin müəyyən bir şəkildə xüsusi bir sorğu verməyə məcbur edildiyi hücumlardır. Məsələn, sayt elektron poçt ünvanını dəyişdirmək üçün müraciətləri qəbul edir:

POST /email/change HTTP/1.1
Host: site.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 50
Cookie: session=abcdefghijklmnopqrstu

email=myemail.example.com

Belə bir vəziyyətdə təcavüzkar bir POST sorğusunu https://site.com/email/change göndərən bir e-poçt ünvanına daxil olmaq üçün gizli bir sahə ilə bir forma yarada bilər. Bu vəziyyətdə, sessiya cookie-ləri avtomatik olaraq belə bir sorğuya daxil ediləcəkdir.

Bununla birlikdə, cavab başlığı və anti-CSRF SameSite atributundan istifadə etməklə bu təhlükə asanlıqla qorunur.

Yekun

Cookie-lər hücumlara qarşı tamamilə təhlükəsiz olmasa da, tokenləri saxlamaq üçün ən yaxşı yol onları localStorage-də deyil, cookie-də saxlamaqdır. Niyə?

  • Həm localStorage, həm də cookie XSS hücumlarına qarşı həssasdır, lakin HttpOnly cookies istifadə edilsə təcavüzkarın hücumu daha çətin olacaq.

  • Cookies CSRF hücumlarına qarşı həssasdır, lakin SameSite atributu və anti-CSRF əlamətlərindən istifadə etməklə bu cür hücumların riski azaldıla bilər.

Bundan əlavə, OWASP qaydalarına uyğun olaraq: “Sessiya identifikatorlarını localStorage-də saxlamayın, çünki JavaScript-də həmən məlumatlar hər zaman əlçatandır. Cookies HttpOnly ilə isə riskləri azaltmağa müvəffəq ola bilərsiniz."

Burada əhatə etdiklərimiz JWT-lərin frontda saxlanması və layihənizin daha etibarlı olmasına dair ilkin məlumatlar vermək idi. Tokenləri harada saxlamanız yalnız sizin qərarınızdan asılı olacaqdır.

Elvin Huseynov

CodeX layihəsinin təsisçisi. PM

Rəylər

0 comments
Rəy yazan olmayıb
Rəy yazmaq üçün lütfən sayta Telegram hesabınızla daxil olun