什麼是 JWT?

什麼是 JWT?

JWT 是 JSON Web Token 的簡寫,它是一串英文和數字,由 Header(頭), Payload(負載、資料), Signature(簽名)三個部分組成的,中間使用「.」區隔。
範例資料如下:
    
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
    

雖然看起來像是亂碼,但是其實前兩部分(Header 和 Payload)只是將原本的資訊經過 base64 轉換而已,我們同樣可以使用 base64 反過來取得原始的資料:
    
{"alg":"HS256","typ":"JWT"}{"sub":"1234567890","name":"John Doe","iat":1516239022}
    

這代表 JWT 中的資料可以被任何人解讀,所以不要在這之中儲存/夾帶任何機密資訊。

而最後一段的內容是「簽名」,利用特定的演算法加密(會在 Header 區塊中說明加密的演算法),用來驗證前兩段的資料是否正確、未被竄改。

除了單純使用 base64 解析 JWT 資料,我們還可以使用 jwt.io 這個網站,讓我們可以直觀的看到對應的資料。
開啟網站後把 JWT 貼上去即可:

JWT Payload 包含哪些資料?

JWT 的 Payload 會使用 JSON 的方式儲存很多資訊,常見的有以下幾種:
  • iss: issuer,代表 JWT 的發行方
  • sub: subject,代表此 JWT 的主體,常用來放置用來辨識使用者的資訊,例如 UserId 等
  • aud: audience,代表此 JWT 預期的接收者
  • exp: expiration time,代表此 JWT 的過期/失效時間,使用 UNIX 時間標記
  • nbf: not before time,代表此 JWT 的啟用/生效時間,使用 UNIX 時間標記
  • iat: issued at time,代表此 JWT 發行的時間,使用 UNIX 時間標記
  • jti: JWT id,JWT 的唯一標記,用來防止 JWT 被重複傳送(伺服器需要紀錄 jti 的使用情況才能避免被重複傳送)

JWT 有什麼用?

JWT 可以很好的用在識別使用者身份,在呼叫 API 時可以在 HTTP 請求的 Header 中的 Authorization 放入 JWT ,就可以辨識呼叫 API 的身份,並且因為經過加密驗證,可以確保 JWT 中的資訊是正確的。
可以在 A 系統中使用帳號密碼登入,取得 JWT ,在 B 系統中就可以使用 JWT 來確認身份,不需要再次使用帳號密碼登入。

參考資料:
RFC 7519 - JSON Web Token (JWT)

留言

張貼留言

如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com