JWT 介紹

JWT是 Auth0 提出的,透過對JSON進行加簽來實現授權驗證的方案,編碼之後的JWT看起來是這樣的一串字元:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MDgzMDc4ODQsImlhdCI6MTUwODMwNDI4NH0.2zi8Te4j5zDx9inYrWyQZkLTKrLKIgpxFWsmWGjRaKA

此段編碼包含三部分:
* Headers(包括類別(typ)、加密演算法(alg))

{
  "alg": "HS256",
  "typ": "JWT"
}
  • Payload / Claims 包括需要傳遞的使用者資訊
{
  "sub": "222220",
  "name": "Andy Liu",
  "admin": true
}

// 可以有以下參數可以使用
iss: The issuer of the token
sub: The subject of the token
aud: The audience of the token
exp: Token expiration time defined in Unix time
nbf: “Not before” time that identifies the time before which the JWT must not be accepted for processing
iat: “Issued at” time, in Unix time, at which the token was issued
jti: JWT ID claim provides a unique identifier for the JWT
  • Signature
    • 根據alg演算法與私有秘鑰進行加密得到的簽名字串;
    • 這一段是最重要的敏感資訊,只能在服務端解密
HMACSHA256(  
    base64UrlEncode(header) + "." +
    base64UrlEncode(payload),
    SECREATE_KEY
)

在使用過程中,服務端通過使用者登錄驗證之後,將Header+Claim資訊加密後得到第三段簽名,然後將簽名返回給用戶端,在後續請求中,服務端只需要對使用者請求中包含的JWT進行解碼,即可驗證是否可以授權使用者獲取相應資訊。

使用JWT可以省去服務端讀取Session的步驟,這樣更符合RESTful的規範。但是對於用戶端(或App端)來說,為了保存使用者授權資訊,仍然需要通過Cookie或類似的機制進行本地保存。因此JWT是用來取代服務端的Session而非用戶端Cookie的方案

認證方式比較

  • Server-Based Authentication
    基本認證

  • Token-Based Authentication
    Token base 認證