Menu

JWT Decoder

לפרק ולאמת JSON Web Tokens, חלק אחר חלק.

מאת Nethanel Bar, Co-founder & CEO

עודכן לאחרונה

מוכנים ללמוד תכנות באמת?

ב-Coddy לומדים דרך כתיבת קוד אמיתי בדפדפן: שיעורים אינטראקטיביים, משוב מיידי ועזרה מ-AI כשנתקעים.

מה זה JWT decoder?

JWT decoder מפצל JSON Web Token לשלושת החלקים שלו, header, payload וחתימה, ומפענח את שני הראשונים מ-Base64URL כדי שתוכלו לקרוא אותם כ-JSON. מפתחים משתמשים בו כל הזמן כשהם מנפים באגים בתהליכי התחברות, בהרשאות, ב-claims של סשן ובבעיות של תפוגת טוקנים.

לפענח JWT זה *לא* אותו דבר כמו לסמוך עליו. ה-header וה-payload קריאים מעצם התכנון: הם רק מקודדים ב-Base64URL, לא מוצפנים. האימות הוא מה שבודק אם הטוקן נחתם על ידי הגורם הצפוי ואם אף אחד לא שינה אותו.

JWT נראה כמו header.payload.signature. כל חלק מקודד ב-Base64URL, והחלקים מופרדים בנקודות. ה-header אומר באיזה אלגוריתם חתימה משתמשים, ה-payload נושא את ה-claims (מי המשתמש, מתי הטוקן פג, מה מותר לו לעשות), והחתימה מאפשרת לשרת להוכיח שהטוקן לא שונה.

מה תלמדו תוך כדי פענוח JWT

  • ל-JWT יש שלושה חלקים מקודדים ב-Base64URL שמופרדים בנקודות: header.payload.signature.
  • Claims נפוצים כמו sub, role, iat, nbf ו-exp מתארים זהות, הרשאות, זמן הנפקה וזמן תפוגה.
  • כל אחד יכול לערוך payload מפוענח, ורק החתימה מאפשרת לשרת לזהות שינוי.
  • האלגוריתמים שונים: HS256 משתמש בסוד משותף, ו-RS256 ו-ES256 משתמשים בזוגות של מפתח ציבורי ופרטי. השדה alg ב-header אומר לכם באיזה מהם השתמשו.

איך לפענח JWT שלב אחר שלב

  1. הדביקו את הטוקן המלא

    הדביקו את ה-JWT בתיבת הקלט. הוא אמור להיראות כמו xxxx.yyyy.zzzz: שלושה חלקים מקודדים ב-Base64URL שמחוברים בנקודות.

  2. קראו את ה-header

    ה-header אומר לכם מה אלגוריתם החתימה (alg) ומה סוג הטוקן. שימו לב ל-"alg": "none": זה אומר שהטוקן לא חתום ואי אפשר לסמוך עליו.

  3. קראו את ה-claims ב-payload

    ה-payload הוא ה-JSON עם כל ה-claims. חפשו את sub (מזהה המשתמש), exp (תפוגה), iat (זמן הנפקה), וכל claim מותאם אישית שהאפליקציה שלכם מוסיפה, כמו role או tenant.

  4. בדקו תפוגה

    המירו את חותמת הזמן של Unix ב-exp לתאריך. אם הוא בעבר, הטוקן פג וכל API שמתנהג כמו שצריך ידחה אותו.

  5. אמתו את החתימה (אופציונלי)

    אם יש לכם את הסוד או את המפתח הציבורי, הדביקו אותו בכלי האימות כדי לוודא שהחתימה תקינה. אפשר לסמוך על תוכן הטוקן רק כשהחתימה עוברת את הבדיקה.

Claims סטנדרטיים ב-JWT

אלה ה-claims הרשומים שמוגדרים במפרט של JWT (RFC 7519). כל אפליקציה יכולה להוסיף לצידם claims מותאמים אישית משלה.

Claimשםמשמעות
issIssuer (מנפיק)מי יצר וחתם על הטוקן
subSubject (נושא)על מי הטוקן מדבר, בדרך כלל מזהה משתמש
audAudience (קהל יעד)למי הטוקן מיועד
expExpiration (תפוגה)חותמת זמן Unix שאחריה הטוקן לא תקף
nbfNot Before (לא לפני)אסור לקבל את הטוקן לפני הזמן הזה
iatIssued At (זמן הנפקה)מתי הטוקן נוצר
jtiJWT IDמזהה ייחודי, שימושי לביטול טוקנים
algAlgorithm (ב-header)אלגוריתם החתימה: HS256, RS256, ES256, …

דוגמאות JWT לנסות

בדיקה של JWT טיפוסי

Token

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJ1c2VyXzEyMyIsInJvbGUiOiJzdHVkZW50IiwiZXhwIjoxNzEwMDAwMDAwfQ.Q3hH8yzqI2OsHJ1Lyj8jJfJPa5ZpIVlh1FhJpJbqMcs

Header
{  "alg": "HS256",  "typ": "JWT"}
Payload
{  "sub": "user_123",  "role": "student",  "exp": 1710000000}

ה-header אומר HS256 (אלגוריתם עם סוד משותף). ה-payload מזהה את המשתמש, את התפקיד שלו ומתי הטוקן פג. החתימה היא החלק השלישי. (זה טוקן לדוגמה בלבד, החתימה לא תאומת מול שום סוד אמיתי.)

בדיקה אם טוקן פג

Claim ב-payload
{  "exp": 1710000000}

exp הוא חותמת זמן של Unix בשניות. המירו אותו לתאריך: אם הוא בעבר, הטוקן פג ו-backend תקין ידחה אותו.

זיהוי אלגוריתם "none" מסוכן

Header
{  "alg": "none",  "typ": "JWT"}

אם שרת מקבל "alg": "none", תוקף יכול לזייף כל payload בלי חתימה. תמיד דחו את ה-header הזה ב-production.

טעויות JWT נפוצות

  • לשים סיסמאות, סודות או מידע אישי רגיש ב-payload. JWT קריא, לא מוצפן.
  • לפענח טוקן ולהניח שהוא תקף בלי לבדוק את החתימה.
  • לבלבל בין הקריאות של Base64URL להצפנה: ה-payload של JWT קל לקריאה בכוונה.
  • לשמור JWT ב-localStorage בלי לחשוב על ההשלכות של XSS, ואז לתת להם זמני תפוגה ארוכים מאוד.
  • לא לבדוק את ה-claim aud (קהל יעד): טוקן שהונפק לשירות אחד יכול לשמש נגד שירות אחר אם הצד המקבל לא בודק.

שאלות נפוצות על JWT

מה זה JWT?
JWT הוא ראשי תיבות של JSON Web Token. זה פורמט טוקן קומפקטי, חתום ובטוח לשימוש ב-URL, שמשמש להעברת claims בין שני צדדים, לרוב בין שרת לדפדפן כדי לייצג משתמש מחובר.
איך מפענחים JWT?
הדביקו את הטוקן ב-JWT decoder, או פצלו אותו לפי הנקודות ופענחו מ-Base64URL כל אחד משני החלקים הראשונים. ה-header וה-payload חוזרים כ-JSON, והחלק השלישי הוא החתימה.
איך בודקים אם JWT פג?
הסתכלו על ה-claim exp ב-payload. זו חותמת זמן של Unix בשניות. אם הזמן הנוכחי עבר את exp, הטוקן פג.
כל אחד יכול לפענח JWT?
כן. ה-header וה-payload מקודדים ב-Base64URL, לא מוצפנים. החתימה רק מוכיחה שאף אחד לא שינה את הטוקן, היא לא מסתירה את התוכן.
מה המשמעות של אימות JWT?
אימות מחשב מחדש את החתימה בעזרת הסוד או המפתח הציבורי הצפויים ומשווה אותה לחתימה שעל הטוקן. אם הן תואמות, אפשר לסמוך על ה-payload והוא לא שונה.
כדאי לשמור סיסמאות ב-JWT?
לא. כל מי שיש לו את הטוקן יכול לקרוא את ה-payload. שמרו רק מזהים ו-claims לא רגישים, והישענו על זמני תפוגה קצרים יחד עם refresh tokens בשביל אבטחה.

למידע נוסף

כלי פיתוח נוספים

איור של שפות התכנות ב-Coddy

ללמוד תכנות עם Coddy

להתחיל