מפענח / מאמת 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 ולחתום מחדש על הטוקן?
- הכלי הוא קריאה-בלבד: הוא מפענח ומאמת אבל לא יוצר או חותם מחדש טוקנים. זה שומר עליו ממוקד ונמנע מטיפול במפתחות חתימה פרטיים.