JWT

**JWT **(ראשי תיבות באנגלית של: **J**SON **W**eb **T**oken) הוא תקן להעברת מידע חתום בין שני צדדים בפורמט JSON .יחידות המידע, המכונות לעיתים טענות (Claims), מיוצגות כאובייקט של JSON. JWT הוא תקן פתוח שפורסם על ידי ארגון IETF ב-.

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

האסימונים תוכננו להיות קצרים, בטוחים להעברה ב-URL, ושמישים במיוחד בדפדפני אינטרנט בהקשר של SSO (שימוש במספר רב של מערכות באמצעות מפתח יחיד). "טענות" JWT משמשות באופן טיפוסי כדי להעביר את הזהות של משתמשים מאומתים בין "מְסַפֵּק הַזֶּהוּת" (Identity Provider) לבין "נותן השירות" (Service Provider), או כל סוג אחר של טענות (כלומר פריטי מידע) הנדרשים כחלק מתהליך עסקי כלשהו. אסימונים יכולים להיות גם חתומים דיגיטלית לאימות זהות השולח ומוצפנים. (להסתרת תוכן האסימון מפני המשתמש וצד ג' אשר מאזין לתקשורת)

JWT מסתמך על סטנדרטים קיימים של JSON, כמו: JWS (ראשי תיבות של **J**SON **W**eb **S**ignature) המפורסם כ- ו-JWE (ראשי תיבות של **J**SON **W**eb **E**ncryption) המפורסם כ-.

## מבנה
להודעת JWT בדרך כלל יש שלושה חלקים: כותרת (header), תוכן (payload), חתימה (signature). הכותרת מזהה את האלגוריתם המשמש כדי ליצור את החתימה, לדוגמה:
 
```json
header = '{"alg":"HS256","typ":"JWT"}'
```

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

התוכן מכיל את ה"טענות":
 
```json
payload = '{"user":"John Doe", "loggedInAs":"admin","iat":1422779638}'
```

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

החתימה מחושבת על ידי קידוד base64 של הכותרת והתוכן ושרשורם של תו מפריד של נקודה ('.'):
 
```java
key = 'secretkey'
unsignedToken = encodeBase64Url(header) + '.' + encodeBase64Url(payload)
signature = HMAC-SHA256(key, unsignedToken)
```
לכלול הכל יחד, החתימה מקודדת ב-base64. שלושה חלקים נפרדים משורשרים באמצעות נקודות:
 
```javascript
token = encodeBase64Url(header) + '.' + encodeBase64Url(payload) + '.' + encodeBase64Url(signature)

//The token is now:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI
```

## טענות (claims) סטנדרטיות
בתקן  מוגדרים אוסף של טענות סטנדרטיות והשמות הרצויים להם ב-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`.
* `cty` - Content type
* `alg` - Message authentication code algorithm, האלגוריתם ששימש לחתימת ה-JWT.
* כל הכותרות האחרות שהוצגו על ידי JWS () ו-JWE ()

## מימושים
מימושים של JWT קיימים, בין השאר, על Clojure, .NET, Go, Haskell, Python, Node.js, Java, JavaScript, Lua, Perl, PHP, Ruby, Rust, Scala, Erlang, Common Lisp ו-Elixir.

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

קטגוריה:אבטחת מחשבים
קטגוריה:אבטחת מידע
קטגוריה:תקנים בתקשורת מחשבים