JSON Web Token (JWT)是一個開放標准(RFC 7519)。
用於JSON對象在各個層之間安全地傳輸信息。該信息可以被驗證和信任,通過數字簽名。
應用場景:
Authorization (授權) : 這是使用JWT的最常見場景。一旦用戶登錄,后續每個請求都將包含JWT,允許用戶訪問該令牌允許的路由、服務和資源。單點登錄是現在廣泛使用的JWT的一個特性,因為它的開銷很小,並且可以輕松地跨域使用。
Information Exchange (信息交換) : 對於安全的在各方之間傳輸信息而言,JSON Web Tokens無疑是一種很好的方式。因為JWTs可以被簽名,例如,用公鑰/私鑰對,你可以確定發送人就是它們所說的那個人。另外,由於簽名是使用頭和有效負載計算的,您還可以驗證內容沒有被篡改。
JSON Web Token由三部分組成,它們之間用圓點(.)連接。這三部分分別是:
Header Payload Signature
典型的JWT樣子:xxxxx.yyyyy.zzzzz
Header: header典型的由兩部分組成:
1-token的類型(“JWT”)和
2-算法名稱(比如:HMAC SHA256或者RSA等等)
如:
{
"typ":"JWT",
"alg":"HS256"
}
最后用Base64對這個JSON編碼就得到JWT的第一部分xxxxx.yyyyy.zzzzz
payload
聲明有三種類型: registered, public 和 private。
- Registered claims : 這里有一組預定義的聲明,它們不是強制的,但是推薦。比如:iss (issuer), exp (expiration time), sub (subject), aud (audience)等。
- Public claims : 可以隨意定義。
- Private claims : 用於在同意使用它們的各方之間共享信息,並且不是注冊的或公開的聲明。
例如:
{
“iss”: “發行者”,
“sub”: 主題”,
“aud”: “觀眾”,
“exp”:”過期時間”,
“iat”:”簽發時間”
以下可以添加自定義數據
“id”:”1”,
“nickname”:”昵稱”
}
根據JWT claim set[用base64]加密得到的。claim set是一個json數據,是表明用戶身份的數據,可自行指定字段很靈活,也有固定字段表示特定含義(但不一定要包含特定字段,只是推薦)。
Base64算法是可逆的,不可以在載荷部分保存用戶密碼等敏感信息。如果業務需要,也可以采用對稱密鑰加密。
對payload進行Base64編碼就得到JWT的第二部分xxxxx.yyyyy.zzzzz
簽名部分signature
HMACSHA256(Base64(Header) + “.” + Base64(Payload), secret),secret是加密的key。
簽名的目的是用來驗證頭部和載荷是否被非法篡改。
驗簽過程描述:獲取token值,讀取Header部分並Base64解碼,得到簽名算法。根據以上方法算出簽名,如果簽名信息不一致,說明是非法的。
工作原理:
JSON Web Token工作原理
初次登錄:用戶初次登錄,輸入用戶名密碼
密碼驗證:服務器從數據庫取出用戶名和密碼進行驗證
生成JWT:服務器端驗證通過,根據從數據庫返回的信息,以及預設規則,生成JWT
返還JWT:服務器的將token放在cookie中將JWT返還
帶JWT的請求:以后客戶端發起請求,帶上cookie中的token信息。
