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 -"').
- 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.