JSON Web Token(JWT) 簡介
1 什麼是 JWT?
JWT(JSON Web Token)是認證解決方案,下面介紹它的原理和用法.
2 JWT 的結構
JWT 的結構如下
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
JWT的具體表現是一個長字串,中間用點(.
)分隔成三個部分
這三部分分別指的是
Header(頭部)
Payload(負載)
Signature(簽名)
即:
Header.Payload.Signature
2.1 Header
{
"alg": "HS256",
"typ": "JWT"
}
alg
屬性表示簽名的演算法,預設是 HMAC SHA256(寫成 HS256);typ
屬性表示這個令牌(token)的型別(type),一般是這兩個屬性,當然也可以加上其他自定義的屬性。
將上面的 JSON 物件使用 Base64URL 演算法編碼就構成了 JWT 的 Header。
2.2 Payload
Payload 用來存放實際需要傳遞的資料。JWT 規定了下面7個可選欄位(建議但不強制使用)。
iss (issuer):簽發人
exp (expiration time):過期時間
sub (subject):主題
aud (audience):受眾
nbf (Not Before):生效時間
iat (Issued At):簽發時間
jti (JWT ID):編號
除了官方可選欄位,你可以在這個部分定義私有欄位,如下:
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
同樣上面的 JSON 物件使用 Base64URL 演算法編碼就構成了 JWT 的 Payload。
2.3 Signature
Signature 部分是對前兩部分的簽名,防止資料篡改。
首先,需要指定一個金鑰(secret)然後,使用 Header 裡面指定的簽名演算法(預設是 HMAC SHA256),按照下面的公式產生簽名。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
secret 要儲存在服務端,JWT的簽發和驗證都需要用這個 secret,不能洩露
同樣使用 Base64URL 演算法編碼就構成了 signature
最後,把 Header、Payload、Signature 三個部分拼成一個字串,每個部分之間用"點"(.
)分隔,就組成了完整的 JWT
3 使用方式
服務端返回 JWT 給客戶端,此後,客戶端每次與伺服器通訊,都要帶上這個 JWT。可以放在 HTTP 請求的頭資訊Authorization
欄位裡面。
Authorization: Bearer <token>
或放在 POST 請求的資料體裡面
參考連結
- https://jwt.io/introduction/
- https://mgleon08.github.io/blog/2018/07/16/jwt/
- https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html