JWT: מבנה ופגיעות
1) מהו JWT והיכן משתמשים בו
JWT הוא מיכל תביעות עצמאי קומפקטי בפורמט Base64Url (כותרת). Base64Url (מטען). Base64Url (חתימה) ".
משמש ל:- JWS (אסימונים חתומים - אותנטיות/שלמות),
- JWE (אסימונים מוצפנים - פרטיות),
- OIDC/OAuth2 כמו אסימוני גישה/תעודת זהות כמו גם אימות שירות לשירות.
מקצוענים: אוטונומיה, קבילות, תקורה נמוכה. חסרונות: סיכון לאימות שגוי, מקרי החזרה מורכבים.
2) מבנה JWT
2. כותרת 1 (JSON)
מינימום: אלגוריתם ומזהה מפתח.
json
{ "alg": "ES256", "kid": "jwt-2025-10", "typ": "JWT" }
אלגוריתם חתימה/הצפנה (RS256/ES256/PS256/HS256, וכו ').
מצביע למפתח (לסיבוב JWKS).
מקורות מפתח אופציונליים: 'jku', 'x5u' (ראה נקודות תורפה # 6. 3).
2. 2 מטען (JSON)
בולים סטנדרטיים:- 'iss' (שליח),' ad '(קהל),' sub '(נושא)
- 'exp' (זמן תפוגה), 'nbf' (לא לפני), 'iat' (הנפיק)
- 'Jti' (תעודת זהות סמלית, ביטול)
- חותמות דומיין: ”היקף/תפקידים”, ”דייר”, ”kyc _ level” וכו '.
2. 3 חתימה
JWS = 'sign (base64url (header) +. ”+ base64url (payload), private_key)”
אימות: מפתח ציבורי מתאים בדיוק ובדיוק האלגוריתם שהשרת מצפה לו.
3) סימון אינווריאנטים בסיסיים
1. האלגוריתם קבוע על ידי ההגדרות של שרת המשאבים (low-list), ולא ניתן לסמוך על התוכן של ”header”. אלג '.
2. בדוק אם יש התאמה מדויקת, ”exp/nbf” - אם לוקחים בחשבון את ”השעון הקטן _ skew” (שנות ה ־ 30-60).
3. למנוע אסימונים בלי ”ילד” רק אם יש מפתח אחד ולא סיבוב; אחרת, לדרוש 'ילד'.
4. אל תסמוך על בולים ללא אישור רמת אובייקט (BOLA-first).
5. אימות קריפטו לאחר ניתוחים; בדיקות גודל בסיסיות לפני פענוח.
4) JWS נגד JWE
חתום אך ניתן לקריאה. אל תשים מטען PII/סודות.
JWE: הצפנת מטען; אינטגרציה היא קשה יותר, מודל המפתח הוא קריטי.
ברוב ה-API, איסור JWS + על מידע רגיש במטען הוא מספיק.
5) מחזור חיים סמלי
גישה: לטווח קצר (5-30 דקות).
רענון: ארוך יותר (7-30 יום), סיבוב-על-שימוש (באופן חד-פעמי), שמור את "הרשימה השחורה" "jti/sid'.
ביטול: רשימות 'jti' with TTL, introspection עבור אסימונים אטומים, קיצור 'expp' עבור אירועים.
סיבוב מפתח: JWKS עם חפיפה (ישן + חדש), ראה המאמר ”סיבוב מפתח”.
6) נקודות תורפה וכיצד לסגור אותן
6. 1 &osposcallg = אין החלפת אלגוריתם '/
שורה תחתונה: השרת סומך על שדה ה ”אלג” ומקבל אסימון לא חתום.
הגנה: רשימה קשה של אלגוריתמים בשרת; דוחה 'none' וערכים בלתי צפויים.
6. 2 RS256 * החלפת HS256 (סימטריזציה)
שורה תחתונה: תוקף מחליף 'alg' with HS256 ומשתמש במפתח הציבורי כסוד HMAC.
הגנה: לקשור את המפתח לאלגוריתם עם תצורה; לא לערבב ספקים סימטריים/אסימטריים באחד.
6. 3 הזרקת מפתח (”kid/jku/x5u”)
תרחישים:- 'JKU' מצביע JWKS (יחליק המפתח שלה).
- x5u/x5 'c שימוש לרעה בתעודות חיצוניות.
- 'kid' with/SQL הזרקת נתיב ('.. "//פריקי. pem 'or' OR '1 = 1 -').
- התעלם מ ־ jku/x5u או מסנן על ־ ידי תחומים המחמירים ברשימה.
- 'Kid' schid' ll לשמש רק כמפתח בספרייה המקומית (שולחן/מטמון), ללא שבילי קובץ/קונקטורות SQL.
- טעינת JWKS מכתובות נאמנות, TTL קצר, ערוץ חתימה/פינג.
6. 4 סודות חלשים של HS256 (כוח גס)
שורה תחתונה: סוד HMAC הוא זיוף חתימה קצר/דלף.
הגנה: השתמש באסימטריה (RS/ES/PS) או באורך סודי של 256 סיביות, סודות - רק ב ־ KMS.
6. 5 בולים חסרים/לא תקפים
לא 'Aud'/' is '/' exp' אסימון הוא חוצה שירות או אינסופי.
סיכון ארוך מדי לפשרה.
הגנה: דרוש סט מלא של סימנים, ”exp” קצר, ”nbf ”/” iat” לאמת עם ”שעון _ skew”.
6. 6 שידור חוזר וגניבת סמלים
תמצית: יירוט/חזרה של אסימון (דליפה ביומנים, XSS, MITM ללא TLS).
הגנה:- עוגיית ”Secure” + ”HttpOnly”, אתר חפירה = Lax/Strict.
- DPoP/PoP (קשירת אסימון למפתח לקוח) ו/או mTLS לשותפים.
- קיצור ”exp”, רענון-סיבוב, התקן מחייב.
6. 7 דליפות XSS/אחסון
שורה תחתונה: אחסון JWT ב ־ ”אחסון ”/” אחסון ” זמין ל ־ JS.
הגנה: אסימוני גישה לחנות ב-HttpOnly-Cookie (אם מודל העוגיות אפשרי) + CSP/Trust Types.
עבור ספא ללא עוגיות - לבודד את האסימון בזיכרון, לחיות באופן מינימלי, להגן מפני XSS.
6. 8 CSRF
השורה התחתונה: במהלך פגישות עוגיות, בקשות מאתר צד שלישי.
הגנה: Survide Site, anti-CSRF tokens (הגשה כפולה), 'Origin/Referer' check, Fetch-Metadata filters.
6. 9 ניצול יתר של גודל/גודל
מטען/כותרות ענק, DOS על ניתוחים.
הגנה: הגבלת גודל הכותרת/גוף, דחייה מוקדמת 431/413, סט קבוע של בולים.
6. 10 הצבה "typ "/" cty&fs
מהות: בלבול של סוגים (”Typ: JWT”), אובייקטים מקוננים של חוזה.
הגנה: להתעלם ”Tip/Cty” לאבטחה, להסתמך על אלגוריתמים קבועים ותוכניות מיתוג.
7) אחסון והעברה
7. 1 APIs שרת (מכונה אל מכונה)
MTLS/HMAC, עדיף אסימטריה עבור JWT, ערוצים דרך רשת.
חנות מפתחות - KMS/HSM, סיבוב מתוכנן, JWKS חופף.
7. 2 לקוחות דפדפן
עוגייה מאובטחת HTTPLY Assess Access/Ranuh; קיצור TL; עדכון באמצעות ”רענון שקט” עם ”אתר חנייה” אף אחד לא תחת HTTPS.
CSP קפדן, טיפוסים מהימנים, להגן מפני XSS; לספא - אם אפשר, אל תאחסן את האסימון בדיסק.
8) JWKS, סיבוב והיזכרות
JWKS פורסם על ידי האישור; מטמון צרכנים במשך 5-15 דקות.
תכנית סיבוב: הוסף 'ילד' חדש. תתחיל אותם חתימה. = לאחר N ימים להסיר את הישן מטיהור JWKS.
משוב: רשימות jti/sid עם TTL; במקרה של תקרית, להפחית באופן זמני 'exp' ו-loading-out (רענון לנטרול).
9) ריבוי דיירים ומזעור נתונים
כלול ”דייר ”/” org” באסימון רק אם יש צורך בארכיטקטורה; אחרת, למשוך את התכונות מ PDP by 'sub.
אין מח "ש; מינימום של בולים = פחות סיכון לדליפות וקורלציה.
10) רשימת אימות מעשית (שרת משאבים)
[ ] פרסים רק לאחר אימות של חתימה ומגבלות גודל בסיסיות.
[ ] ”אלג” מהתצורה; לדחות את הבלתי צפויים.
[ ] Check 'is' is' is' ud' d' id' ud' d' exp' nbf 'iat' (עם ”שעון _ skew”).
[ ] בדוק בספרייה המקומית/JWKS (בקיצור TTL).
[ ] מסנן/מנרמל עצות חיצוניות ('jku/x5u' -רשימה חופשית בלבד).
[ ] הגבלת אורך בול/קומפוזיציה (scheme).
[ ] Object Resource Authority (BOLA-First).
[ ] בול עץ 'ילד', 'תת', 'אוד', 'is',' jti ',' exp ',' דייר ',' 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&fs
yaml reject_untrusted_key_sources: true allowed_jku_hosts: ["auth. example. com"] # if absolutely necessary
11. 3 רשימת משוב לדוגמה (רדיס)
pseudo if redis. exists("revoke:jti:" + jti) then deny()
if now() > exp then deny()
12) יכולת תצפית ושכיחות
”jwt _ verience _ fall _ total _ reason”, ”jwt _ fied _ total”, ”jwks _ runh _ total”.
לוגים (מובנים): 'is/aud/sub/kid/jti/exp/trace _ id', סיבה לכישלון.
לוחות מחוונים: ”פג תוקף בקרוב”, נחשול בשגיאות אימות, הפצה על ידי אזור/לקוח.
התראות: גידול של 'veriation _ fall' (חתימה/אלגוריתם), שגיאות JWKS, שיתוף אסימונים שפג תוקפם.
13) תרופות אנטי ־ פטריות
אמון 'alg' מסמל; תמיכה 'none'.
אסימוני גישה ארוכי חיים ולא סיבוב רענון.
HS256 עם סוד/סוד קצר ללא KMS.
קבל 'jku/x5u' מכל תחום; באופן דינמי להעמיס JWKS ללא הרשאות רשימה.
שים סודות פיי-איי-איי במטען JWS.
לאחסן אסימונים ב ”אחסון” כאשר קיים סיכון XSS.
דיכוי שגיאות אימות (החזר 200 S ”שגיאה רכה”).
אין בדיקת בולה והסתמכות רק על ”היקף/תפקיד”.
14) פרטים של iGaming/Finance
מותגים: "kyc _ level", "סיכון _ tier", "דייר", "aud' קפדני.
TTL קצר לפעולות כתיבה (מרבצים/יציאות), PoP/DPoP או mTLS למסלולים קריטיים.
ביקורת רגולטורית: יומנים בלתי ניתנים לשינוי של כניסות/כשלים, אחסון יומנים בתוך גבולות האזור.
לשותפים/PSP יש מפתחות נפרדים, מפתחות דייר ו ־ JWKS נפרדים.
15) רשימת מוכנות למומחים
[ ] קשה לאפשר רשימה של אלגוריתמים; ”אף אחד” אסור.
[ בודקים את ]/aude/exp/nbf/iat/jti; קיצור 'exp'.
[ ] חפפו את JWKS, מטמון TTL קצר; ניטור מניות 'ילד'.
[ ] רענון - לסובב-על-שימוש; 'jti/sid' lists עם TTL; ספר המהלכים.
[ ] PoP/DPoP או mTLS במסלולים קריטיים.
[ ] Httpally-cookies לדפדפן, CSP/Trust Types vs. XSS; הגנת CSRF.
[ ] אין מח "ש במטען; מינימום של סימנים.
[ ] אימות וכישלון מדדים/יומנים; מתריע JWKS/verify_fail.
בדיקות תרחיש שליליות: RS = החלפת HS, "ילד" - התלבטויות, "jku 'hoffing, גדול מדי, מחליק שעון.
16) TL; DR
תקן את האלגוריתם והמפתחות בצד השרת, אל תסמוך על ”alg” מהאסימון, ודרוש 'is/aud/exp/nbf/iat/jti'. לסובב מפתחות דרך JWKS חופפים, לשמור אסימונים קצר חיים ולרענן חד פעמי. לאחסן אסימונים באופן בטוח (HttpOnly-Cookie for the Web), למזער בולים, לא לשים PII. סגור 'jku/x5u/kild' וקטורים, להימנע HS256 עם סודות חלשים, להוסיף PoP/DPoP או mTLS על מסלולים קריטיים, ותמיד לעשות בדיקות בולה ברמת המשאב.