Logo GH

JWT: yapı ve güvenlik açıkları

1) JWT nedir ve nerede kullanılır

JWT, 'Base64Url (header) formatında kompakt, bağımsız bir talep konteyneridir. Base64Url (yük). Base64Url (imza) '.

Için kullanılır:
  • JWS (imzalı belirteçler - özgünlük/bütünlük),
  • JWE (şifreli belirteçler - gizlilik),
  • Erişim/kimlik belirteçleri ve hizmetten hizmete kimlik doğrulaması olarak OIDC/OAuth2.

Artıları: özerklik, kaşelenebilirlik, düşük yük. Eksileri: yanlış doğrulama riski, karmaşık hatırlama durumları.

2) JWT yapısı

2. 1 Başlık (JSON)

Minimum: algoritma ve anahtar tanımlayıcı.

json
{ "alg": "ES256", "kid": "jwt-2025-10", "typ": "JWT" }

'alg': imza/şifreleme algoritması (RS256/ES256/PS256/HS256, vb.).
'id': işaretçiden anahtara (JWKS döndürme için).
İsteğe bağlı anahtar kaynaklar: 'jku', 'x5u' (bakınız güvenlik açıkları § 6. 3).

2. 2 Taşıma yükü (JSON)

Standartlaştırılmış pullar:
  • 'iss' (veren), 'aud' (izleyici), 'sub' (konu)
  • 'exp' (son kullanma süresi), 'nbf' (daha önce değil), 'iat' (verilen)
  • 'jti' (belirteç kimliği, iptal edilebilir)
  • Domain-stamps: 'scope/roles', 'tenant', 'kyc _ level', vb.

2. 3 İmza

JWS = 'işareti (base64url (başlık) + "." + base64url (yük), private_key)'

Doğrulama: kesinlikle karşılık gelen genel anahtar ve tam olarak sunucunun beklediği algoritma.

3) Temel kontrol değişmezleri

1. Algoritma, kaynak sunucusunun yapılandırmasıyla (allow-list) sabitlenir ve 'header'ın içeriğine güvenilmez. alg '.
2. Tam bir eşleşme için 'iss've' aud 'işaretleyin,' exp/nbf '- küçük' clock _ skew '(± 30-60'lar) dikkate alınarak.
3. Sadece tek bir anahtar varsa ve rotasyon yoksa'çocuk "olmadan belirteçleri reddet; Aksi takdirde,'çocuk 'talep edin.
4. Nesne düzeyinde yetkilendirme (BOLA-first) olmadan hiçbir damgaya güvenmeyin.
5. Ayrıştırma - kripto doğrulamasından sonra; Kod çözme işleminden önce temel boyut kontrolleri.

4) JWS vs JWE

JWS: imzalı ama okunabilir. Yük PII/sırları koymayın.
JWE: yükü şifreler; Entegrasyon daha zordur, anahtar model kritiktir.
Çoğu API'de, yükte hassas veriler üzerindeki JWS + yasağı yeterlidir.

5) Token yaşam döngüsü

Erişim: Kısa süreli (5-30 dakika).
Yenileme: daha uzun (7-30 gün), kullanımda döndürme (bir kerelik),'kara liste "'jti/sid' tutun.
İptal: TTL ile 'jti' listeleri, opak belirteçler için iç gözlem, olaylar için 'exp' kısaltması.
Anahtar döndürme: Çakışma ile JWKS (eski + yeni), "Anahtar döndürme" makalesine bakın.

6) Sık güvenlik açıkları ve bunların nasıl kapatılacağı

6. 1 'alg = none'/algoritma yerine koyma

Alt satır: Sunucu 'alg' alanına güvenir ve imzasız bir belirteci kabul eder.
Koruma: Sunucudaki algoritmaların sert izin listesi; "Hayır've beklenmedik değerleri reddet.

6. 2 RS256 - HS256 takas (simetrikleştirme)

Alt satır: Bir saldırgan 'alg'i HS256 ile değiştirir ve açık anahtarı HMAC sırrı olarak kullanır.
Koruma: Anahtarı algoritmaya konfigürasyonla bağlayın; Simetrik/asimetrik sağlayıcıları bir 'kedi'de karıştırmayın.

6. 3 Anahtar enjeksiyon ('kid/jku/x5u')

Senaryolar:
  • 'jku', saldırgan tarafından kontrol edilen bir JWKS'ye işaret eder (anahtarını kaydırır).
  • Harici sertifikaların 'x5u'/' x5c' kullanımı.
  • 'id' with/SQL path injection ('.. "/../privkey. pem "'veya' '' 'OR 1 = 1 -"').
Koruma:
  • Silinen 'jku/x5u'yu yoksayın veya katı izin listesi etki alanlarına göre filtreleyin.
  • 'kid' yalnızca yerel dizinde (tablo/önbellek) dosya yolları/SQL bitişikleştirmeleri olmadan anahtar olarak kullanılmalıdır.
  • Güvenilir URL'lerden JWKS yükü, kısa TTL, imza/sabitleme kanalı.

6. 4 HS256 zayıf sırları (kaba kuvvet)

Alt satır: HMAC sırrı kısa/sızdırılmış - imza sahteciliği.
Koruma: Asimetri (RS/ES/PS) veya gizli uzunluk ≥ 256 bit, sırlar - yalnızca KMS'de kullanın.

6. 5 Eksik/geçersiz damgalar

No 'aud'/' iss'/' exp' - belirteci çapraz hizmet edilebilir veya sonsuzdur.
Çok uzun 'exp' - uzlaşma riski.
Koruma: tam işaret kümesi gerektirir, 'exp' kısa, 'nbf'/' iat''clock _ skew'ile doğrulayın.

6. 6 Tekrar ve jeton hırsızlığı

Öz: Bir belirtecin ele geçirilmesi/tekrarlanması (günlüklerde sızıntı, XSS, MitM TLS olmadan).

Koruma:
  • TLS везде, 'Güvenli' + 'HttpOnly' çerezi, SameSite = Lax/Strict.
  • DPoP/PoP (bir istemci anahtarına bir belirteç bağlama) ve/veya ortaklar için mTLS.
  • Kısa 'exp', yenileme-döndürme, cihaz bağlama.

6. 7 XSS/Depolama Sızıntıları

Alt satır: 'LocalStorage'/' sessionStorage'daki JWT depolaması JS tarafından kullanılabilir.
Koruma: erişim belirteçlerini HttpOnly-cookie'de saklayın (çerez modeli mümkünse) + sıkı CSP/Güvenilir Türler.
Çerezsiz SPA için - simgeyi bellekte izole edin, minimum düzeyde yaşayın, XSS'ye karşı koruyun.

6. 8 CSRF

Alt satır: çerez oturumları sırasında, üçüncü taraf bir siteden gelen talepler.
Koruma: SameSite, anti-CSRF belirteçleri (çift gönderme), 'Origin/Referer' kontrolü, Fetch-Metadata filtreleri.

6. 9 Büyük boy/boyut kötüye kullanımı

Gist: büyük yük/başlıklar, ayrıştırmada DoS.
Koruma: başlık/gövde boyut sınırları, erken reddetme 431/413, sabit pul seti.

6. 10 Yerine koyma 'typ'/' cty'

Öz: tür karışıklığı ('typ:' JWT ''), iç içe JOSE nesneleri.
Koruma: Güvenlik için 'typ/cty'yi göz ardı edin, sabit algoritmalara ve marka şemasına güvenin.

7) Token depolama ve transfer

7. 1 Sunucu API'leri (makineden makineye)

mTLS/HMAC, tercihen JWT için asimetri, ağ üzerinden kanallar.
Anahtar deposu - KMS/HSM, zamanlanmış rotasyon, çakışan JWKS.

7. 2 Tarayıcı istemcileri

HttpOnly Güvenli Çerez для erişim/yenileme; Kısa TTL; Güncelleme - sadece HTTPS altında 'SameSite = None'ile' sessiz yenileme 'yoluyla.
Sıkı CSP, Güvenilir Türler, XSS'ye karşı koruma; SPA için - mümkünse, tokeni diskte saklamayın.

8) JWKS, rotasyon ve geri çağırma

JWKS, yetkilendirici tarafından yayınlanır; Tüketiciler 5-15 dakika önbelleğe alır.
Rotasyon planı: yeni bir'çocuk 'ekleyin - imzalamaya başlayın - N gün sonra eski olanı JWKS'den kaldırın - temizleyin.
Geri bildirim: TTL ile 'jti/sid' listeleri; Bir olay durumunda, geçici olarak 'exp' azaltın ve zorla çıkış yapın (yenilemeyi devre dışı bırakın).

9) Çok kiracılı ve veri minimizasyonu

'Kiracı'/' org' simgesini yalnızca mimari tarafından gerekirse belirteçe ekleyin; Aksi takdirde, nitelikleri PDP'den 'sub'ile çekin.
PII yok; Minimum pul seti - daha az sızıntı ve korelasyon riski.

10) Pratik doğrulama kontrol listesi (kaynak sunucusu)

  • Parsim sadece imza ve temel boyut sınırlarının doğrulanmasından sonra.
  • yapılandırmadan 'alg'; Beklenmedik olanları reddet.
  • 'iss' ∧ 'aud' ∧ 'exp' ∧ 'nbf' ∧ 'iat' ('clock _ skew'ile) işaretleyin.
  • Yerel dizinde/JWKS'de 'kimlik' işaretleyin (kısa TTL).
  • Dış işaretçileri filtreleyin/normalleştirin ('jku/x5u' - yalnızca allow-list).
  • Limit damga uzunluğu/kompozisyonu (şema).
  • Nesne Kaynak Yetkilendirmesini Uygula (BOLA-first).
  • Log 'kid', 'sub', 'aud', 'iss', 'jti', 'exp', 'tenant', 'trace _ id' (PII olmadan).
  • İmza hatalarının metrikleri, gecikmeler, rotasyon denetimleri.

11) Güvenli politika örnekleri (pseudo)

11. 1 Algoritma beklentilerinin yapılandırılması

yaml jwt:
expected_issuer: "https://auth. example. com"
expected_audience: ["wallet-service"]
allowed_algs: ["ES256"] # fix the jwks_url: "https ://auth. example. com/.well-known/jwks. json"
jwks_cache_ttl: 600s clock_skew: 60s required_claims: ["iss","aud","sub","exp","iat"]

11. 2 'jku/x5u' uzaktan bırakma

yaml reject_untrusted_key_sources: true allowed_jku_hosts: ["auth. example. com"] # if absolutely necessary

11. 3 Örnek Geribildirim Listesi (Redis)

pseudo if redis. exists("revoke:jti:" + jti) then deny()
if now() > exp then deny()

12) Gözlemlenebilirlik ve görülme sıklığı

Метрики: 'jwt _ verify _ fail _ total {reason}', 'jwt _ expired _ total', 'jwks _ refresh _ total', доля 'kid'.
Günlükler (yapılandırılmış): 'iss/aud/sub/kid/jti/exp/tenant/trace _ id', başarısızlık nedeni.
Panolar: "Yakında sona erecek", doğrulama hatalarında bir artış, bölgeye/istemciye göre dağıtım.
Uyarılar: 'verify _ fail' (imza/algoritma) büyümesi, JWKS hataları, süresi dolan belirteçlerin payı.

13) Antipatterns

Token'dan 'alg'a güvenin; 'Hayır'ı destekleyin.
Uzun ömürlü erişim belirteçleri ve yenileme rotasyonu yok.
KMS olmadan ENV'de kısa bir sır/sır ile HS256.
Herhangi bir etki alanından 'jku/x5u'kabul edin; İzin listesi olmadan JWKS'yi dinamik olarak yükleyin.
PII/sırları yük JWS'ye yerleştirin.
XSS riskleri olduğunda belirteçleri 'yerel Depolama'da saklayın.
Doğrulama hatalarını önleyin (200 s "yumuşak hata" döndürün).
BOLA kontrolleri yok ve sadece 'kapsam/rol'e güveniyor.

14) iGaming/Finansın Özellikleri

Markalar: 'Kyc _ level', 'risk _ tier', 'tenant', sıkı 'aud'.
Yazma işlemleri için kısa TTL (mevduat/çıkış), kritik yollar için PoP/DPoP veya mTLS.
Düzenleyici denetim: Girdilerin/arızaların değiştirilemez günlükleri, bölge sınırları içinde günlüklerin depolanması.
Ortaklar/PSP'nin ayrı anahtarları/' aud ', kiracı anahtarları ve ayrı JWKS'leri vardır.

15) Prod Hazırlık Kontrol Listesi

  • Algoritmaların zor izin listesi; "Hayır'a izin verilmez.
  • 'iss/aud/exp/nbf/iat/jti' kontrol edilir; kısa 'exp'.
  • çakışan JWKS, kısa TTL önbellek; "Çocuk" paylaşımlarının izlenmesi.
  • Yenileme - kullanımda döndürme; TTL ile 'jti/sid' listeleri; Review Playbook.
  • PoP/DPoP veya mTLS kritik rotalarda.
  • HttpOnly-cookies for browser, CSP/Trusted Types vs. XSS; CSRF koruması.
  • Yükte PII yok; Minimum işaret kümesi.
  • Doğrulama ve başarısızlık metrikleri/günlükleri; JWKS/verify_fail uyarır.
  • Negatif senaryo testleri: RS - HS takas,'çocuk '-injections,' jku 'spoofing, oversize, saat eğriltme.

16) TL; DR

Sunucu tarafındaki algoritmayı ve anahtarları düzeltin, belirteçten 'alg'a güvenmeyin,' iss/aud/exp/nbf/iat/jti 'talep edin. Üst üste binen JWKS aracılığıyla anahtarları döndürün, belirteçleri kısa ömürlü tutun ve tek kullanımlık yenileyin. Belirteçleri güvenli bir şekilde saklayın (web için HttpOnly-cookie), damgaları en aza indirin, PII koymayın. 'Jku/x5u/kid' vektörlerini kapatın, zayıf sırlarla HS256 kaçının, kritik yollara PoP/DPoP veya mTLS ekleyin ve her zaman kaynak düzeyinde BOLA kontrolleri yapın.

Contact

Bizimle iletişime geçin

Her türlü soru veya destek için bize ulaşın.Size yardımcı olmaya her zaman hazırız!

Entegrasyona başla

Email — zorunlu. Telegram veya WhatsApp — isteğe bağlı.

Adınız zorunlu değil
Email zorunlu değil
Konu zorunlu değil
Mesaj zorunlu değil
Telegram zorunlu değil
@
Telegram belirtirseniz, Email’e ek olarak oradan da yanıt veririz.
WhatsApp zorunlu değil
Format: +ülke kodu ve numara (örneğin, +90XXXXXXXXX).

Butona tıklayarak veri işlemenize onay vermiş olursunuz.