פתיחת התפריט הראשי

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

המפתחות תוכננו להיות קצרים, בטוחים להעברה ב URL, ושמישים במיוחד בדפדפני אינטרנט בהקשר של SSO (שימוש במספר רב של מערכות באמצעות מפתח יחיד). "טענות" JWT משמשות באופן טיפוסי כדי להעביר את הזהות של משתמשים מאומתים בין "מספק הזהות" (Identity Provider) לבין נותן השירות (Service Provider), או כל סוג אחר של טענות (כלומר פריטי מידע) הנדרשים כחלק מתהליך עסקי כלשהו.[1][2] מפתחות יכולים להיות גם מאומתים ומוצפנים.[3][4]

JWT מסתמך על סטנדרטים קיימים של JSON: כמו : JWS (ראשי תיבות של JSON Web Signature) המפורסם כ-RFC 7515 ו JWE (ראשי תיבות של JSON Web Encryption) המפורסם כ-RFC 7516.[5][6][7]

מבנהעריכה

להודעת JWT בדרך כלל יש שלושה חלקים: כותרת (header), תוכן (payload), חתימה (signature). הכותרת מזהה את האלגוריתם המשמש כדי ליצור את החתימה, לדוגמה:

header = '{"alg":"HS256","typ":"JWT"}'

HS256 מציין כי מפתח זה נחתם באמצעות HMAC-SHA256.

התוכן מכיל את ה"טענות":

payload = '{"user":"Edo Tzumer", "loggedInAs":"admin","iat":1422779638}'

כפי שהוצע בתקן JWT, חותמת הזמן תסופק ותקרא iat (ראשי תיבות של Issued at)

החתימה מחושבת על ידי קידוד base64 של הכותרת והתוכן ושרשורם של תו מפריד של נקודה ('.'):

key = 'secretkey'
unsignedToken = encodeBase64Url(header) + '.' + encodeBase64Url(payload)
signature = HMAC-SHA256(key, unsignedToken)

לכלול הכל יחד, החתימה מקודדת ב base64. שלושה חלקים נפרדים משורשרים באמצעות נקודות:

token = encodeBase64Url(header) + '.' + encodeBase64Url(payload) + '.' + encodeBase64Url(signature)
// The token is now:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI

שדות סטנדרטייםעריכה

  • iss - Issuer, זיהוי המנפיק של ה JWT
  • sub - Subject, מזהה את הנושא של JWT
  • aud - Audience, זהוי הנמענים שה JWT מיועד אליהם
  • exp - Expiration time, זמן תפוגה 
  • nbf - Not before, "לא לפני" מציין זמן מינימלי של ולידיות הנתונים
  • iat- Issued atזמן ההנפקה
  • jti - JWT ID, מזהה ייחודי 

השדות הבאים יכולים לשמש בכותרות אימות:

  • typ - Token type, אם קיים, מומלץ להגדיר כ- JWT.[8]
  • cty - Content type
  • alg - Message authentication code algorithm, המנפיק יכול באופן חופשי להגדיר אלגוריתם כדי לאמת את החתימה על מפתח.
  • כל הכותרות האחרות שהוצגו על ידי JWS ו JWE

מימושיםעריכה

מימושי JWT קיימים, בין השאר, על Clojure, .NET,[9] Go, Haskell, Python,[10] Node.js, Java, JavaScript, Lua, Perl, PHP,[11] Ruby,[12] Rust,[13] Scala,[14] Erlang , Common lisp [15] ו Elixir.



הערות שולייםעריכה

  1. ^ Sevilleja, Chris. "The Anatomy of a JSON Web Token". בדיקה אחרונה ב-8 במאי 2015. 
  2. ^ "Atlassian Connect Documentation". developer.atlassian.com. בדיקה אחרונה ב-8 במאי 2015. 
  3. ^ "JSON Web Tokens - jwt.io". jwt.io. בדיקה אחרונה ב-8 במאי 2015. 
  4. ^ McLean, Tim (31 במרץ 2015). "Critical vulnerabilities in JSON Web Token libraries". Auth0. בדיקה אחרונה ב-29 במרץ 2016. 
  5. ^ "draft-ietf-oauth-json-web-token-32 - JSON Web Token (JWT)". tools.ietf.org. בדיקה אחרונה ב-8 במאי 2015. 
  6. ^ "draft-ietf-jose-json-web-signature-41 - JSON Web Signature (JWS)". tools.ietf.org. בדיקה אחרונה ב-8 במאי 2015. 
  7. ^ "draft-ietf-jose-json-web-encryption-40 - JSON Web Encryption (JWE)". tools.ietf.org. בדיקה אחרונה ב-8 במאי 2015. 
  8. ^ John, Bradley; Nat, Sakimura; Michael, Jones. "JSON Web Token (JWT)". tools.ietf.org. בדיקה אחרונה ב-14 בנובמבר 2016. 
  9. ^ jwt-dotnet on en:Github.com
  10. ^ "jpadilla/pyjwt". GitHub (באנגלית). בדיקה אחרונה ב-21 במרץ 2017. 
  11. ^ lcobucci/jwt on en:Github.com
  12. ^ ruby-jwt on en:Github.com
  13. ^ frank_jwt on github.com
  14. ^ jwt-scala on github.com
  15. ^ cljwt on github.com