[WhatIs] JWT (JSON Web Token)
什麼是 JWT (JSON Web Token) ?
JWT 顧名思義,是一種以 JSON 為「明文」資料格式,以 Token 為主的認證機制。 而在傳輸過程中, JWT 會以密文方式呈現,如下範例:
eyJ0eXAiOiJqd3QiLCJhbGciOiJIUzI1NiJ9.
eyJ1c2VyaWQiOiJhYmMtMTIzIiwidXNlcm5hbWUiOiJOb25hbWUifQ.
f9eixg-OO06ZLZGpWcvUcAocAlubFT0uRrBW8HhokoY
上面範例以 . 隔開可分作三個部分: Header, Payload 和 Signature 。
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 的流程圖:
- Browser 發送 username 和 password 到 Server 進行登入。
- Server 以登入相關資訊和預寫的 secret 產生 JWT
- Server 回傳 JWT 給 Browser
- Browser 後續發出的 Request 都將 JWT 置於 HTTP Request 的 Header
- Server 驗證 Browser 送過來的 JWT 是否正確
- 若正確,則回覆資料給 Browser
Source: Auth0
延伸閱讀
CSRF
Session