> 解碼 | 檢查 | 驗證 <
// 即時解碼和檢查JSON Web Token(JWT)
本地處理
100%用戶端JWT解碼。您的權杖永遠不會離開瀏覽器。
自動解碼
貼上或輸入時自動解碼JWT權杖。
完整權杖檢查
查看標頭、酬載和簽名。檢查演算法和過期狀態。
// 關於JWT解碼
JWT結構:
JSON Web Token(JWT)由三個Base64URL編碼的部分組成,用點分隔:標頭.酬載.簽名。標頭指定演算法和權杖類型。酬載包含宣告(資料)。簽名驗證權杖的完整性。
範例:
eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0In0.signature → {"alg":"HS256"} + {"sub":"1234"}
常見用途:
- >除錯Web應用程式中的認證權杖
- >檢查OAuth 2.0和OpenID Connect權杖
- >驗證權杖過期和宣告
- >理解RFC 7519的JWT結構
- >檢查Base64URL編碼完整性
>> 常見問題
問:什麼是JSON Web Token(JWT)?
答:JWT(JSON Web Token)是一個開放標準(RFC 7519),用於以JSON物件的形式在各方之間安全地傳輸資訊。它緊湊、URL安全,廣泛用於身份驗證。
問:JWT的三個部分是什麼?
答:JWT由三個用點分隔的部分組成:標頭(演算法和類型)、酬載(宣告和資料)和簽名(驗證雜湊)。每個部分都經過Base64URL編碼。
問:沒有密鑰能解碼JWT嗎?
答:可以,JWT的標頭和酬載可以被任何人解碼,因為它們只是Base64URL編碼的(未加密)。密鑰僅用於驗證簽名。
問:JWT和基於工作階段的認證有什麼區別?
答:工作階段透過工作階段ID cookie在伺服器上儲存狀態。JWT是無狀態的——權杖本身包含所有必要資訊。
問:JWT過期如何運作?
答:JWT酬載中的exp宣告以Unix時間戳指定過期時間。超過此時間後,權杖應被視為無效。
// 常見的 JWT 簽章演算法
標頭的 alg 決定簽章方式。HS* 使用共享金鑰,RS*、PS*、ES* 和 EdDSA 使用金鑰對。
| alg | 演算法 |
|---|---|
| HS256 | HMAC + SHA-256 |
| HS512 | HMAC + SHA-512 |
| RS256 | RSA PKCS#1 v1.5 + SHA-256 |
| PS256 | RSASSA-PSS + SHA-256 |
| ES256 | ECDSA P-256 + SHA-256 |
| EdDSA | Ed25519 |
// 在程式碼中驗證 JWT
僅解碼不會驗證任何內容。驗證時務必明確指定允許的演算法。
Node.js (jsonwebtoken) jwt.verify(token, secret, { algorithms: ['HS256'] })
Python (PyJWT) jwt.decode(token, key, algorithms=["HS256"])
PHP (firebase/php-jwt) JWT::decode($token, new Key($key, 'HS256'))
Go (golang-jwt) jwt.Parse(token, keyFunc, jwt.WithValidMethods([]string{"HS256"}))
Java (jjwt) Jwts.parser().verifyWith(key).build().parseSignedClaims(token)
>> 更多問題
問:標準宣告 iss、sub、aud、exp、nbf、iat、jti 分別是什麼意思?
答:iss 是簽發者,sub 是主體(通常是使用者 ID),aud 是目標受眾,exp 是到期時間,nbf 是生效時間,iat 是簽發時間,jti 是權杖唯一 ID。時間均為 Unix 秒。
問:JWT 是加密的嗎?
答:常見的已簽章 JWT(JWS)並未加密,只是 Base64URL 編碼,任何人都能讀取內容。簽章只能防止竄改。不要在其中放置敏感資料,或改用加密的 JWE。
問:如何驗證 JWT 的簽章?
答:需要金鑰:HS256 使用共享金鑰,RS256/ES256 使用公鑰。伺服器會對 標頭.載荷 重新計算簽章並比對。本解碼器在瀏覽器中執行,不會替你驗證簽章,請使用經過審核的函式庫。
問:JWT 常見的安全問題有哪些?
答:常見問題:信任權杖自帶的 alg(尤其是 none)、HS256 金鑰過弱、未檢查 exp、iss、aud、在載荷中放敏感資料,以及把長期有效的權杖存放在 localStorage。