前言
在現代 Web 應用中,使用者認證與授權機制是系統安全的重要基礎。傳統上,我們可能使用 Session 與 Cookie 搭配伺服器端儲存進行身份驗證;但在前後端分離、多平台(Web、Mobile、API Gateway)應用日益普及的情況下,更輕量、跨平台、無狀態的驗證方案逐漸成為主流。
JWT(JSON Web Token)正是這樣一種流行的解法。它是一種根據 JSON 格式加密後產生的 Token,可用來安全地在用戶與伺服器間傳遞資訊。
重點摘要
JWT 是一種開放標準(RFC 7519),用於在雙方之間以 JSON 格式安全傳遞資訊。
結構由三部分組成:
Header
.Payload
.Signature
。主要用途:
- 身份認證(Authentication)
- 授權(Authorization)
特點:
- 可跨語言與平台使用
- 支援無狀態驗證(不需伺服器端儲存 session)
- 可設定過期時間與自訂 Payload 欄位
常見應用場景:API Token 驗證、行動裝置登入狀態維持、OAuth 搭配使用
JWT 須透過 HTTPS 傳遞以避免中間人攻擊(MITM)
不適合儲存敏感資訊(如密碼、信用卡號)
JWT 結構說明
一個 JWT 字串長得像這樣:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. |
它由三個部分組成,透過 .
分隔:
- Header:定義演算法(如
HS256
)與類型(JWT
)。 - Payload:承載實際資料(如使用者 ID、帳號、過期時間)。
- Signature:用密鑰加密前兩部分,用於驗證是否被竄改。
實作範例(Node.js + ESM)
安裝必要套件
npm install express jsonwebtoken dotenv |
專案架構
project/ |
.env
檔(儲存密鑰)
JWT_SECRET=mysecretkey123 |
routes/auth.js
import express from 'express'; |
index.js
import express from 'express'; |
測試流程
- 發送
POST /api/login
並附上正確帳密(如admin
/123456
),取得 JWT。 - 將該 JWT 作為
Authorization: Bearer <token>
放入 Header 中,請求GET /api/profile
。 - 若驗證成功,API 會回傳對應使用者資訊;若失敗,則回傳錯誤訊息。
常見安全注意事項
- 使用 HTTPS:JWT 應透過 HTTPS 傳輸,避免中間人攻擊。
- 設定適當過期時間:避免長期有效的 Token 被盜用。
- 避免儲存敏感資訊於 Payload:Payload 是可被解碼的(雖然不可修改),不應含有密碼、信用卡資訊等。
- 支援 Token 失效機制(如 Token 黑名單):JWT 是無狀態的,若要強制登出或封鎖,需額外設計邏輯。
總結
JWT 是實作登入與驗證的重要工具,具有無狀態、跨平台、可擴充的特性,特別適合 API 驗證場景。本文透過簡單的 Node.js + Express 實作,展示如何產生與驗證 JWT,並說明常見應用與安全注意事項。
不論你是單頁應用 SPA 開發者,還是撰寫 RESTful API 的後端工程師,掌握 JWT 都將大幅提升你的系統安全與擴充能力。