一、JWT認證原理 JWT(Json Web Token)是一種服務端向客戶端發放令牌的認證方式。客戶端用戶名密碼登錄時,服務端會生成一個令牌返回給客戶端;客戶端隨後在向服務端請求時只需攜帶這個令牌,服務端通過校驗令牌來驗證是否是來自合法的客戶端,進而決定是否向客戶端返回應答。 簡單來說,就是伺服器 ...
一、JWT認證原理
JWT(Json Web Token)是一種服務端向客戶端發放令牌的認證方式。客戶端用戶名密碼登錄時,服務端會生成一個令牌返回給客戶端;客戶端隨後在向服務端請求時只需攜帶這個令牌,服務端通過校驗令牌來驗證是否是來自合法的客戶端,進而決定是否向客戶端返回應答。
簡單來說,就是伺服器認證之後,會返回(生成)一個JSON對象,發送給客戶端(用戶),就像下麵一樣:
{
"姓名": "張三",
"角色": "管理員",
"到期時間": "2023.10.2"
}
以後,用戶與服務端通信的時候,都要發回這個 JSON 對象。伺服器完全只靠這個對象認定用戶身份。為了防止用戶篡改數據,伺服器在生成這個對象的時候,會加上簽名。
- 適用場景
授權:
這是最常見的使用場景,解決單點登錄問題。因為JWT使用起來輕便,開銷小,服務端不用記錄用戶狀態信息(無狀態),所以使用比較廣泛;
信息交換:
JWT是在各個服務之間安全傳輸信息的好方法。因為JWT可以簽名,例如,使用公鑰/私鑰對兒 - 可以確定請求方是合法的。此外,由於使用標頭和有效負載計算簽名,還可以驗證內容是否未被篡改。
- 工作流程
1.瀏覽器發起請求登陸,攜帶用戶名和密碼;
2.服務端驗證身份,根據演算法,將用戶標識符打包生成 token,
3.伺服器返回JWT信息給瀏覽器,JWT不包含敏感信息;
4.瀏覽器發起請求獲取用戶資料,把剛剛拿到的 token一起發送給伺服器;
5.伺服器發現數據中有 token,驗明正身;
6.伺服器返回該用戶的用戶資料;
二、JWT結構
JWT包含三部分:頭部Header、負載Payload和簽名Signature。
- 頭部Header
頭部描述JWT的元數據,包括演算法alg和類別typ等信息。alg描述簽名演算法,這樣接收者可以根據對應的演算法來驗證簽名,預設是如下所示的HS256,表示 HMAC-SHA256;typ表示令牌類型,設置為JWT,表示這是一個JWT類型的令牌。 { "alg": "HS256", "typ": "JWT" }
- 負載Payload
存放令牌的主體內容,由認證服務AuthN生成相關信息並放到令牌的負載中。重要屬性包括: iss:令牌發行者 issuer aud:令牌受眾 audience 在JWT驗證時,會校驗發行者、受眾信息和令牌負載中的發行者iss、受眾audience是否匹配。JWT的內容本身不是加密的,所有拿到令牌的服務都可以看到令牌負載Payload中的內容,因此建議Payload里不要存放私密的信息。
- 簽名Signature
簽名欄位是對頭部和負載的簽名,確保只有特定合法的認證服務才可以發行令牌。實際使用中一般是把頭部和負載分別執行Base64轉換成字元串,然後使用認證服務的密鑰對拼接的字元串進行簽名,簽名演算法正是前面介紹的頭域中定義的演算法。
一個完整的JWT示例如下:
對於頭部Header和負載Payload進行簽名得到Signature。
# Header:
{
"alg": "RS512",
"typ": "JWT"
}
# Payload
{
"iss": "weather@cloudnative-istio",
"audience": "weather@cloudnative-istio"
}
# Signature
RSASHA512
(
base64UrlEncode(header) + "." +
base64UrlEncode(payload)
)
以上結構最終輸出的令牌如下,可以看到“.”分割的三個字元串分別對應JWT結構的頭部、負載和簽名三部分。
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjQ2ODU5ODk3MDAsInZlciI6IjIuMCIsImlhdCI6MTUzMjM4OTcwMCwiaXNzIjoid2VhdGhlckBjbG91ZG5hdGl2ZS1pc3Rpby5ib29rIiwic3ViIjoid2VhdGhlckBjbG91ZG5hdGl2ZS1pc3Rpby5ib29rIn0.SEp-8qiMwI45BuBgQPH-wTHvOYxcE_jPI0wqOxEpauw
三、JWT的優缺點
1、JWT預設不加密,但可以加密。生成原始令牌後,可以使用改令牌再次對其進行加密。
2、當JWT未加密方法是,一些私密數據無法通過JWT傳輸。
3、JWT不僅可用於認證,還可用於信息交換。善用JWT有助於減少伺服器請求資料庫的次數。
4、JWT的最大缺點是伺服器不保存會話狀態,所以在使用期間不可能取消令牌或更改令牌的許可權。也就是說,一旦JWT簽發,在有效期內將會一直有效。
5、JWT本身包含認證信息,因此一旦信息泄露,任何人都可以獲得令牌的所有許可權。為了減少盜用,JWT的有效期不宜設置太長。對於某些重要操作,用戶在使用時應該每次都進行進行身份驗證。
6、為了減少盜用和竊取,JWT不建議使用HTTP協議來傳輸代碼,而是使用加密的HTTPS協議進行傳輸。