[筆記] 透過 JWT 實作驗證機制

Mike Huang
麥克的半路出家筆記
13 min readAug 16, 2019

--

過去在專案中大多透過 Session 和 Cookie 實作驗證機制(例如 👉 透過 Passport.js 實作驗證機制),在使用者成功登入後,會在伺服器端建立 Session,並提供客戶端相對應的 Session ID。往後來自客戶端的請求,伺服器以 Cookie 中 Session ID 尋找 Session 確認使用者驗證狀態。然而,使用這個方法,意味著每位用戶經過驗證後,都需要為其建立和存取 Session(可能在資料庫中)當用戶量增加,資料庫的花費成本將不斷提高;每當用戶拜訪需經驗證的路徑時,也需要額外到資料庫執行資料查詢,花費額外的效能。

透過 Session 和 Cookie 實作驗證機制

JSON Web Token(JWT)也因此誕生,它更符合設計 RESTful API 時「Stateless 無狀態」原則:意味著每一次從客戶端向伺服器端發出的請求都是獨立的,使用者經驗證後,在伺服器端不會將用戶驗證狀態透過 Session 儲存起來,因此每次客戶端發出的請求都將帶有伺服器端需要的所有資訊 — 從客戶端發出給伺服器端的請求將帶有 JWT 字串表明身份 。整個驗證的流程大致會是:

  1. 伺服器端在收到登入請求後驗證使用者
  2. 伺服器端產生和回傳一組帶有資訊,且僅能在伺服器端被驗證的 Token
  3. Token 被回傳後,存取在「客戶端」(大多存在瀏覽器的 Storage 當中)
  4. 往後客戶端向伺服器端發送請求時,皆附帶此 Token 讓伺服器端驗證
  5. 若伺服器端在請求中沒有找到 Token,回傳錯誤;若有找到 Token 則驗證
驗證流程圖示

JWT 組成

JWT 是一組字串,透過(.)切分成三個為 Base64 編碼的部分:

  • Header:含 Token 的種類及產生簽章(signature)要使用的雜湊演算法
  • Payload:帶有欲存放的資訊(例如用戶資訊)
  • Signature:編譯後的 Header、Payload 與密鑰透過雜湊演算法所產生

--

--

Mike Huang
麥克的半路出家筆記

熱愛接觸和學習網頁開發相關技術與知識、喜歡分享、旅遊和咖啡的軟體工程師 A software engineer who enjoy learning and sharing web technologies & fancy coffee and travelling