Decode any JWT token
Paste a JSON Web Token to inspect its header, payload claims, and signature. Decoding is inspection only — no secret needed. Runs entirely in your browser.
{
"alg": "HS256",
"typ": "JWT"
}{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
How to decode a JWT: a complete step-by-step guide
A JSON Web Token (JWT) is three base64url-encoded segments — header.payload.signature — joined by dots. The first two segments are JSON; the third is a cryptographic signature computed against the issuer's secret or private key. This tool decodes all three locally so you can inspect RFC 7519 claims without sending the token anywhere.
- 01
Paste a JWT from a request header
Drop a JWT from an
Authorization: Bearerheader, an OAuth callback, a cookie, or a query parameter. Tokens always start witheyJ— that's{"base64url-encoded.Validation runs as you type. Each of the three dot-separated segments is decoded independently; if any segment isn't valid base64url, the exact position is highlighted.
Bearer tokenOAuthcookiebase64urlRFC 7519input · raw token3 segmentseyJhbGci….eyJzdWIi….SflK…
210 B · 1 lineJWS compact - 02
Read the header — algorithm and key hint
The header is a tiny JSON object with the signing algorithm (
alg) and token type. Common values:HS256(HMAC-SHA256),RS256(RSA-SHA256),ES256(ECDSA P-256), orEdDSA.Watch for
"alg": "none"— a historical attack vector where attackers strip the signature. If you see it on a production token, treat it as suspicious.HS256RS256ES256EdDSAalg=noneheader · decodedRFC 7515{ "alg": "HS256", "typ": "JWT" }36 B · 1 segmentparsed · safe - 03
Inspect payload claims and expiry
The payload is JSON with registered claims (
iss,sub,aud,exp,iat,nbf,jti) plus any custom fields the issuer added (roles, scopes, tenant ID, user attributes).Timestamps are Unix epoch seconds; the tool shows the human-readable date next to each. If
expis in the past, the token is expired even if the signature is still valid.isssubexpiatscopeUnix epochpayload · claimsiat → exp{ "sub": "1234567890", "name": "John Doe" }120 B · 7 claimsexpires in 14 min - 04
Copy decoded view or verify signature elsewhere
Grab the formatted
header + payload + signatureblock to paste into a ticket, share with a teammate, or feed into a verifier. The signature itself stays raw — you'll need the issuer's secret or public key (JWK / PEM) to verify it.Decoding is not verification. This tool inspects the contents; use the JWT Encoder or your JWKS endpoint to confirm the signature is genuine.
clipboardJWKSverificationsignatureprivacy-firstexportdecoded blobCopied
shipped0 outbound
Encoding without surprises
Always UTF-8 first
Use TextEncoder / TextDecoder for bytes ↔ string conversion. btoa alone breaks on non-ASCII.
URL-safe vs standard Base64
Standard uses +, /, =; URL-safe swaps to -, _, no padding. Don’t mix them.
Hashes aren’t passwords
SHA-256 is fast; that’s good for fingerprints, bad for passwords. Use bcrypt / argon2 for credentials.
Watch padding rules
Some decoders are strict about = padding, others auto-pad. If round-trips fail at exactly 1 or 2 bytes, check padding.
Use Web Crypto for keys
Generate cryptographic keys via crypto.subtle, never Math.random. The latter is predictable.
JWT decode ≠ verify
Decoding a JWT just splits and base64-decodes. Verification needs the issuer’s public key / shared secret.
When to decode a JWT
Debugging auth, inspecting claims, building integrations.
Auth debugging
See exactly what claims your auth provider issued. Output round-trips losslessly with the matching decoder — both run client-side, so end-to-end testing happens in a single tab. Encoding flows through TextEncoder for predictable UTF-8 semantics.
RFC-compliantExpiry checks
Spot-check the exp claim against the current time. Web Crypto's subtle.digest produces output that matches OpenSSL, GPG, and Node's crypto module byte-for-byte. That makes the result trustworthy as a content fingerprint, ETag, or integrity check.
OpenSSL-matchedCustom claims
Inspect non-standard fields used by your app. Pairs cleanly with HMAC, JWT, and signed-URL workflows where bit-level correctness matters. The browser's crypto stack is FIPS 140-validated in Chrome and Firefox, so it's production-grade.
losslessCross-team handoff
Show a teammate the exact contents of a token. Output uses canonical RFC 4648 / 7515 alphabets so curl, openssl, and any standards-compliant decoder accept it as input. URL-safe variants drop padding for tokens that travel in query strings.
byte-identicalPen testing
Verify tokens don't leak sensitive data in the payload. Heavy hashing runs through useMemo so large inputs don't block typing. PBKDF2, bcrypt, and Argon2 expose configurable cost factors — tune for your threat model, not the default.
spec-gradeIntegration tests
Build assertions against decoded JWT payloads. Same input plus same options always yields identical bytes. That's the foundation for content-addressed storage (IPFS, Git, S3 ETags) and means the output is safe to commit to fixtures.
production-readyFrequently asked questions
Something missing?
Tell us what you need. We ship the top requests every two weeks.