1. 程式人生 > >JWT- Java Web Token 原理

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字串

如下演算法示意:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
完整的 JWT字串是base64(header).base64(paload).Signature

參考文章:

1. https://jwt.io/introduction/