JSON Web Token (JWT)
JWT 全名 JSON Web Token
什麼是 JWT
JWT 使用 json 來傳遞資料, 傳遞的資料包含簽名(Signature), 因此資料可以做驗證(Authentication)
JWT 由三個部分組成,每一個部分都用點號 .
分開
像這樣 xxxxx.yyyyy.zzzzz。
三個部分分別是
1. 標頭 Header
Header 由兩部分組成
- token 類型
typ
(type) - 編碼使用的演算法
alg
(algorithm) (e.g.HMAC、SHA256、RSA
)
如:
{
"typ": "JWT",
"alg": "HS256"
}
然後以 Base64 編碼, 最後會長得像這樣
eyJhbGciOiJIUzI1NiJ9
2. 負載 Payload
Payload 存放聲明內容, 有三種定義的聲明
Reserved claims (註冊聲明)
註冊聲明參數 (建議使用但不強制)
- jti (JWT ID): 編號
- sub (Subject): 主題
- iss (Issuer): 簽發者
- aud (Audience): 接收者
- iat (Issued At): 簽發時間
- nbf (Not Before): 開始生效時間
- exp (Expiration Time): 過期時間
Public claims (公開聲明)
Private claims (私有聲明)
如:
{
"iss": "test.com",
"name": "test",
"admin": true
}
編碼後結果:
eyJ1c2VyX2lkIjoxfQ
3. 簽名 Signature
signature 是對前兩個部分的簽名, 驗證發送者的身份, 確保資訊沒有被修改。
signature 由三個部分組成
- header (base64後的)
- payload (base64後的)
- secret (保存在 server 端,jwt 的簽發驗證都必須使用這個 secret)
簽名建立方式:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
對 signature 進行 base64 編碼:
LMSKXnnWlxEir0SWE72cSCmT_NGKQb3tFhQ_xcPQfAY
將 header·payload·signature組合起來就是 JWT 的token:
eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxfQ.LMSKXnnWlxEir0SWE72cSCmT_NGKQb3tFhQ_xcPQfAY
特點
使用 json 格式大部分語言都可使用
stateless, 不需在 server 保存 session
payload 可以存放請求資訊, 減少對資料庫的連線請求
需使用 https 協議, 以減少盜用
預設的 JWT 只有經過編碼(encoded)但並沒有進行加密(encrypted), 因此 JWT 中不應存放敏感的資訊, 有需要的話也可以使用密鑰另外進行加密
使用方法
對保護的資料發送 request 時, 在 header 加入 token 並以 Bearer 作為 schemes
Authorization: Bearer <token>
post('api/user/1', {
headers: {
'Authorization': 'Bearer ' + token
}
})
JWT 詳細規範可參考 RFC 7519