網站登入憑證解析:從號碼牌到 Cookie 與 JWT 的運作機制
更新日期: 2024 年 11 月 14 日
在網站登入系統中,憑證用於驗證使用者身份,確保安全的資料交換。
除了傳統的 Cookie 之外,JSON Web Token (JWT) 也是一種常見的憑證機制。
JWT 提供了更靈活的方式來傳遞和驗證使用者資訊。
本文將從客戶端、伺服器和 JWT 憑證的角度出發,介紹其在登入系統中的應用。
登入憑證的運作方式
網站登入可以類比於我們在購買手搖飲時,店家提供號碼牌的方式。
網站會在使用者登入後提供一個憑證來證明其身份,讓使用者能夠存取個人資料或私有內容。
客戶端的登入憑證:取得號碼牌
在網站使用者(客戶端)登入後,會取得一張號碼牌作為憑證。
網站會生成唯一的憑證代碼,並保存在 Cookie 或其他存儲方式中(例如 Local Storage)。
在使用 JWT 時,這個憑證就是加密的 JSON 字串(Token),用於後續的請求驗證。
伺服器的登入憑證:製作飲料的參考
伺服器會根據使用者提供的憑證來驗證其身份。
當伺服器接收到有效的憑證時,就可以根據使用者的身份調用相關資料。
例如,JWT 是一種無狀態的憑證格式,可以直接包含使用者的身份資訊,讓伺服器無需存儲會話資料。
JWT 憑證的作用與運作方式
JWT 是一種自包含的憑證格式,它是一段加密的字串,包含了使用者資訊和簽名,用來驗證用戶身份。
JWT 的典型結構為三部分:Header(標頭)、Payload(負載)、Signature(簽名),使用點號 .
隔開。
JWT 的三部分結構
- Header(標頭):說明 Token 的類型和加密算法,例如
{"alg": "HS256", "typ": "JWT"}
。 - Payload(負載):包含使用者的身份資訊,例如使用者 ID 或角色權限。這部分可以自訂。
- Signature(簽名):由 Header 和 Payload 經過加密算法生成,用於驗證 Token 的真實性。
JWT 的存儲與傳遞
JWT 可以儲存在 Local Storage 或 Cookie 中,並隨後在每次請求中通過 Authorization
標頭傳遞給伺服器。
伺服器接收 JWT 後會解碼驗證簽名,確認 Token 的有效性。
JWT 與 Cookie 的比較
- 無狀態(Stateless):JWT 是無狀態的,使用者資訊直接包含在 Token 中。伺服器不需存儲會話資訊,減輕了伺服器的負擔,適合分散式系統。
- 有效期限:JWT 本身內建有效期限,但不像 Cookie 可以自動過期和刷新。為了安全性,通常使用短期 JWT,並搭配 Refresh Token 機制以延長有效期。
- 安全性:由於 JWT 包含敏感資訊,建議使用 HTTPS 傳輸,並考慮將 JWT 存儲在 Cookie 且設置為 HTTP-only,防止 JavaScript 獲取。
JWT 的刷新機制
JWT 憑證通常有較短的有效期,過期後會失效,使用者需要重新登入以取得新的 Token。
然而,若使用 Refresh Token 機制,可以在不重新登入的情況下自動取得新 Token:
- 當 JWT 快到期時,前端會檢查並發送 Refresh Token 給伺服器。
- 伺服器驗證 Refresh Token 後,生成並返回一個新的 JWT,延長登入狀態。
結論
JWT 是一種靈活且無狀態的憑證機制,可以方便地攜帶使用者資訊並確保安全傳遞。
相比於傳統的 Cookie 會話管理,JWT 減輕了伺服器負擔,適合應用於需要分散式授權的環境中。
透過 JWT 和 Refresh Token 的配合,網站能在提供良好使用者體驗的同時,確保登入流程的安全性。