JWT 全面指南:從結構、工作原理到優缺點的完整解析
身份驗證 (Authentication) vs. 授權 (Authorization)
什麼是身份驗證(Authentication)?
身份驗證(Authentication) 是指:確認使用者的身份是否真實。這是保護系統安全的第一步,因為只有經過身份驗證的人才能進入系統並執行相關操作。
常見的身份驗證方法有:
- 帳號密碼驗證:使用者輸入他們的帳號和密碼來證明身份。
- 多因素驗證 (MFA):除了帳號和密碼,還需要額外的驗證步驟,比如一次性密碼(OTP)或指紋掃描,來增加安全性。
什麼是授權(Authorization)?
授權(Authorization) 則是在身份驗證完成後,決定使用者可以執行哪些操作或存取哪些資源。換句話說,授權的目的是確認某個已驗證的使用者是否有權限存取特定資料或功能。
授權的例子包括:
- API 存取:確認使用者是否有權存取特定的 API 端點。
- 管理後台操作:確認使用者是否能進行如修改系統設定這樣的操作。
- 文件存取:確認使用者是否有權存取某些特定的文件或資料。
身份驗證與授權的差異與關聯
身份驗證和授權是兩個不同但緊密相關的概念。身份驗證專注於確認使用者的身份,而授權則負責決定這個人可以做什麼。通常,身份驗證必須先完成,然後才進行授權,以確保系統資源只向合法的使用者開放。
舉個例子,假設你是一位進入學校圖書館的學生。首先,你需要出示學生證,這就像是身份驗證,用來證明你確實是這所學校的學生。接著,圖書館工作人員會根據你的身份決定你能借哪些書,這部分就相當於授權。
身份驗證是確認你是誰,而授權是確認你可以做什麼。
在網路應用中,使用者需要先用帳號和密碼通過身份驗證,然後系統根據使用者的角色決定他們能存取哪些功能或資料。這樣的流程有助於保護敏感的資源,例如用戶的個人資料或系統設定,確保只有已被驗證和授權的人能存取它們。
什麼是 JWT?
JWT 的定義
JWT,全名為 JSON Web Token,是一種用於身份驗證和授權的開放標準(RFC 7519)。它是一個小型的數據包,用來在不同系統之間安全地傳遞信息。JWT 通常會帶有數位簽名(Digital Signature),這個簽名可以通過對稱密鑰(例如 HMAC)或非對稱密鑰(例如 RSA 或 ECDSA)來生成,這樣可以確保只有擁有正確密鑰的發送者才能創建有效的簽名,而接收方可以確認數據的來源是可信的,並且確保內容在傳遞過程中沒有被篡改。
JWT 的優勢在於它是無狀態的(Stateless)與自包含的(Self-contained)。
- 無狀態是指伺服器不會保 存有關用戶或客戶端會話的任何信息。
- 自包含是指 JWT 自身包含了所有必需的信息。
每次客戶端發送請求給伺服器時,都需要攜帶完整的身份驗證信息,這些信息都包含在 JWT 中。伺服器接收到 JWT 後,可以直接解析token來驗證用戶身份,而無需查詢資料庫或其他外部資源。
JWT 的應用場景
JWT 可應用於許多情況,特別是在需要身份驗證和授權的場景中,以下是一些常見的使用情況:
- 授權 (Authorization):JWT 最常見的應用場景之一就是授權。當用戶成功登錄後,每次發送的請求都會帶上 JWT,伺服器通過檢查這個 JWT 來驗證用戶的身份,並決定是否允許訪問特定資源。由於 JWT 小巧且可以跨域使用,特別適合實現單點登入 (Single Sign-On, SSO),讓用戶只需登錄一次就能訪問所有相關的應用系統。
- 訊息交換 (Information Exchange):JWT 也被用來在雙方之間安全地傳遞訊息。由於 JWT 使用數位簽名保護,接收方可以確保訊息來自於合法的發送者,並且未被篡改過。這在需要安全性和完整性的場景中特別有用。
- API 認證:在微服務架構中,不同服務之間常常需要互相溝通並確保請求來自於授權的來源。JWT 在這種情況下可以作為每個請求的憑證,讓每個服務都能輕鬆地驗證用戶身份,從而統一和簡化整個認證流程。