什麼是 JWT#
JWT 全名 JSON Web Token,顧名思義就是以 JSON 格式來製作 Token 的一種開放標準(RFC 7519)。
JWT 使用時機#
授權(Authorization):驗證成功後,允許使用者、伺服器或服務存取 token 所描述有權限的資源。
訊息交換(Information Exchange):透過公鑰/私鑰做數位簽章(Digital Signature),確保傳遞資料的機密性與完整性。
JWT 的驗證方法#

Browser 透過帳號密碼登入。
Server 驗證使用者帳密成功後,發放合法 JWT 字串。
Browser 拿到 JWT 字串就會將其存放在 Local Storage 裡面。
當 Browser 要存取 Server 時,在 Header 的填寫
Authorization: Bearer <JWT_token>Server 收到後,會去檢查 JWT token 是否有效。
如果有效,則允許 Browser 存取 Server 資訊。
JWT 的組成#
JWT 是由三個 JSON object 組成,分別為 Header、Payload、Signature,將三個 object 分別使用 Base64 編碼,再使用 . 來分隔,格式如下,可利用 JWT 官網來 decode 查看資訊。

Header#
存放 token 的基本資訊,常見格式如下
{
"alg":"HS256",
"typ":"JWT"
}其中 alg 為必要欄位,描述 JWT 進行簽章或加密的主要演算法,若為未加密的 JWT,則為 none;typ 為非必要欄位,通常設定為 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 越大),越會造成傳輸成本。