JWT- Java Web Token 原理
JWT是一個輕量級的規範,之前學習過,但一直沒有什麼應用。最近在做一個OAuth 2相關的專案,有用到JWT。於是,再複習一遍。
JWT是什麼?
JSON Web Token (JWT) 是一個簡潔的,自包含的,可安全的在兩個模組之間傳輸。這是JWT.io給出的定義。
簡潔: JWT的規模比較小,它的報文可以通過URL或者HTTP的POST引數,甚至插入在HTTP頭中。
自包含:在JWT payload部分包含了所有的必須的資訊。
JWT報文結構:
Header: Header通常包含兩部分:typ token型別, alg 所用的hash演算法
{ "alg": "HS256", "typ": "JWT" }
Payload:Payload部分是JWT的資訊主體。Payload有三種申明資訊:註冊,公開和私有申明資訊。
註冊宣告:這一類中,JWT推薦但不是要求必須的四個引數是:iss (issuer), exp (expiration time), sub (subject), aud (audience).
共有宣告:這些可以被定義在那些使用JWT的規範中,例如OpenID Connect,例如name, give_name。但是注意,避免使用衝突。
私有宣告:自定義的宣告
例子:
{ "sub": "1234567890", "name": "John Doe", "admin": true }
Signature: 簽名是一個利用演算法對header和payload的組合的加密字串。這個簽名可防止資訊的篡改但不能防止資訊的洩露。所以在JWT中,不能包含敏感資訊。
簽名的演算法過程:
1. header字串用base64加密
2. payload字串用base64加密
3. 前兩者加密的結果用點號 (.)連線起來。heder在前,paload在後
4. 然後使用header頭中的註明的演算法,對這個字串加密的結果就是簽名。加密過程中還會用到一個secret字串
如下演算法示意:
完整的 JWT字串是base64(header).base64(paload).SignatureHMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
參考文章:
1. https://jwt.io/introduction/