JWT 與安全 Token 指南示意圖

您是否只是「姑且」用之?

在現代網頁開發中,JWT (JSON Web Token) 已成為身份驗證的主角。多虧了優秀的函式庫,即便不深入了解內部結構,也能做出「能跑」的東西。然而,這種「姑且用之」的心態,有時可能會造成無法挽回的安全漏洞。

「JWT 到底是在保護什麼?」、「簽章(Signing)與雜湊(Hashing)有什麼不同?」
讓我們解開這些疑問,成為能充滿自信談論資訊安全的工程師。

JWT「三個碎片」扮演的角色

JWT 是由點(.)分隔出的三個部分所組成:

  1. 標頭 (Header):信封的封面,記錄了「是用什麼方式簽名的」。
  2. 載荷 (Payload):信件的內容,記錄了「是誰」以及「到何時為止」有效。
  3. 簽章 (Signature):證明信封中途沒被打開或內容沒被更動的「蓋章驗證」。

這裡最重要的一點是:「標頭與載荷是任何人都讀得到的」。它們僅是被 Base64 編碼,而非被加密。在載荷中放入密碼或信用卡號,就像是把信件放入透明塑膠袋而非信封中寄出。

信任的關鍵:簽章與雜湊

JWT 真正的價值在於其「完整性(Integrity)」,而支撐這一點的正是雜湊與簽章。

  • 雜湊:為資料製作「數位指紋」(例如:「如果是這份資料,就會產生這個值」)。
  • 簽章:用密鑰(Secret Key)在雜湊值上蓋章。如果不具備密鑰的第三方竄改了載荷中的任何一個字,它就會與簽章產生不一致,從而立刻被識破是「偽造品」。

如何派送金鑰:JWKS 的魔法

當使用公鑰驗證(如 RSA)時,驗證方該如何取得金鑰(Key)?
這時就會用到 JWKS (JSON Web Key Set)

伺服器會在網路上公開「最新的公鑰在這裡喔!」,而驗證方則會自動去讀取它。這套機制讓系統得以在不停止運行的情況下,安全地進行金鑰的定期更新(輪換)。

在 DevToolKits 「體會」安全性

僅靠文字難以理解的概念,只要實際操作一次便能融會貫通。

  • JWT 工具:在瀏覽器中安全地觀察您的 Token 是由哪些「碎片」組成的。
  • JWKS 產生器:生成金鑰對,並模擬它們實際上是以何種 JSON 格式公開的。
  • 雜湊生成工具:使用 SHA-256 等演算法,親眼見證資料是如何轉變成「指紋」的。

常見問題

該用 HS256 還是 RS256?

如果簽發與驗證都在同一處,HS256(共用密鑰)就足夠,實作也比較單純。但若有多個服務只需要驗證,請改用 RS256:密鑰只留在簽發端,對外只發布公開金鑰,這樣即使驗證端外洩也無法偽造權杖。

如何在不停機的情況下輪替金鑰?

關鍵是讓驗證端進入同時接受多把金鑰的狀態。先把新金鑰加入驗證清單(此時尚未用於簽發),等部署完成後再把簽發切換到新金鑰,最後等舊權杖全部過期,才移除舊金鑰。以 JWKS 發布公開金鑰時可用 kid 區分金鑰,這個流程會更順暢。

JWT 可以加密嗎?

可以。相對於只做簽章的 JWS,JWE 會加密酬載。一般所說的 JWT 指的是 JWS,酬載只是 Base64URL 編碼,任何人都能讀取。因此把個資或權限細節放進酬載,等同於公開它們。需要隱藏時請使用 JWE,或者一開始就不要放進去。

同一個 JWT 可以同時用於驗證身分與授權嗎?

可以,但不建議。授權資訊(權限、角色)經常變動,而 JWT 一旦簽發就無法收回,於是會出現「已經降低權限,舊權杖卻仍可存取」的狀況。較安全的設計是:權限在每次請求時由伺服器確認,JWT 只承載「這是誰」。

結語

資訊安全就是將「不安」轉化為「確信」的過程。
正確了解原理並使用合適的工具,您的系統將變得更強大、更值得信賴。歡迎來到這個雖然低調卻至關重要的資安世界。