快轉到主要內容
  1. Posts/

JWT 運作原理

·950 字·2 分鐘

什麼是 JWT
#

JWT 全名 JSON Web Token,顧名思義就是以 JSON 格式來製作 Token 的一種開放標準(RFC 7519)。

JWT 使用時機
#

  • 授權(Authorization):驗證成功後,允許使用者、伺服器或服務存取 token 所描述有權限的資源。

  • 訊息交換(Information Exchange):透過公鑰/私鑰做數位簽章(Digital Signature),確保傳遞資料的機密性與完整性。

JWT 的驗證方法
#

  1. Browser 透過帳號密碼登入。

  2. Server 驗證使用者帳密成功後,發放合法 JWT 字串。

  3. Browser 拿到 JWT 字串就會將其存放在 Local Storage 裡面。

  4. 當 Browser 要存取 Server 時,在 Header 的填寫 Authorization: Bearer <JWT_token>

  5. Server 收到後,會去檢查 JWT token 是否有效。

  6. 如果有效,則允許 Browser 存取 Server 資訊。

JWT 的組成
#

JWT 是由三個 JSON object 組成,分別為 Header、Payload、Signature,將三個 object 分別使用 Base64 編碼,再使用 . 來分隔,格式如下,可利用 JWT 官網來 decode 查看資訊。

Header#

存放 token 的基本資訊,常見格式如下

{
 "alg":"HS256",
 "typ":"JWT"
}

其中 alg 為必要欄位,描述 JWT 進行簽章或加密的主要演算法,若為未加密的 JWT,則為 nonetyp 為非必要欄位,通常設定為 JWT

Payload
#

token 的資料內容,由於僅使用 base64 編碼 encode,因此避免放機敏資訊導致資訊外洩。該 object 由以下 Claim 組成:

  • Registered claims:標準公認的資訊,如 Issuer、Expiration Time 等。

  • Private claims:伺服器自定義欄位,如 User Account、User Name、User Role 等資訊。

  • Public claims:公開資訊,但又非標準,通常不是 Registered claims 與 Private claims,就會在此 Claim。

格式範例如下

{
 "sub":"12345678",
 "name":"Anna",
 "iat":"15688543",
 "exp":"19397765",
 ...  
}

Signature
#

將 header 和 payload 的訊息,以 base64 編碼組成一組字串,將這組字串加上私鑰加密,接著再將密文用 base64 編碼 encode 處理,變成不可逆的密碼,驗證 token 的完整性與不可否認性,常見加密演算法有 HMAC-SHA256(JWT 中最常見的演算法之一)、RSA、ECDSA,格式如下

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

總結
#

JWT 所帶來的好處
#

  • JWT 可包含所有必要的信息,比如使用者、角色、到期時間等,增加了擴充性,減少對伺服器的請求次數,提高效率。

  • 由於 JWT 是 JSON object 的形式,所以大部分的程式語言都支援,可以在不同的語言和平台之間輕松使用。

  • 使用適當的加密算法時,JWT 可以提升安全性,確保 token 的完整性和不可否認性。

JWT 使用需注意的事項
#

  • 一旦 JWT 被簽發,除非時間到期,否則無法撤銷。

  • JWT Payload 勿放敏感資訊,以免資訊外洩。

  • JWT Payload 包含的訊息越多 (token 越大),越會造成傳輸成本。