[筆記] 透過 JWT 實作驗證機制
Published in
13 min readAug 16, 2019
過去在專案中大多透過 Session 和 Cookie 實作驗證機制(例如 👉 透過 Passport.js 實作驗證機制),在使用者成功登入後,會在伺服器端建立 Session,並提供客戶端相對應的 Session ID。往後來自客戶端的請求,伺服器以 Cookie 中 Session ID 尋找 Session 確認使用者驗證狀態。然而,使用這個方法,意味著每位用戶經過驗證後,都需要為其建立和存取 Session(可能在資料庫中)當用戶量增加,資料庫的花費成本將不斷提高;每當用戶拜訪需經驗證的路徑時,也需要額外到資料庫執行資料查詢,花費額外的效能。
JSON Web Token(JWT)也因此誕生,它更符合設計 RESTful API 時「Stateless 無狀態」原則:意味著每一次從客戶端向伺服器端發出的請求都是獨立的,使用者經驗證後,在伺服器端不會將用戶驗證狀態透過 Session 儲存起來,因此每次客戶端發出的請求都將帶有伺服器端需要的所有資訊 — 從客戶端發出給伺服器端的請求將帶有 JWT 字串表明身份 。整個驗證的流程大致會是:
- 伺服器端在收到登入請求後驗證使用者
- 伺服器端產生和回傳一組帶有資訊,且僅能在伺服器端被驗證的 Token
- Token 被回傳後,存取在「客戶端」(大多存在瀏覽器的 Storage 當中)
- 往後客戶端向伺服器端發送請求時,皆附帶此 Token 讓伺服器端驗證
- 若伺服器端在請求中沒有找到 Token,回傳錯誤;若有找到 Token 則驗證
JWT 組成
JWT 是一組字串,透過(.
)切分成三個為 Base64 編碼的部分:
- Header:含 Token 的種類及產生簽章(signature)要使用的雜湊演算法
- Payload:帶有欲存放的資訊(例如用戶資訊)
- Signature:編譯後的 Header、Payload 與密鑰透過雜湊演算法所產生