JWT: gurluşy we gowşaklygy
1) JWT näme we nirede ulanylýar
JWT - 'Base64Url (header) formatynda öz-özüne ýeterlik tassyklama konteýneri (claims). Base64Url(payload). Base64Url(signature)`.
Şu üçin ulanylýar:- JWS (gol çekilen bellikler - hakykylyk/bitewilik),
- JWE (şifrlenen bellikler - gizlinlik),
- access/ID bellikleri, şeýle hem service-to-service autentifikasiýasy hökmünde OIDC/OAuth2.
Artykmaçlyklary: özbaşdaklyk, keş, az goşmaça çykdajylar. Minuslar: nädogry tassyklama töwekgelçiligi, yzyna çagyrmagyň çylşyrymly ýagdaýlary.
2) JWT gurluşy
2. 1 Sözbaşy (başlyk, JSON)
Iň az: algoritm we açar identifikatory.
json
{ "alg": "ES256", "kid": "jwt-2025-10", "typ": "JWT" }
'alg': gol/şifrlemek algoritmi (RS256/ES256/PS256/HS256 we ş.m.).
'kid': açar görkeziji (JWKS-aýlanyş üçin).
Açarlaryň opsiýa çeşmeleri: 'jku', 'x5u' (gowşaklyga serediň § 6. 3).
2. 2 Peýdaly ýük (payload, JSON)
Standartlaşdyrylan bellikler:- `iss` (issuer), `aud` (audience), `sub` (subject)
- 'exp' (gutarýan wagty), 'nbf' (öň däl), 'iat' (berlen)
- 'jti' (Token identifikatory, synlar üçin amatly)
- domain-markalar: 'scope/roles', 'tenant', 'kyc _ level' we ş.m.
2. 3 Gol (signature)
JWS = `sign(base64url(header) + "." + base64url(payload), private_key)`
Barlag: jemgyýetçilik açary we serweriň garaşýan algoritmi bilen berk gabat gelýär.
3) Barlagyň esasy üýtgemeleri
1. Algoritm 'header' mazmunyna ynanman, çeşme-serweriň (allow-list) konfigurasiýasy bilen kesgitlenýär. alg`.
2. 'iss' we 'aud' -y takyk gabat gelmek üçin barlaň, 'exp/nbf' - kiçijik 'clock _ skew' (30-60s ±) göz öňünde tutulyp.
3. Diňe ýeke-täk açar we aýlaw ýok bolsa, "kid" belgisiz ret etmek; ýogsam 'kid' -ni talap etmeli.
4. Obýekt derejesinde ygtyýarnamasyz hiç bir bellige ynanmaň (BOLA-first).
5. Parsing - kripto barlagyndan soň; kodlaşdyrylýança esasy ölçegleri barlamak.
4) JWS vs JWE
JWS: gol çekildi, ýöne okaýarys. Payload PII/syrlary goýmaň.
JWE: payload; integrasiýa has kyn, esasy model kritikdir.
API-leriň köpüsinde JWS + payload-da duýgur maglumatlary gadagan etmek ýeterlikdir.
5) Tokeniň ömri
Access: gysga möhlet (5-30 minut).
Refresh: has uzyn (7-30 gün), rotate-on-use (bir gezek ulanylýan), "gara sanawy" 'jti/sid' saklamak.
Revocation: TTL bilen 'jti' sanawlary, opaque-tokenler üçin introspektsiýa, hadysalarda 'exp' gysgaldylýar.
Açar aýlawy: JWKS (köne + täze), "Açar aýlawy" makalasyna serediň.
6) Ýygy-ýygydan gowşaklyklar we olary nädip ýapmaly
6. 1 'alg = none '/algoritmi çalyşmak
Netije: serwer 'alg' meýdanyna ynanýar we gol çekilmedik tokeni kabul edýär.
Gorag: serwerdäki algoritmleriň gaty allow-list; 'none' we garaşylmadyk bahalary ret etmek.
6. 2 RS256 → HS256 swap (simmetrizasiýa)
Netije: hüjümçi 'alg' HS256 çalyşýar we HMAC-syr hökmünde köpçüligiň açaryny ulanýar.
Gorag: açary konfigurasiýa algoritmine birikdirmek; simmetrik/asimmetrik üpjün edijileri bir 'kid' -de garyşdyrmaly däldir.
6. 3 Açar sanjymlary ('kid/jku/x5u')
Ssenariler:- 'jku' hüjümçi tarapyndan dolandyrylýan JWKS-ni görkezýär (açaryny dakar).
- 'x5u '/' x5c' daşarky şahadatnamalary hyýanatçylykly ulanmak.
- 'kid' ýoly bilen/SQL ('../../privkey. pem '' veya '' 'OR 1 = 1 --' ').
- Uzakdaky 'jku/x5u' -ny äsgermezlik ediň ýa-da domenleriňizi berk allow-list süzüň.
- 'kid' -ni diňe ýerli katalogda açar hökmünde (tablo/kesh), faýl ýollary/SQL konkatenasiýasyz ulanyň.
- JWKS ynanylan URL-den ýüklemek, gysga TTL, gol/pinning kanaly.
6. 4 HS256 gowşak syrlary (brutfors)
Netijesi: HMAC-gizlin gysga/syzmak → goly çalyşmak.
Gorag: asimmetriýany (RS/ES/PS) ýa-da syryň uzynlygyny ulanmak ≥ 256 bit, syrlar - diňe KMS-de.
6. 5 Ýok/galyp däl markalar
Ýok 'aud '/' iss '/' exp' → tokeni kross-service üçin amatly ýa-da tükeniksiz.
Gaty uzyn 'exp' → eglişik töwekgelçiligi.
Gorag: 'exp' gysga, 'nbf '/' iat' -ni 'clock _ skew' bilen tassyklamaly.
6. 6 Replay we token ogurlamak
Düýp manysy: tokeni tutmak/gaýtalamak (loglarda syzmak, XSS, TLS-siz MitM).
Gorag:- TLS везде, `Secure`+`HttpOnly` cookie, SameSite=Lax/Strict.
- Hyzmatdaşlar üçin DPoP/PoP (tokeni müşderi açary bilen baglanyşdyrmak) we/ýa-da mTLS.
- Gysga 'exp', refresh-rotasiýa, device-binding.
6. 7 XSS/ammar arkaly syzmak
JWT-ni 'localStorage '/' sessionStorage' → JS-de saklamak.
Gorag: access-tokenleri HttpOnly-cookie-de saklamak (cookie-model mümkin bolsa) + berk CSP/Trusted Types.
SPA üçin cookie ýok - belligi ýatda izolirlemek, minimal ýaşamak, XSS-den goramak.
6. 8 CSRF
Düýp manysy: kuku sessiýalarynda üçünji tarapyň saýtyndan haýyşlar.
Gorag: SameSite, anti-CSRF bellikleri (double submit), 'Origin/Referer' barlag, Fetch-Metadata süzgüçleri.
6. 9 Oversize/Ölçegi hyýanatçylykly peýdalanmak
Düýp manysy: ullakan töleg/sözbaşylar, parsing üçin DoS.
Gorag: sözbaşy/beden ölçegleriniň çäkleri, early-reject 431/413, bellikleriň fiks-toplumy.
6. 10 'typ '/' cty' çalyşmagy
Esasy zat: JOSE obýektleri tarapyndan ýerleşdirilen görnüşleriň bulaşyklygy ('typ:' JWT '').
Gorag: Howpsuzlyk üçin 'typ/cty' -ni äsgermezlik ediň, kesgitlenen algoritmlere we belliklere bil baglaň.
7) Bellikleri saklamak we geçirmek
7. 1 Serwer API (machine-to-machine)
mTLS/HMAC, has gowusy JWT üçin asimmetriýa, kanallar - mesh arkaly.
Açar ammary - KMS/HSM, meýilnama boýunça aýlanma, JWKS bilen örtük.
7. 2 Brauzer müşderileri
HttpOnly Secure Cookie для access/refresh; gysga TTL; täzelenme - "silent refresh" bilen 'SameSite = None' diňe HTTPS-de.
Berk CSP, Ygtybarly görnüşler, XSS-den goramak; SPA üçin - mümkin bolsa, belligi diskde saklamaň.
8) JWKS, aýlaw we yzyna almak
JWKS ygtyýarlandyryjy tarapyndan çap edilýär; sarp edijiler 5-15 minut keş.
Aýlanyş meýilnamasy: täze 'kid' goşmak → olara gol çekip başlamak → N günden soň JWKS → purge-den köne belgini aýyrmak.
Jogap: 'jti/sid' c TTL sanawlary; waka ýüze çykan halatynda "exp" we fors-logout (refresh maýyp etmek) wagtlaýynça gysgaldylýar.
9) Multi-tenant we maglumatlary azaltmak
'tenant '/' org' belgisini diňe arhitektura boýunça açmak; "sub" -da PDP-den atributlary çekmek.
PII ýok; iň az bellik toplumy → syzmak we korelýasiýa töwekgelçiligi az.
10) Iş ýüzünde tassyklaýyş çek-sanawy (resurs serweri)
- Parsim diňe goly we esasy ululyk çäkleri barlanylandan soň.
- 'alg' konfigurasiýadan; garaşylmadyk zatlary ret etmek.
- Barlaň 'iss' ∧ 'aud' ∧ 'exp' ∧ 'nbf' ∧ 'iat' (c 'clock _ skew').
- 'kid' -ni ýerli katalog/JWKS (gysga TTL) boýunça barlaň.
- Daşarky görkezijileri süzmek/kadalaşdyrmak ('jku/x5u' - diňe allow-list).
- Bellikleriň uzynlygyny/düzümini çäklendirmek (shema).
- Çeşmä obýekt ygtyýarnamasyny ulanmak (BOLA-first).
- 'kid', 'sub', 'aud', 'iss', 'jti', 'exp', 'tenant', 'trace _ id' (PII-siz).
- Gol ýalňyşlyklarynyň, gijikdirmeleriň, aýlaw barlagynyň metrikleri.
11) Howpsuz syýasatlaryň mysallary (psevdo)
11. 1 Algoritmiň garaşylýan konfigurasiýasy
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 Uzakdaky 'jku/x5u' -dan ýüz öwürmek
yaml reject_untrusted_key_sources: true allowed_jku_hosts: ["auth. example. com"] # if absolutely necessary
11. 3 Synlaryň sanawynyň mysaly (Redis)
pseudo if redis. exists("revoke:jti:" + jti) then deny()
if now() > exp then deny()
12) Gözegçilik we forensika
Метрики: `jwt_verify_fail_total{reason}`, `jwt_expired_total`, `jwks_refresh_total`, доля `kid`.
Loglar (gurluş): 'iss/aud/sub/kid/jti/exp/tenant/trace _ id', şowsuzlygyň sebäbi.
Daşbordlar: "ýakyn wagtda gutarýar", walidasiýa ýalňyşlyklarynyň köpelmegi, sebitler/müşderiler boýunça paýlanyş.
Alertler: 'verify _ fail' (gol/algoritm), JWKS ýalňyşlyklary, möhleti geçen tokenleriň paýy.
13) Antipatternler
Belgiden 'alg' -e ynanmak; 'none' -ni saklaň.
Uzak ömürli access-tokenler we refresh-rotasiýa ýoklugy.
KMS-siz ENV-de gysga syrly/syrly HS256.
Islendik domenden 'jku/x5u' kabul et; JWKS-i allow-listsiz dinamiki ýükläň.
PII/syrlary JWS tölegine salyň.
XSS töwekgelçiligi bar bolsa, 'localStorage' -de bellikleri saklamak.
Tassyklama hatalaryny öçürmek ("soft error" -dan 200 yzyna gaýtarmak).
BOLA barlaglarynyň ýoklugy we diňe 'scope/role' bil baglamak.
14) iGaming/Maliýe aýratynlyklary
Bellikler: 'kyc _ level', 'risk _ tier', 'tenant', berk 'aud'.
Write amallary üçin gysga TTL (goýumlar/netijeler), möhüm ugurlar üçin PoP/DPoP ýa-da mTLS.
Düzgünleşdiriji audit: girişleriň/şowsuzlyklaryň üýtgemeýän žurnallary, region çäklerinde ýazgylaryň saklanylmagy.
Hyzmatdaşlarda/PSP-de aýratyn açarlar/' aud ', per-tenant açarlary we aýratyn JWKS bar.
15) Prod-taýynlyk çek-sanawy
- Gaty allow-list algoritmleri; 'none' gadagan.
- 'iss/aud/exp/nbf/iat/jti' barlanýar; gysga 'exp'.
- JWKS bilen örtük, gysga TTL nagt; kid paýlarynyň gözegçiligi.
- Refresh — rotate-on-use; TTL bilen 'jti/sid' sanawlary; synlaryň oýun bukjasy.
- Kritik ugurlarda PoP/DPoP ýa-da mTLS.
- Brauzer üçin HttpOnly-cookies, CSP/Trusted Types vs XSS; CSRF goragy.
- PII-siz payload; iň az bellik toplumy.
- Tassyklamak we ret etmek boýunça metrikler/ýazgylar; alertler JWKS/verify_fail.
- Negatiw ssenariýalaryň synaglary: RS → HS swap, 'kid' inýeksiýa, 'jku' spoofing, oversize, clock-skew.
16) TL; DR
Algoritmiňizi we açarlaryňyzy serweriň gapdalynda goýuň, bellikden 'alg' -a ynanmaň, 'iss/aud/exp/nbf/iat/jti' -ni talap ediň. Açarlary JWKS arkaly örtük bilen öwrüň, bellikleri gysga ömürli, refresh bolsa bir gezek ulanmaly. Bellikleri howpsuz saklaň (Web üçin HttpOnly-cookie), bellikleri azaldyň, PII goýmaň. 'jku/x5u/kid' -wektorlary ýapyň, gowşak syrly HS256 gaça duruň, möhüm ýollarda PoP/DPoP ýa-da mTLS goşuň we hemişe çeşme derejesi üçin BOLA barlaglaryny geçiriň.