17-bo‘lim

Tokenlar va JWT

O'z ichida ma'lumot saqlaydigan tokenlar - tuzilishi, ikkita klassik hujum va qachon ular kerak emas.

🕑 16 daqiqa o‘qish 📄 1 054 so‘z 👁 2 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Ikki xil token
  2. JWT tuzilishi
  3. Tekshirish - va birinchi klassik xato
  4. Ikkinchi klassik xato: algoritm chalkashligi
  5. To'g'ri tekshiruvchi
  6. Bekor qilish muammosi
  7. Qachon JWT, qachon noaniq token
  8. Xulosa

Foydalanuvchi tizimga kirgach, keyingi so'rovlarda uni qanday tanish kerak?

Ikki yondashuv bor va ular butunlay boshqacha ishlaydi.

Ikki xil token #

Noaniq tokenO'z ichida saqlovchi (JWT)
Ichida nima borHech narsa - tasodifiy baytlarFoydalanuvchi ma'lumotlari
TekshirishBazadan qidiriladiImzo tekshiriladi
Bazaga murojaatHar so'rovdaKerak emas
Bekor qilishDarhol - qatorni o'chirishQiyin
O'lcham32 bayt200-1000 bayt
Ma'lumot sizishiYo'qIchini har kim o'qiy oladi
PHP
function korsat(string $nom, string $qiymat): void
{
    printf("%-20s %s%s", $nom . ':', $qiymat, PHP_EOL);
}

function b64url(string $baytlar): string
{
    return rtrim(strtr(base64_encode($baytlar), '+/', '-_'), '=');
}

function b64urlOch(string $matn): string
{
    return base64_decode(strtr($matn, '-_', '+/'));
}
PHP
// Noaniq token - shunchaki tasodifiy baytlar
$noaniq = b64url(random_bytes(32));

// Qiymat har chaqiruvda boshqacha - xossalarini ko'rsatamiz
korsat('uzunligi', strlen($noaniq) . ' belgi');
korsat('entropiya', '32 bayt = 256 bit');
korsat('ichida malumot', 'yoq - u faqat bazadagi kalit');
Natija
uzunligi:            43 belgi
entropiya:           32 bayt = 256 bit
ichida malumot:      yoq - u faqat bazadagi kalit

JWT tuzilishi #

PHP
const JWT_KALIT = 'demo-maxfiy-kalit-hech-qachon-ishlatmang';

function jwtYarat(array $dalillar, string $kalit): string
{
    $sarlavha = ['alg' => 'HS256', 'typ' => 'JWT'];

    $qismlar = [
        b64url(json_encode($sarlavha, JSON_UNESCAPED_SLASHES)),
        b64url(json_encode($dalillar, JSON_UNESCAPED_SLASHES)),
    ];

    $imzolanadigan = implode('.', $qismlar);
    $imzo = hash_hmac('sha256', $imzolanadigan, $kalit, true);

    return $imzolanadigan . '.' . b64url($imzo);
}
PHP
// Vaqtlar qat'iy - natija takrorlanishi uchun
$dalillar = [
    'sub' => '42',
    'name' => 'Husanboy Qodirov',
    'rol' => 'user',
    'iat' => 1735689600,
    'exp' => 1735693200,
];

$token = jwtYarat($dalillar, JWT_KALIT);

$qismlar = explode('.', $token);
korsat('qismlar soni', (string) count($qismlar));
korsat('sarlavha', $qismlar[0]);
korsat('foydali yuk', substr($qismlar[1], 0, 40) . '...');
korsat('imzo', $qismlar[2]);
korsat('umumiy uzunlik', strlen($token) . ' belgi');
Natija
qismlar soni:        3
sarlavha:            eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
foydali yuk:         eyJzdWIiOiI0MiIsIm5hbWUiOiJIdXNhbmJveSBR...
imzo:                e_yco0SYxtxJW47vVAnoFUDX2V_Zr4SV4xDLm9jj44s
umumiy uzunlik:      195 belgi
JWT shifrlanmagan - u faqat imzolangan

Bu eng ko'p uchraydigan chalkashlik. Ichidagi ma'lumotni har kim o'qiy oladi:

PHP
$token = jwtYarat([
    'sub' => '42',
    'name' => 'Husanboy Qodirov',
    'rol' => 'user',
    'maosh' => 15000000,       // BUNI JWT GA QO'YMANG
    'iat' => 1735689600,
], JWT_KALIT);

// Kalitsiz, hech qanday sirsiz - shunchaki base64
$qismlar = explode('.', $token);

echo 'Sarlavha:', PHP_EOL;
echo '  ', b64urlOch($qismlar[0]), PHP_EOL;
echo 'Foydali yuk:', PHP_EOL;
echo '  ', b64urlOch($qismlar[1]), PHP_EOL;
Natija
Sarlavha:
  {"alg":"HS256","typ":"JWT"}
Foydali yuk:
  {"sub":"42","name":"Husanboy Qodirov","rol":"user","maosh":15000000,"iat":1735689600}
JWT ichiga nima qo'yish mumkin

Imzo faqat o'zgartirishdan himoya qiladi, o'qishdan emas.

Qo'yish mumkinQo'yish mumkin emas
Foydalanuvchi identifikatoriParol yoki uning xeshi
Rol nomiMaosh, tibbiy ma'lumot
Amal muddatiKarta raqami
Berilgan vaqtIchki tizim tafsilotlari
Sessiya identifikatoriMaxfiy kalitlar

Foydalanuvchi o'z tokenini brauzer konsolida ochib ko'radi. Uning hamkasbi ham. Xato hisobotiga tushgan token ham.

Agar maxfiylik kerak bo'lsa - JWE (shifrlangan JWT) ishlatiladi, lekin bu ancha murakkab. Amalda oddiyroq yo'l bor: maxfiy ma'lumotni tokenga umuman qo'ymang, uni bazadan oling.

Tekshirish - va birinchi klassik xato #

PHP
// XAVFLI: sarlavhadagi algoritmga ISHONADI
function xavfliTekshir(string $token, string $kalit): array
{
    [$s, $y, $i] = explode('.', $token);

    $sarlavha = json_decode(b64urlOch($s), true);

    // Bu yerda hujumchi algoritmni tanlaydi
    if (($sarlavha['alg'] ?? '') === 'none') {
        return ['ok' => true, 'sabab' => 'alg=none - imzo tekshirilmadi'];
    }

    $kutilgan = b64url(hash_hmac('sha256', "{$s}.{$y}", $kalit, true));

    return hash_equals($kutilgan, $i)
        ? ['ok' => true, 'sabab' => 'imzo togri']
        : ['ok' => false, 'sabab' => 'imzo notogri'];
}
PHP
$token = jwtYarat(['sub' => '42', 'rol' => 'user'], JWT_KALIT);

// 1. Oddiy holat
$n = xavfliTekshir($token, JWT_KALIT);
korsat('togri token', ($n['ok'] ? 'QABUL' : 'RAD') . ' - ' . $n['sabab']);

// 2. Hujumchi rolni o'zgartiradi (imzoni yangilamasdan)
$q = explode('.', $token);
$soxtaYuk = b64url(json_encode(['sub' => '42', 'rol' => 'admin'],
    JSON_UNESCAPED_SLASHES));
$soxta = $q[0] . '.' . $soxtaYuk . '.' . $q[2];

$n = xavfliTekshir($soxta, JWT_KALIT);
korsat('yuk ozgartirildi', ($n['ok'] ? 'QABUL' : 'RAD') . ' - ' . $n['sabab']);

// 3. Hujumchi ALGORITMNI o'zgartiradi
$noneSarlavha = b64url(json_encode(['alg' => 'none', 'typ' => 'JWT'],
    JSON_UNESCAPED_SLASHES));
$noneToken = $noneSarlavha . '.' . $soxtaYuk . '.';

$n = xavfliTekshir($noneToken, JWT_KALIT);
korsat('alg=none', ($n['ok'] ? 'QABUL' : 'RAD') . ' - ' . $n['sabab']);
Natija
togri token:         QABUL - imzo togri
yuk ozgartirildi:    RAD - imzo notogri
alg=none:            QABUL - alg=none - imzo tekshirilmadi
alg=none - JWT tarixidagi eng mashhur xato

Uchinchi natijaga qarang: hujumchi imzosiz token yubordi va u qabul qilindi.

U shunchaki ikkita narsani o'zgartirdi:

NimaEskiYangi
Sarlavhadagi algHS256none
Imzo43 belgibo'sh

Va rolni user dan admin ga aylantirdi.

Muammoning ildizi: tekshiruvchi algoritmni tokenning o'zidan oldi. Ya'ni hujumchi qanday tekshirilishini o'zi tanladi.

none algoritmi standartda "imzosiz JWT" uchun mo'ljallangan edi, lekin ko'p kutubxona uni tekshiruvda ham qabul qilardi. 2015-yilda bu ommaviy zaiflik sifatida e'lon qilingan.

Ikkinchi klassik xato: algoritm chalkashligi #

PHP
// Server RS256 (ochiq kalitli imzo) ishlatadi deb faraz qilaylik.
// Ochiq kalit hamma uchun MA'LUM.
$ochiqKalit = "-----BEGIN PUBLIC KEY-----\nSOXTA-NAMUNA-KALIT\n-----END PUBLIC KEY-----";

// XAVFLI tekshiruvchi: alg ga qarab usulni tanlaydi
function chalkashTekshir(string $token, string $ochiqKalit): string
{
    [$s, $y, $i] = explode('.', $token);
    $alg = json_decode(b64urlOch($s), true)['alg'] ?? '';

    return match ($alg) {
        // HS256 uchun "kalit" sifatida O'SHA ochiq kalitni beradi
        'HS256' => hash_equals(
            b64url(hash_hmac('sha256', "{$s}.{$y}", $ochiqKalit, true)), $i)
                ? 'QABUL' : 'RAD',
        'RS256' => 'RSA tekshiruvi (bu yerda soddalashtirilgan)',
        default => 'RAD: nomalum algoritm',
    };
}

// Hujumchi RS256 o'rniga HS256 deb belgilaydi va
// OCHIQ kalitni HMAC siri sifatida ishlatadi
$sarlavha = b64url(json_encode(['alg' => 'HS256', 'typ' => 'JWT'],
    JSON_UNESCAPED_SLASHES));
$yuk = b64url(json_encode(['sub' => '42', 'rol' => 'admin'],
    JSON_UNESCAPED_SLASHES));
$imzo = b64url(hash_hmac('sha256', "{$sarlavha}.{$yuk}", $ochiqKalit, true));

korsat('hujum natijasi', chalkashTekshir("{$sarlavha}.{$yuk}.{$imzo}",
    $ochiqKalit));
Natija
hujum natijasi:      QABUL
Ochiq kalit sir sifatida ishlatildi

RS256 da ochiq kalit hamma uchun ma'lum - u shunday bo'lishi kerak.

Lekin agar tekshiruvchi alg=HS256 ni ko'rib, o'sha ochiq kalitni HMAC siri sifatida ishlatsa, hujumchi ham xuddi shu kalit bilan to'g'ri imzo yasay oladi.

Natijada ochiq kalitli tizim simmetrik tizimga "tushiriladi" va butun himoya yo'qoladi.

Bu algoritm chalkashligi (algorithm confusion) hujumi. 11-bo'limda qisqacha aytib o'tgan edik.

To'g'ri tekshiruvchi #

PHP
final class JwtTekshiruvchi
{
    // Algoritm KODDA qat'iy - tokendan olinmaydi
    private const ALGORITM = 'HS256';

    public function __construct(
        private readonly string $kalit,
        private readonly string $beruvchi,
        private readonly string $auditoriya,
    ) {}

    public function tekshir(string $token, int $hozir): array
    {
        $qismlar = explode('.', $token);
        if (count($qismlar) !== 3) {
            return ['ok' => false, 'sabab' => 'shakl notogri'];
        }

        [$s, $y, $i] = $qismlar;

        // 1. Sarlavhadagi alg BIZNIKI bilan mos kelishi shart
        $sarlavha = json_decode(b64urlOch($s), true);
        if (($sarlavha['alg'] ?? '') !== self::ALGORITM) {
            return ['ok' => false, 'sabab' => 'algoritm mos emas'];
        }

        // 2. Imzo - doimiy vaqtda
        $kutilgan = b64url(hash_hmac('sha256', "{$s}.{$y}", $this->kalit, true));
        if (!hash_equals($kutilgan, $i)) {
            return ['ok' => false, 'sabab' => 'imzo notogri'];
        }

        // 3. Faqat SHUNDAN KEYIN yukni o'qiymiz
        $d = json_decode(b64urlOch($y), true);
        if (!is_array($d)) {
            return ['ok' => false, 'sabab' => 'yuk buzuq'];
        }

        // 4. Dalillarni tekshiramiz
        foreach (['exp', 'iat', 'iss', 'aud', 'sub'] as $majburiy) {
            if (!isset($d[$majburiy])) {
                return ['ok' => false, 'sabab' => "{$majburiy} yoq"];
            }
        }

        if ($hozir >= $d['exp']) {
            return ['ok' => false, 'sabab' => 'muddati otgan'];
        }
        if (isset($d['nbf']) && $hozir < $d['nbf']) {
            return ['ok' => false, 'sabab' => 'hali kuchga kirmagan'];
        }
        if (!hash_equals($this->beruvchi, (string) $d['iss'])) {
            return ['ok' => false, 'sabab' => 'beruvchi mos emas'];
        }
        if (!hash_equals($this->auditoriya, (string) $d['aud'])) {
            return ['ok' => false, 'sabab' => 'auditoriya mos emas'];
        }

        return ['ok' => true, 'sabab' => 'qabul', 'sub' => $d['sub']];
    }
}
PHP
$tekshiruvchi = new JwtTekshiruvchi(JWT_KALIT, 'edu.namuna.uz', 'mobil-ilova');

$hozir = 1735689600;
$asos = [
    'sub' => '42',
    'iss' => 'edu.namuna.uz',
    'aud' => 'mobil-ilova',
    'iat' => $hozir,
    'exp' => $hozir + 3600,
];

$sinovlar = [
    'togri token' => jwtYarat($asos, JWT_KALIT),
    'boshqa kalit' => jwtYarat($asos, 'boshqa-kalit'),
    'muddati otgan' => jwtYarat([...$asos, 'exp' => $hozir - 1], JWT_KALIT),
    'boshqa beruvchi' => jwtYarat([...$asos, 'iss' => 'soxta.uz'], JWT_KALIT),
    'boshqa auditoriya' => jwtYarat([...$asos, 'aud' => 'veb'], JWT_KALIT),
    'exp yoq' => jwtYarat(['sub' => '42', 'iss' => 'edu.namuna.uz',
        'aud' => 'mobil-ilova', 'iat' => $hozir], JWT_KALIT),
];

foreach ($sinovlar as $nom => $token) {
    $n = $tekshiruvchi->tekshir($token, $hozir);
    printf('%-18s %-6s %s%s', $nom, $n['ok'] ? 'QABUL' : 'RAD',
        $n['sabab'], PHP_EOL);
}
Natija
togri token        QABUL  qabul
boshqa kalit       RAD    imzo notogri
muddati otgan      RAD    muddati otgan
boshqa beruvchi    RAD    beruvchi mos emas
boshqa auditoriya  RAD    auditoriya mos emas
exp yoq            RAD    exp yoq

alg=none va algoritm chalkashligi ham to'xtatiladi:

PHP
$tekshiruvchi = new JwtTekshiruvchi(JWT_KALIT, 'edu.namuna.uz', 'mobil-ilova');
$hozir = 1735689600;

$yuk = b64url(json_encode([
    'sub' => '1', 'iss' => 'edu.namuna.uz', 'aud' => 'mobil-ilova',
    'iat' => $hozir, 'exp' => $hozir + 3600, 'rol' => 'admin',
], JSON_UNESCAPED_SLASHES));

$hujumlar = [
    'alg=none' => b64url(json_encode(['alg' => 'none', 'typ' => 'JWT'],
        JSON_UNESCAPED_SLASHES)) . '.' . $yuk . '.',
    'alg=HS512' => b64url(json_encode(['alg' => 'HS512', 'typ' => 'JWT'],
        JSON_UNESCAPED_SLASHES)) . '.' . $yuk . '.aaaa',
    'alg=RS256' => b64url(json_encode(['alg' => 'RS256', 'typ' => 'JWT'],
        JSON_UNESCAPED_SLASHES)) . '.' . $yuk . '.bbbb',
    'imzosiz' => 'x.y',
];

foreach ($hujumlar as $nom => $token) {
    $n = $tekshiruvchi->tekshir($token, $hozir);
    printf('%-12s %-6s %s%s', $nom, $n['ok'] ? 'QABUL' : 'RAD',
        $n['sabab'], PHP_EOL);
}
Natija
alg=none     RAD    algoritm mos emas
alg=HS512    RAD    algoritm mos emas
alg=RS256    RAD    algoritm mos emas
imzosiz      RAD    shakl notogri
JWT - uch qism, nuqta bilan ajratilgan eyJhbGciOiJIUzI1NiJ9 . eyJzdWIiOiI0MiIsInJvbCI6InVzZXIifQ . HMAC-SHA256 imzosi Sarlavha alg, typ ISHONCHSIZ Foydali yuk sub, exp, iss, aud HAR KIM O'QIY OLADI Imzo sarlavha + yuk ustidan O'ZGARTIRIB BO'LMAYDI Tekshirish tartibi - buzilmasligi kerak 1. Algoritm kodda belgilangan bilan mos keladimi (tokendan OLINMAYDI) 2. Imzo to'g'rimi (hash_equals bilan) 3. Faqat SHUNDAN KEYIN yukni JSON sifatida o'qish 4. Dalillar: exp, nbf, iss, aud - hammasi tekshiriladi Ikki klassik hujum alg=none - imzo umuman tekshirilmaydi, token bo'sh imzo bilan qabul qilinadi RS256 → HS256 - hamma biladigan ochiq kalit HMAC siri sifatida ishlatiladi Ikkalasining ham sababi bitta: algoritm TOKENDAN olingan
Algoritmni hech qachon tokenning o'zidan olmang

Bekor qilish muammosi #

PHP
$hozir = 1735689600;

// Foydalanuvchi chiqdi. Nima bo'ladi?
$token = jwtYarat([
    'sub' => '42', 'iss' => 'edu.namuna.uz', 'aud' => 'mobil-ilova',
    'iat' => $hozir, 'exp' => $hozir + 86400,   // bir kunlik
], JWT_KALIT);

$tekshiruvchi = new JwtTekshiruvchi(JWT_KALIT, 'edu.namuna.uz', 'mobil-ilova');

korsat('chiqishdan oldin', $tekshiruvchi->tekshir($token, $hozir)['sabab']);
korsat('chiqqandan keyin', $tekshiruvchi->tekshir($token, $hozir + 60)['sabab']);
korsat('parol ozgargach', $tekshiruvchi->tekshir($token, $hozir + 3600)['sabab']);

echo PHP_EOL, 'Token muddati tugagunicha ISHLAYVERADI:', PHP_EOL;
printf('  qolgan vaqt: %d soat%s',
    intdiv(86400 - 3600, 3600), PHP_EOL);
Natija
chiqishdan oldin:    qabul
chiqqandan keyin:    qabul
parol ozgargach:     qabul

Token muddati tugagunicha ISHLAYVERADI:
  qolgan vaqt: 23 soat
JWT ni bekor qilib bo'lmaydi

Serverda hech qanday holat saqlanmaydi - bu JWT ning asosiy g'oyasi. Lekin aynan shu sabab uni to'xtatib bo'lmaydi.

HodisaNoaniq tokenJWT
Foydalanuvchi chiqdiDarhol bekorIshlayveradi
Parol o'zgartirildiBarcha sessiyalar bekorIshlayveradi
Hisob bloklandiDarhol bekorIshlayveradi
Rol o'zgartirildiKeyingi so'rovda yangiEski rol qoladi
Token o'g'irlandiBekor qilinadiMuddatigacha ishlaydi

Amaliy yechimlar:

YechimBaho
Qisqa muddat (5-15 daqiqa) + yangilash tokeniEng keng tarqalgan
Qora ro'yxat (jti bo'yicha)Ishlaydi, lekin holat qaytadi
Foydalanuvchi versiyasi (ver dalili)Bazaga murojaat kerak
Bekor qilingan vaqt (iat ni solishtirish)Yengil, keng qo'llanadi

Ikkinchi va uchinchi qatorga e'tibor bering: ular JWT ning asosiy foydasini - holatsizlikni - bekor qiladi.

Shuning uchun savol tug'iladi: agar baribir bazaga murojaat qilsak, JWT nima uchun kerak?

Qachon JWT, qachon noaniq token #

VaziyatTanlov
Oddiy veb ilova, sessiyalarNoaniq token + kuki
Bitta baza, bitta serverNoaniq token
Mikroservislar orasidagi ishonchJWT
Uchinchi tomon API (OAuth)JWT yoki noaniq
Mobil ilova, qisqa sessiyaJWT (qisqa muddat)
Bir marta ishlatiladigan havolaImzolangan URL (5-bo'lim)
Darhol bekor qilish kerakNoaniq token
PHP
// Oddiy veb ilova uchun eng sodda va ishonchli yechim
$sessiyaId = b64url(random_bytes(32));

echo 'Sessiya kukisi sozlamalari:', PHP_EOL;
$sozlamalar = [
    'httponly' => 'true  - JavaScript oqiy olmaydi',
    'secure' => 'true  - faqat HTTPS orqali',
    'samesite' => 'Lax  - CSRF ga qarshi',
    'path' => '/',
    'domain' => '(qoyilmaydi - subdomenlarga tarqalmasin)',
    'lifetime' => '0     - brauzer yopilganda ochadi',
];

foreach ($sozlamalar as $k => $v) {
    printf('  %-10s %s%s', $k . ':', $v, PHP_EOL);
}

echo PHP_EOL, 'Bazada saqlanadi: id, foydalanuvchi_id, yaratilgan, ',
    'oxirgi_faollik, ip, qurilma', PHP_EOL;
Natija
Sessiya kukisi sozlamalari:
  httponly:  true  - JavaScript oqiy olmaydi
  secure:    true  - faqat HTTPS orqali
  samesite:  Lax  - CSRF ga qarshi
  path:      /
  domain:    (qoyilmaydi - subdomenlarga tarqalmasin)
  lifetime:  0     - brauzer yopilganda ochadi

Bazada saqlanadi: id, foydalanuvchi_id, yaratilgan, oxirgi_faollik, ip, qurilma
Eng ko'p uchraydigan ortiqcha murakkablik

Ko'p loyihada JWT kerak bo'lmagan joyda ishlatiladi.

Belgilari:

BelgiMa'nosi
Bitta backend, bitta bazaHolatsizlik foyda bermaydi
Har so'rovda baribir foydalanuvchi o'qiladiBazaga murojaat baribir bor
Qora ro'yxat qo'shilganHolat qaytdi - JWT ma'nosini yo'qotdi
Token kukida saqlanadiSessiya kukisi bilan bir xil, lekin murakkabroq

Bunday holatda oddiy sessiya:

  • Kamroq kod
  • Darhol bekor qilinadi
  • Ma'lumot sizmaydi
  • Xato qilish qiyinroq

JWT taqsimlangan tizimlarda, xizmatlar bir-biriga ishonishi kerak bo'lganda kuchli. Bitta ilovada esa ko'pincha ortiqcha.

Amaliy topshiriq
  1. Noaniq token va JWT farqini jadval qilib yozing.
  2. JWT ni qo'lda yarating (sarlavha, yuk, HMAC imzo).
  3. Uning ichini kalitsiz o'qing - nima ko'rindi?
  4. JWT ga qo'yish mumkin bo'lmagan beshta ma'lumotni sanang.
  5. alg=none hujumini takrorlang va zaif tekshiruvchi uni qabul qilishini ko'ring.
  6. Algoritm chalkashligi hujumini takrorlang.
  7. Algoritmni kodda qat'iy belgilaydigan tekshiruvchi yozing.
  8. exp, iss, aud tekshiruvlarini qo'shing va oltita holatni sinang.
  9. Foydalanuvchi chiqqandan keyin token ishlayverishini ko'rsating.
  10. O'z loyihangizda JWT haqiqatan kerakmi - javob yozing.

Xulosa #

  • Noaniq token - tasodifiy baytlar; ma'no bazada.
  • JWT - o'z ichida ma'lumot saqlaydi va imzolangan.
  • JWT shifrlanmagan: ichini har kim base64 dan ochib o'qiy oladi.
  • Maxfiy ma'lumotni tokenga qo'ymang - uni bazadan oling.
  • alg=none - eng mashhur JWT zaifligi: imzo tekshirilmaydi.
  • Algoritm chalkashligi - ochiq kalit HMAC siri sifatida ishlatiladi.
  • Ikkala hujumning sababi bitta: algoritm tokendan olingan.
  • Algoritm kodda qat'iy belgilanishi shart.
  • Tekshirish tartibi: algoritm → imzo → keyin yukni o'qish → dalillar.
  • JWT ni bekor qilib bo'lmaydi - qisqa muddat va yangilash tokeni kerak.

Keyingi bo'limda hamma narsani ushlab turadigan halqani - kalitlarni boshqarish ni ko'ramiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.