Token nədir və niyə lazımdır

HTTP vəziyyətsizdir: server hər sorğuda sizin kim olduğunuzu bilmir. Giriş edəndən sonra server sizə sübut (token) verir, klient onu hər sorğuya əlavə edir: Authorization: Bearer <token>. İki əsas model var: server tərəfdə sessiya (token yalnız açardır, vəziyyət serverdə) və öz-özünə yoxlanan token, məsələn JWT.

JWT: başlıq, yük, imza və serverdə yoxlama
JWT: başlıq, yük, imza və serverdə yoxlama

JWT üç hissədən ibarətdir: header.payload.signature. Hər hissə base64url ilə kodlanmış JSON-dur (imza istisna). Başlıqda alqoritm (alg), yükdə iddialar (sub, exp, iat, iss, aud) olur. İmza header.payload-ın gizli açar (HS256) və ya özəl açarla (RS256, ES256) imzalanmasıdır.

⚠️ JWT şifrələnməyib, yalnız imzalanıb: yükü hər kəs oxuya bilər. Parol, kart nömrəsi və digər həssas məlumatı oraya yazmayın.


JWT-ni klientdə oxumaq

Klient imzanı yoxlamır (açar onda yoxdur), amma yükdən faydalı şeylər oxuya bilir: istifadəçi adı, rol (interfeys üçün), exp (nə vaxt yeniləmək lazımdır). Base64url standart base64-dən -, _ simvolları və = olmaması ilə fərqlənir. UTF-8 üçün atob nəticəsini TextDecoder ilə açın.

javascript
const token =
  'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.' +
  'eyJzdWIiOiI0MiIsIm5hbWUiOiJBeXNlbCIsInJvbGUiOiJlZGl0b3IiLCJpYXQiOjE3MDAwMDAwMDAsImV4cCI6MTkwMDAwMDAwMH0.' +
  'c2lnbmF0dXJl';

function decodePart(part) {
  const base64 = part.replace(/-/g, '+').replace(/_/g, '/');
  const bytes = Uint8Array.from(atob(base64), (ch) => ch.charCodeAt(0));
  return JSON.parse(new TextDecoder().decode(bytes));
}

function decodeJwt(jwt) {
  const [header, payload] = jwt.split('.');
  return { header: decodePart(header), payload: decodePart(payload) };
}

function isExpired(payload, now = Date.now()) {
  return payload.exp * 1000 <= now;
}

const { header, payload } = decodeJwt(token);
console.log(header.alg, payload.sub, payload.role);
console.log('expired in 2026:', isExpired(payload, Date.UTC(2026, 0, 1)));
console.log('expired in 2031:', isExpired(payload, Date.UTC(2031, 0, 1)));

Nəticə:

text
HS256 42 editor
expired in 2026: false
expired in 2031: true