JWT是目前流行的跨域認證解決方案,其原理是將使用者資訊通過加密生成Token,每次請求伺服器端只需要使用儲存的金鑰驗證Token的正確性,進而不用再儲存任何Session資料,使伺服器端變得無狀態。
jwt驗證方式是將使用者資訊通過加密生成token,每次請求伺服器端只需要使用儲存的金鑰驗證token的正確性,不用再儲存任何session資料了,進而伺服器端變得無狀態,容易實現拓展。
加密前的使用者資訊,如:
{ "username": "vist", "role": "admin", "expire": "2018-12-08 20:20:20" }
用戶端收到的token:
7cd357af816b907f2cc9acbe9c3b4625
JWT 結構
一個token分為3部分:
頭部(header)
載荷(payload)
簽名(signature)
3個部分用「.」分隔,如:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
頭部
JWT的頭部分是一個JSON物件,描述後設資料,通常是:
{ "typ": "JWT", "alg": "HS256" }
typ 為宣告型別,指定 "JWT"
alg 為加密的演算法,預設是 "HS256"
載荷
載荷(payload)是資料的載體,用來存放實際需要傳遞的資料資訊,也是一個JSON物件。
JWT官方推薦欄位:
iss: jwt簽發者
sub: jwt所面向的使用者
aud: 接收jwt的一方
exp: jwt的過期時間,這個過期時間必須要大於簽發時間
nbf: 定義在什麼時間之前,該jwt都是不可用的.
iat: jwt的簽發時間
jti: jwt的唯一身份標識,主要用來作為一次性token,從而迴避重放攻擊。
也可以使用自定義欄位,如:
{ "username": "vist", "role": "admin" }
簽名
簽名部分是對前兩部分(頭部,載荷)的簽名,防止資料篡改。
按下列步驟生成:
1、先指定金鑰(secret)
2、把頭部(header)和載荷(payload)資訊分別base64轉換
3、使用頭部(header)指定的演算法加密
最終,簽名(signature) = HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret)
用戶端得到的簽名:
header.payload.signature
也可以對JWT進行再加密。
以上就是JWT 是幹什麼?的詳細內容,更多請關注TW511.COM其它相關文章!