
開發契機:對線上除錯工具那種「難以言喻的恐懼」
在進行 Web 開發,尤其是驗證周邊的除錯時,盯著以 eyJhb... 開頭的長串 JWT (JSON Web Token) 的時間非常多。為了快速確認 Token 的內容,相信很多人都曾在 Google 搜尋過「JWT Decode」。
然而,隨著對資訊安全了解得越深,就越會發現這是一件非常恐怖的事情。
JWT 中往往包含使用者的電子郵件地址、ID,甚至系統內部的權限資訊。如果那是正式環境的 Token,「將資料貼到陌生的線上工具,無異於將家門鑰匙交給陌生人保管。」
「我們需要一個不僅是學習者,連開發製作者都能由衷感到安心的驗證『聖域』。」
JWT 解碼/驗證工具 的開發,便是始於這份對線上工具的「健全不信任感」。
技術執著:將瀏覽器轉化為「鐵壁般的執行環境」
如果只是單純解碼,只需還原 Base64 即可。但我所堅持的是,連同「簽名驗證 (Verify)」在內的正式功能,都要完全在本地端實現。
1. 引入現代資安守護神 jose
對資安工程師而言,親手編寫加密周邊的邏輯是大忌。
因此,我們採用了在現代 Web 標準中最具公信力、且充分利用 Web Crypto API 的 jose 函式庫。
import * as jose from 'jose';
// 不傳送到伺服器,僅在瀏覽器端驗證簽名
const secretKey = new TextEncoder().encode(secret);
const { payload, protectedHeader } = await jose.jwtVerify(token, secretKey);
透過使用這個函式庫,我們打造了一個環境,讓您能在不外洩任何資訊到 PC 之外的前提下,瞬間判斷「這個 Token 是否為真」。
2. 不拋棄「開發實務苦衷」的 Fallback 機制
另一方面,開發實務中也有必須調查「已經損壞的 Token」的場景。
如果是嚴格的函式庫,會因為解析錯誤而停止運作。但工程師的真心話是:「我知道它有錯,但我就是想看看裡面殘存的片段內容啊!」
因此,除了正規驗證外,我們也實作了 Base64 解碼的 Fallback 機制,即使格式稍微損壞,也能強行窺看內容。
// 吞下些微的格式損毀,救出 JSON 資料
const base64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');
const json = decodeURIComponent(atob(base64));
「尊重標準的嚴謹」與「貼近開發實務混亂問題的靈活性」。我相信這種兼顧,正是作為工具的美學所在。
名為「沈默」的安心感
在執行此工具時,請試著查看瀏覽器的「網路」分頁。
不論是按下解碼按鈕還是簽名驗證按鈕,都不會產生任何通訊。
這份「沈默」,正是我們最引以為傲的安全功能。
結語
JWT 工具是我對「如何在不損及一丁點安全性的前提下,讓複雜技術變得平易近人」的一項挑戰。
當您處理高敏感 Token 時,如果能突然想起「啊,去那裡的話就能安心測試了」,那對我而言將是莫大的榮幸。
更自由、更安全。願您的驗證開發工作能因此變得更輕鬆。