JWT
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":"John Doe", "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
טענות (claims) סטנדרטיות
בתקן RFC 7519 מוגדרים אוסף של טענות סטנדרטיות והשמות הרצויים להם ב-JWT:
iss
- Issuer, זיהוי המנפיקsub
- Subject, נושא הטוקןaud
- Audience, זיהוי הנמענים שה-JWT מיועד לאפשר גישה אליהםexp
- Expiration time, זמן תפוגה (אחריו אין לקבל את ה-JWT יותר)nbf
- Not before, מגדיר מועד מוקדם ביותר ממנו ניתן יהיה להשתמש ב-JWT (אשר אין לקבל אותו לפניו)iat
- Issued at, זמן ההנפקהjti
- JWT ID, מזהה ייחודי (מיועד למנוע Replay attack)
השדות הבאים יכולים לשמש בכותרות אימות:
typ
- Token type, אם קיים, מומלץ להגדיר כ-JWT
.[8]cty
- Content typealg
- Message authentication code algorithm, האלגוריתם ששימש לחתימת ה-JWT.- כל הכותרות האחרות שהוצגו על ידי JWS (RFC 7515) ו-JWE (RFC 7516)
מימושים
מימושים של 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.
הערות שוליים
- ^ Sevilleja, Chris. "The Anatomy of a JSON Web Token". נבדק ב-2015-05-08.
- ^ "Atlassian Connect Documentation". developer.atlassian.com. נבדק ב-2015-05-08.
- ^ "JSON Web Tokens - jwt.io". jwt.io. נבדק ב-2015-05-08.
- ^ McLean, Tim (31 במרץ 2015). "Critical vulnerabilities in JSON Web Token libraries". Auth0. נבדק ב-2016-03-29.
{{cite web}}
: (עזרה) - ^ "draft-ietf-oauth-json-web-token-32 - JSON Web Token (JWT)". tools.ietf.org. נבדק ב-2015-05-08.
- ^ "draft-ietf-jose-json-web-signature-41 - JSON Web Signature (JWS)". tools.ietf.org. נבדק ב-2015-05-08.
- ^ "draft-ietf-jose-json-web-encryption-40 - JSON Web Encryption (JWE)". tools.ietf.org. נבדק ב-2015-05-08.
- ^ John, Bradley; Nat, Sakimura; Michael, Jones. "JSON Web Token (JWT)". tools.ietf.org. נבדק ב-2016-11-14.
- ^ jwt-dotnet on GitHub
- ^ "jpadilla/pyjwt". GitHub (באנגלית). נבדק ב-2017-03-21.
- ^ lcobucci/jwt on GitHub
- ^ ruby-jwt on GitHub
- ^ frank_jwt on GitHub
- ^ jwt-scala on GitHub
- ^ cljwt on GitHub
31250252JWT