מפענח / מאמת JWT

פענוח ה-header וה-payload של JWT, אימות החתימה, וצפייה במועד התפוגה.

טוקן

מה זה JSON Web Token

JSON Web Token (JWT) הוא דרך קומפקטית ועצמאית לשאת קבוצת claims — הצהרות כמו "זה משתמש 42" או "הטוקן הזה פג בצהריים" — בצורה שניתן לאמת. JWT נמצאים בכל מקום באימות מודרני: אחרי התחברות, שרת לרוב מוסר לדפדפן שלך JWT חתום, וכל בקשה מאוחרת כוללת אותו כדי שהשרת יוכל לסמוך על מי אתה בלי לחפש שום דבר. מכיוון שהטוקן נושא את ה-claims והחתימה שלו, מתארים אותו כ"חסר מצב" (stateless).

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

שלושת החלקים

  • Header: מתאר כיצד הטוקן חתום, בעיקר האלגוריתם ("alg", למשל HS256 או RS256) וסוג הטוקן.
  • Payload: ה-claims עצמם — אובייקט JSON עם שדות כמו sub (נושא/משתמש), exp (תפוגה), iat (זמן הנפקה) וכל נתון מותאם-אישית שהמנפיק הוסיף.
  • Signature: ערך קריפטוגרפי המחושב על ה-header וה-payload עם secret או מפתח פרטי. זה מה שהופך JWT לאמין: שנה תו אחד ב-payload והחתימה כבר לא תתאים.

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

אימות החתימה

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

  • HMAC (HS256, HS384, HS512): סכמה סימטרית. אותו secret משותף גם חותם וגם מאמת. ספק את ה-secret הזה כדי לאמת.
  • RSA ו-ECDSA (RS256, PS256, ES256 וחבריהם): סכמות אסימטריות. מפתח פרטי חותם ומפתח ציבורי מאמת. ספק את המפתח הציבורי בפורמט PEM כדי לאמת — אתה לעולם לא צריך את המפתח הפרטי רק כדי לבדוק טוקן.

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

קריאת ה-claims הסטנדרטיים

חופן שמות claim הם סטנדרטיים (נקראים "registered claims"). הכלי מתייג אותם וממיר את אלה מבוססי-הזמן מ-Unix timestamps גולמיים לזמן המקומי שלך, עם סטטוס בשפה ברורה כדי שתראה במבט אם טוקן תקף, פג או עדיין לא בתוקף:

  • exp — זמן תפוגה: אחרי הרגע הזה יש לדחות את הטוקן.
  • nbf — not before: הטוקן לא תקף עד הרגע הזה.
  • iat — issued at: מתי הטוקן נוצר.
  • iss — issuer: מי יצר את הטוקן.
  • sub — subject: על מי או על מה הטוקן (לרוב מזהה משתמש).
  • aud — audience: למי הטוקן מיועד.
  • jti — מזהה ייחודי לטוקן.

שאלות נפוצות

האם הטוקן או המפתח שלי נשלחים לאנשהו?
לא. הפענוח ואימות החתימה רצים כולם בדפדפן שלך באמצעות Web Crypto API. הטוקן, ה-secret והמפתח הציבורי לעולם אינם עוזבים את המכשיר שלך, כך שבטוח לבחון טוקנים מפרודקשן.
אילו אלגוריתמי חתימה אפשר לאמת?
HMAC (HS256, HS384, HS512) עם secret משותף, ו-RSA (וריאנטים RS ו-PS) ו-ECDSA (ES256, ES384) עם מפתח ציבורי בפורמט PEM. האלגוריתם מזוהה אוטומטית מה-header של הטוקן.
האם JWT מוצפן?
לא. JWT חתום סטנדרטי רק מקודד, לא מוצפן — כל אחד יכול לקרוא את ה-header וה-payload שלו. החתימה מוכיחה שהטוקן לא שונה, אבל היא לא מסתירה את התוכן, אז לעולם אל תאחסן סודות ב-payload.
האם אני צריך את המפתח הפרטי כדי לאמת טוקן RS256?
לא. אלגוריתמים אסימטריים מאמתים עם המפתח הציבורי. אתה צריך את המפתח הפרטי רק כדי ליצור (לחתום) טוקן, לעולם לא כדי לבדוק אותו.
למה הטוקן שלי מוצג כפג?
ה-claim בשם exp נמצא בעבר יחסית לשעון המכשיר שלך. הכלי ממיר את exp, nbf ו-iat לזמן המקומי שלך ומציג סטטוס כדי שתוכל לאשר את חלון התוקף של הטוקן במבט.
מה ההבדל בין HS256 ל-RS256?
HS256 סימטרי: secret משותף אחד גם חותם וגם מאמת, מה שהכי פשוט כשאותו צד עושה את שניהם. RS256 אסימטרי: מפתח פרטי חותם ומפתח ציבורי מאמת, מה שמאפשר לצדדים רבים לאמת טוקנים בלי יכולת לזייף אותם.
אפשר לערוך את ה-payload ולחתום מחדש על הטוקן?
הכלי הוא קריאה-בלבד: הוא מפענח ומאמת אבל לא יוצר או חותם מחדש טוקנים. זה שומר עליו ממוקד ונמנע מטיפול במפתחות חתימה פרטיים.