什麼是 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)
感謝教學~
回覆刪除