JWT 'կառուցվածք և խոցելիություն
1) Ի՞ նչ է JWT-ը և որտեղ է այն օգտագործվում
JWT-ը կոմպակտ ինքնաբուխ հայտարարությունների կոնտակտ է (claims) "Baseae Urll (header) ձևաչափով։ Base64Url(payload). Base64Url(signature)`.
Օգտագործվում է
JWS (ստորագրված հոսանքներ - իսկություն/ամբողջականություն),
JWE (գաղտնագրված հոսանքներ - գաղտնիություն),
OIDC/OAuth2 որպես international/ID հոսանքներ, ինչպես նաև 108-to-105։
Պլյուսներ ՝ ինքնավարություն, հավասարակշռություն, փոքր ծախսեր։ Մինուսներ 'սխալ վալիդացիայի ռիսկ, բարդ հետադարձ կապ։
2) JWT կառուցվածքը
2. 1 Վերնագիր (header, JSON)
Նվազագույն 'ալգորիթմ և բանալին։
json
{ "alg": "ES256", "kid": "jwt-2025-10", "typ": "JWT" }
'alg': Ստորագրման ալգորիթմ/2019 (RS256/ES256/PS256/HS256 և այլն)։
'kid': բանալին ցուցիչ (JWKS-ռոտացիայի համար)։
Օբյեկտիվ աղբյուրները բացատրվում են ՝ «jku», «x5u» (տե՛ ս 246 խոցելիությունը։ 3).
2. 2 Օգտակար նախաձեռնություն (payload, JSON)
Ստանդարտացված կլեյմեր
`iss` (issuer), `aud` (audience), `sub` (subject)
«exp» (ժամանակը), «nbf» (ոչ շուտ), «iat» (հրատարակված)
«jti» (rocken, հարմար է ակնարկների համար)
domain-cleims: «scoase/roles», «tenae», «kyc _ level» և այլն։
2. 3 Ստորագրություն (signature)
JWS = `sign(base64url(header) + "." + base64url(payload), private_key)`
Ստուգում 'խստորեն ներկայացված հանրային բանալին և հենց այն ալգորիթմը, որը սերվերը ակնկալում է։
3) Ստուգման հիմնական ինվարանտները
1. Ալգորիթմը ամրագրված է ռեսուրսի սերվերի (allow-list) միգրացիայի միջոցով, այլ ոչ թե վստահում է պարունակվող «header» -ին։ alg`.
2. Ստուգել «iss» և «aud» ճշգրիտ համընկնումը, «exp/nbf», հաշվի առնելով փոքրիկ «clock _ skew» (թիվ 30-60s)։
3. Առանց «kid» հոսանքի մերժելը միայն այն դեպքում, եթե միակ բանալին չկա ռոտացիա։ հակառակ դեպքում 'պահանջել «kid»։
4. Մի վստահեք որևէ սոսինձ առանց օբյեկտի (BOLA-first)։
5. Պարսինգը 'քրիպտոպրովերայից հետո։ չափի հիմնական ստուգումները մինչև վերացումը։
4) JWS vs JWE
JWS 'ստորագրվել է, բայց կարդում ենք։ Մի տեղադրեք payload PII/գաղտնիքները։
JWE: կոդավորում է payload; ավելի բարդ ինտեգրումը, հիմնական մոդելը քննադատական է։
API-ի մեծ մասում բավական է JWS + արգելքը payload-ի զգայուն տվյալների վրա։
5) Հեղուկի կյանքի ցիկլը
Մոսկվա ՝ կարճ ժամանակահատվածը (5-30 րոպե)։
Refresh: ավելի երկար (7-30 օր), rotate-on-use (միանգամյա), պահել "սև ցուցակը" 'jti/sid "։
Revocation: «jti» ցուցակները TTL-ի հետ, opaque-Toxens-ի ինտրոպիա, միջադեպերի ժամանակ «exp» կրճատումը։
Միգրանտների ռոտացիան 'JWKS-ը համընկնումով (հին + նոր), տե՛ ս «Միգրացիան» հոդվածը։
6) Հաճախակի խոցելիությունները և ինչպես փակել դրանք։
6. 1 'alg = none '/ալգորիթմի փոփոխությունը
Իմաստն այն է, որ սերվերը վստահում է դաշտին 'alg' և ընդունում է չգրված հոսանք։
Պաշտպանություն 'կոշտ allow-list ալգորիթմներ սերվերի վրա։ շեղել «none» և անսպասելի արժեքներ։
6. 2 RS256 ww.HS256 swap (սիմետրիզացիա)
Բանն այն է, որ հարձակվողը փոխում է «ալգը» HS256-ում և օգտագործում է հանրային բանալին որպես HMAC գաղտնիք։
Պաշտպանություն 'կապել ալգորիթմին միգրացիայի հետ։ մի խառնեք սիմետրիկ/ասիմետրիկ պրովայդերները մեկ 'kid'։
6. 3 Միգրացիա 2019 («kid/jku/x5u»)
Սցենարներ
«jku» -ը ցույց է տալիս, որ վերահսկվում է JWKS հարձակվողի կողմից (հաշվում է իր բանալին)։
«x5u »/« x5c» արտաքին հավաստագրերի չարաշահումը։
"kid" 'ճանապարհի/SQL (' "../../privkey։ pem" կամ "OR 1 = 1 - ")։
Պաշտպանություն
Անտեսել հեռավոր «jku/x5u» կամ ֆիլտրել խիստ allow-list ածխաջրածինների վրա։
"kid 'օգտագործել միայն որպես բանալին տեղական տարբերակում (www.ces), առանց հիբրիդային ճանապարհների/SQL կոնկենսացիաների։
JWKS-ը բեռնվում է URL-ի վստահված, կարճ TTL-ի, ստորագրության/pinning ջրանցքի հետ։
6. 4 Թույլ գաղտնիքները HS256 (Բրուտֆորս)
Բանն այն է, որ HMAC գաղտնիքը կարճ/բադր է ստորագրությունը փոխելու համար։
Պաշտպանություն 'օգտագործել ասիմետրիա (RS/ES/PS) կամ գաղտնիության երկարությունը 24256 բիթ, գաղտնիքները միայն KFC-ում։
6. 5 Բացակայում/ոչ որակյալ սոսինձ
Ոչ 'aud '/« iss '//» exp' international cross-ծառայողական կամ անսահման։
Չափազանց երկար «exp» -ը վարկաբեկման ռիսկ է։
Պաշտպանություն 'պահանջել կլեյմերի ամբողջական հավաքածու, "exp" կարճ, "nbf '/" iat' valivation's 'clock _ skew"։
6. 6 Replay եւ գողություն
Բանն այն է, որ կոտրելը/պտուտակը (արտահոսքը լոգարաններում, XIV, MitM առանց TLS)։
Պաշտպանություն
TLS везде, `Secure`+`HttpOnly` cookie, SameSite=Lax/Strict.
DPoP/PoP (միացումը հաճախորդի բանալին) և/կամ mTRK գործընկերների համար։
Կարճ «exp», refresh-ռոտացիա, device-binding։
6. 7 Արտահոսք XIV/պահեստի միջոցով
Էությունը 'JWT պահպանումը' www.alStorage '/« sessionStorage »-ը հասանելի է JS-ում։
Պաշտպանություն 'պահպանեք թոքերը Conly-cookie-ում (եթե հնարավոր է cookie-մոդել) + խիստ CSP/Trusted Types-ում։
SPA-ի համար առանց cookie-ը հիշողության մեջ հոսանք է, նվազագույն ապրել, պաշտպանել XIV-ից։
6. 8 CSRF
Բանն այն է, որ cookie-2019-ի դեպքում կողմնակի կայքից հարցումները։
Պաշտպանություն ՝ SoftSite, anti-CSRF թոկեններ (double corit), «Origin/Referer» ստուգում, Fetch-Metadata ֆիլտրեր։
6. 9 Oversize/չափսի չարաշահում
Էությունը 'հսկայական payload/վերնագրեր, DoS պարսինգի վրա։
Պաշտպանություն ՝ վերնագրերի/մարմնի չափի սահմաններ, early-reject 431/413, կլեյմի ֆիքսված հավաքածու։
6. 10 Փոխարենը 'typ '/' cty'
Բանն այն է, որ տեսակների խառնաշփոթը ("typ: " JWT "), որը ներդրվել է JOSE օբյեկտների կողմից։
Պաշտպանություն 'անտեսել «typ/cty» անվտանգության համար, ապավինել ֆիքսված ալգորիթմներին և կլեյմների սխեմային։
7) Տոկենների պահպանումը և փոխանցումը
7. 1 Սերվերային API (machine-to-machine)
MTIM/HMAC-ը, նախընտրում է ասիմետրիա JWT-ի համար, ջրանցքները 'mesh-ի միջոցով։
Տերմինալի պահուստը KFC/HSM է, ժամանակացույցի լուծումը, JWKS-ը 'համընկնումով։
7. 2 Զննարկիչ հաճախորդներ
HttpOnly Secure Cookie для access/refresh; կարճ TTL; նորարարությունը «silent refresh» -ի միջոցով '«SoftSite = None» -ի միջոցով միայն HTTPS-ի տակ։
Խիստ CSP, Trusted Types, պաշտպանել XIV-ից։ SPA-ի համար, հնարավորության դեպքում չպահանջել հոսքը։
8) JWKS, միգրացիա և արձագանք։
JWKS-ը հրապարակվում է հեղինակի կողմից։ սպառողները քաշում են 5-15 րոպե։
Ռոտացիայի պլանը 'ավելացնել նոր' kid 'intel-ը սկսել դրանք N օրվա ընթացքում հեռացնել հին JWKS-ից purge-ից։
Ակնարկ '«jti/sid' c TTL» ցուցակները; Պատահականության դեպքում ժամանակավորապես կրճատել «exp» և fors-logout (հաշմանդամացնել refresh)։
9) Multi-tenae-ը և տվյալների նվազեցումը
Ներառել 'tenault '/' org' -ը հոսանքի մեջ միայն եթե անհրաժեշտ է ճարտարապետությամբ։ հակառակ դեպքում ձգեք ատրիբուտները PDP-ից 'sub'։
Ոչ մի PII; կլեյմների նվազագույն քանակը ավելի քիչ է արտահոսքի և կորլյացիայի վտանգը։
10) Գործնական չեկի թերթիկը (ռեսուրսի սերվեր)
- Պարսիմ միայն ստորագրությունը ստուգելուց և չափի հիմնական սահմաններից հետո։
- «alg» կազմաձևից; շեղել անսպասելի։
- Ստուգել 'iss' me 'aud' exp 'nbf' www.iat '(«clock _ skew»)։
- Ստուգել «kid» տեղական մոդուլով/JWKS (կարճ TTL)։
- Ֆիլտրել/նորմալացնել արտաքին նշանները («jku/x5u» - միայն allow-list)։
- Սահմանափակել երկարությունը/բաղադրությունը (սխեման)։
- Օգտագործեք օբյեկտի հեղինակային իրավունքը ռեսուրսների վրա (BOLA-first)։
- Տրամաբանություն 'kid', 'sub', «aud ',» is', «jti ',» exp', «tenae», «trace _ id» (առանց PII)։
- Ստորագրման սխալները, ժամկետները, պարտատոմսերը։
11) Անվտանգ քաղաքական գործիչների օրինակները (կեղծ)
11. 1 Ալգորիթմի սպասումների կազմաձևումը
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»
yaml reject_untrusted_key_sources: true allowed_jku_hosts: ["auth. example. com"] # if absolutely necessary
11. 3 Ակնարկների ցանկը (Redis)
pseudo if redis. exists("revoke:jti:" + jti) then deny()
if now() > exp then deny()
12) Դիտողությունն ու ֆորենզիկան
Метрики: `jwt_verify_fail_total{reason}`, `jwt_expired_total`, `jwks_refresh_total`, доля `kid`.
Լոգները (կառուցվածքային) '«iss/aud/sub/kid/jti/exp/tenae/trace _ id», ձախողման պատճառը։
Դաշբորդներ ՝ «շուտով», վալիդացիայի սխալների աճը, տարածումը տարածաշրջաններով/հաճախորդներին։
Ալբերտները '«verify _ fail» (ստորագրություն/ալգորիթմ), JWKS սխալները, ժամկետանց հոսանքների մասնաբաժինը։
13) Անտիպատերնի
Վստահել 'alg' -ից։ աջակցել 'none'։
Երկար գոյատևող հիվանդություններ և refresh-ռոտացիայի բացակայություն։
HS256 կարճ գաղտնիքով/գաղտնիքը ENV-ում առանց KFC-ի։
Վերցնել «jku/x5u» ցանկացած տիրույթից։ դինամիկ կերպով բեռնել JWKS առանց allow-list։
PII/գաղտնիքները payload JWS-ում։
Պահել «www.alStorage» -ում XIV ռիսկերի առկայության դեպքում։
Խեղդել վալիդացիայի սխալները (վերադարձնել 200-ից «senserror» -ից)։
BOLA-ստուգումների բացակայությունը և վստահությունը միայն «scope/role» -ի վրա։
14) iGaming/ֆինանսական առանձնահատկությունները
Կլեյմները ՝ «kyc _ level», «risk _ tier», «tenault», խիստ «aud»։
Կարճ TTL-ը write վիրահատությունների համար (դեպոզիտներ/եզրակացություններ), PoP/DPoP կամ mTSA-ի համար կրիտիկական երթուղիների համար։
Կարգավորող աուդիտ 'մուտքերի/ձախողումների անփոփոխ ամսագրեր, լոգարանների պահպանում տարածաշրջանի սահմաններում։
Գործընկերները/PSA-ն ունեն առանձին բանալիներ/' aud ", բանալիների նախկին ստենանտը և առանձին JWKS-ը։
15) Չեկ-թուղթ պատրաստակամության համար
- Կոշտ allow-list ալգորիթմներ; «none» արգելված է։
- 'iss/aud/exp/nbf/iat/jti "ստուգվում են; կարճ «exp»։
- JWKS-ը համընկնումով, կարճ TTL քեշով; dom 'kid "։
- Refresh — rotate-on-use; ցուցակները 'jti/sid' s TTL; ակնարկների թուղթ։
- PoP/DPoP կամ mTRK կրիտիկական երթուղիների վրա։
- Windows Only-cookies զննարկչի համար, CSP/Trusted Types դեմ XIV; CSRF պաշտպանություն։
- Առանց PII payload; կլեյմի նվազագույն հավաքածու։
- Metriki/Logs ըստ valivation-ի, JWKS/verify _ fail ալտերտերը։
- Բացասական փորձարկումներ ՝ RS 35HS swap, «kid 'injection,» jku' spoofing, oversize, clock-skew։
16) TL; DR
Գրեք ալգորիթմը և բանալիները սերվերի կողմում, մի վստահեք 'alg' s/aud/exp/nbf/iat/jti "։ Միացրեք ստեղները JWKS-ի միջոցով, համընկնեք կարճ, իսկ refresh-ը միանվագ է։ Պահեք հոսանքները ապահով (Windows Only-cookie), նվազեցրեք կլեյմերը, մի տեղադրեք PII-ը։ Փակեք 'jku/x5u/kid' vectors, խուսափեք HS256 թույլ գաղտնիքներից, ավելացրեք PoP/DPoP կամ mTRK-ը կրիտիկական ճանապարհների վրա և միշտ BOLA ստուգումներ կատարեք ռեսուրսների մակարդակի վրա։