##什麼是JWT
這篇文章選擇性翻譯於https://jwt.io/introduction/
JSON Web Token(JWT)是一種開放標準(RFC 7519),它定義了一種緊湊且字自包含的標準,用於將各方之間的信息地傳輸為JSON對象。 該信息是通過數字簽名進行驗證。使用HMAC算法或使用RSA的公鑰/私鑰對JWT進行簽名,所以它的安全性非常高。
進一步解釋它的特點或者概念: •緊湊型(compact):由於是加密後的字符串,JWT數據體積非常的小,可通過 POST參數或HTTP請求頭髮送。 另外,數據體積小意味著傳輸速度很快。 •自包含(self-contained):JWT包含了用戶的所有信心,所以避免了每次查詢數據庫,降低了服務器的負載。
JWT應用場景
一般什麼時候應該使用JWT呢?,一般使用在以下場景:
•驗證:這是使用JWT的最常見的場景。 一旦用戶登錄,每個後續請求將包括JWT,允許用戶訪問該令牌允許的路由,服務和資源。 單點登錄是一個廣泛使用JWT的功能,因為它的開銷很小,並且能夠在不同的域中輕鬆使用。 •信息交換:JWT是在各方之間安全傳輸信息的好方法,因為它們可以被簽名,例如使用公鑰/私鑰對. 另外,當使用標題和有效載荷計算簽名時,還可以驗證內容是否未被篡改。
JWT結構
JWT由三個部分組成,分別為“.”分隔,三部分組成如下:
- Header(頭)
- Payload(有效載荷)
- Signature(簽名) 因此,JWT通常格式如下:
xxxxx.yyyyy.zzzzz
現在,依次對這三個組成部分,分開講解:
1.Header
標題通常由兩部分組成:令牌的類型,即JWT,以及使用的哈希算法,如HMAC SHA256或RSA。 比如:
{
“alg”:“HS256”,
“typ”:“JWT”
}
將header進行Base64 編碼作為JWT的第一部分。
2.Payload
這是JWT的第二部分,包含了用戶的一些信息和Cliam(聲明、權利),有三種類型的Cliam:保留,公開和私人聲明。 一個典型的payload應該如下:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
將payload進行Base64 編碼作為JWT的第二部分。
3.Signature
要創建簽名部分,需要使用到用Base64編碼後header和payloader,以及祕鑰,將它們簽名,一個典型的格式如下:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
JWT是如何使用的
來說下最常見的應用場景,即認證方面,如圖所示。客戶端通過用戶名密碼向服務器請求獲取某用戶的信息,包括用戶一些額外信息,比如權限,這些信息經過加密以JWT形式返回。獲取到該JWT的客戶端,在以後的每次請求中,都需要攜帶該JWT,這樣做的好處就是每次不需要查詢數據庫獲取該用戶的信息,在微服務這樣的分佈式系統中,可以實現單點登錄。