在前一天,我們已經手刻了一個簡單的 JWT 工具類別,從 Header / Payload / Signature 的組裝到 HMAC-SHA256 簽名 的驗證,一步步看見了 JWT 的運作方式。
這樣的學習方式能夠幫助我們理解 JWT 的底層邏輯,但如果要在真實專案裡運作,通常沒有人會真的手寫所有細節。
就我所理解的,在實務上,我們會使用 已經成熟、被廣泛使用的 JWT 套件,這樣能確保:
這個基本上,在不同的程式語言都會有支援的套件,像是python就有PyJWT等,只要去找,五相信就能找到不同的。在這篇文章中,我們主要介紹的是Java提供的兩種套件,讓大家理解這兩個套件以及針對自己的需求去使用。
在 Java 生態系中,最常見的套件有兩個:
前幾天已經介紹過,JWT(JSON Web Token)就是由 IETF RFC 7519 規範的標準,目的是 在兩方之間安全地傳輸 JSON 格式的訊息。
在 GitHub 上,有一個整理各種語言 JWT 實作的專案:jwt.io 也會被頻繁引用。
在 jwt.io 官方網站 你甚至可以直接貼上 Token,馬上解碼出 Header 與 Payload(當然不包含驗證)。
功能特點:
這個專案的維護團隊就是 jwt.io 的主要貢獻者之一,因此它被視為 Java 世界裡 最標準、最直觀的 JWT 實作。
Jwts.builder()
→ 設定 sub
、claims
、iat
、exp
→ .signWith(key)
→ .compact()
Jwts.parserBuilder()
→ .setSigningKey(key)
→ .parseClaimsJws(token)
從 GitHub 的範例來看,它的 API 結構幾乎就是在「寫一份 Token 說明書」,非常直觀。
這個套件由 Auth0(身份驗證平台公司) 維護,它的定位是更 企業級 的 JWT 解決方案。
JWTVerifier
驗證器:可以設定額外條件(例如必須有特定 subject,或是 token 來自指定 issuer)JWT.create()
→ .withSubject("xxx")
→ .withClaim("role", "admin")
→ .sign(algorithm)
JWT.require(algorithm)
→ .withSubject("xxx")
→ .build().verify(token)
從 GitHub 的範例來看,它更強調「驗證條件」,不像 jjwt 那麼直白。
特色 | jjwt | java-jwt |
---|---|---|
維護團隊 | jwtk,JWT 標準社群 | Auth0,身份驗證平台公司 |
API 風格 | 宣告式(builder + parser) | 鏈式呼叫(create + verifier) |
功能 | JWS + JWE(簽名 + 加密) | 主要偏向 JWS(簽名),與 Auth0 平台結合更強 |
驗證機制 | 直接用 key 驗證簽名、解析 claims | 有 Verifier 機制,可加上條件限制 |
適合對象 | 學習、Demo、小型專案 | 大型專案、需要更嚴謹驗證邏輯 |
文件/社群 | 文件清楚、範例完整 | 文件專業、與 SaaS 生態相連結 |
jjwt
→ 社群標準、簡單易用java-jwt
→ 企業級、驗證機制強大jjwt
就足夠了。java-jwt
會是更佳選擇。今天我們展示了「寫程式碼」與「用套件」之間的差異:
接下來,我們會把這些套件和 Spring Security 整合,讓驗證邏輯變得更簡單、更模組化。
大家明天見!