什麼是 JWT (JSON Web Token) ?

JWT 顧名思義,是一種以 JSON 為「明文」資料格式,以 Token 為主的認證機制。 而在傳輸過程中, JWT 會以密文方式呈現,如下範例:

  eyJ0eXAiOiJqd3QiLCJhbGciOiJIUzI1NiJ9.
  eyJ1c2VyaWQiOiJhYmMtMTIzIiwidXNlcm5hbWUiOiJOb25hbWUifQ.
  f9eixg-OO06ZLZGpWcvUcAocAlubFT0uRrBW8HhokoY

上面範例以 . 隔開可分作三個部分: Header, PayloadSignature

  header.payload.signture

首先, Header 定義 JWT 所使用的加密演算法以及內容類型。 例如:

    {
      "alg": 加密演算法
      "typ": JSON 資料類型
    }

Payload 則是放業務邏輯相關的資料。 例如:

{
  "userid": "abc-123",
  "username": "Wei-De Su",
}

接著 Signture,就是將上面 Header 和 Payload 的內容經過 Base64 for URL 的方式轉為密文,再以 . 將內容合在一起進行加密演算後產生的密文。

例如以 HMAC256 作為加密演算法

Signture = HMAC256(Base64(header).Base64(Payload))
         = f9eixg-OO06ZLZGpWcvUcAocAlubFT0uRrBW8HhokoY

為什麼要用 JWT (JSON Web Token) ?

1. 安全性

  • cookie-base 的認證機制會將資訊儲存在 Client 端 (ex. Browser),但這樣的方式會有 CSRF 的安全性議題。

2. 可擴展性

  • Session-base 的認證機制會將資訊儲存在 Server 端,這樣的方式在分散式架構就會有 Session 在多節點如何同步的問題。

3. 應用廣

  • JWT 除了用於登入驗證外,也可用在一次性驗證的服務上, 例如購物優惠的驗證、註冊確認的驗證等。

JWT 要怎麼用 (JSON Web Token) ?

下圖是 JWT 的流程圖:

  1. Browser 發送 usernamepassword 到 Server 進行登入。
  2. Server 以登入相關資訊和預寫的 secret 產生 JWT
  3. Server 回傳 JWT 給 Browser
  4. Browser 後續發出的 Request 都將 JWT 置於 HTTP Request 的 Header
  5. Server 驗證 Browser 送過來的 JWT 是否正確
  6. 若正確,則回覆資料給 Browser

jwt_flow Source: Auth0

延伸閱讀