Secrets stay local
Decoding is pure base64url + JSON parsing in your tab. Verification keys are used in-memory via WebCrypto and never transmitted or stored.
Developer Tools
Paste a token, read it like a human: decoded header and payload, annotated claims with local timestamps, expiry at a glance — plus optional signature verification.
In short
A JSON Web Token is three base64url segments joined by dots: a header naming the signing algorithm, a payload of claims, and a signature over the first two. Decoding needs no key because base64url is not encryption. This decoder shows header and payload, converts iat, exp and nbf to local time, and verifies HS256/384/512 and RS256 signatures in your browser.
By NaveenKumar T · Updated
Learn: SHA-256 vs MD5 vs HMAC: How Hashing Works and Which One to Use
Runs entirely in your browser — nothing you paste or open here is uploaded, logged, or stored.How we handle data →
Why this tool
Tokens grant access to real systems — pasting them into a random website is a risk. Here, decoding and verification run in your browser only.
Decoding is pure base64url + JSON parsing in your tab. Verification keys are used in-memory via WebCrypto and never transmitted or stored.
iat, exp and nbf are shown as your local time with a relative countdown — no more pasting epoch seconds into a converter to learn the token died yesterday.
Verify HMAC tokens (HS256/384/512) with the shared secret, or RS256 with the issuer's PEM public key — the same RSASSA-PKCS1-v1_5 check your backend runs.
Paste straight from a curl header — Bearer prefixes are stripped automatically, malformed tokens get a specific error, and each segment is color-coded.
Learn more
A JWT is three base64url-encoded segments joined by dots: a header naming the signing algorithm, a payload of claims, and a signature over the first two segments. Nothing about it is encrypted — base64url is an encoding, not a cipher — which is why a decoder needs no keys and why you should never put secrets in a payload.
Claims follow RFC 7519: registered names like iss (issuer), sub (subject), aud (audience) and the three time claims iat, exp and nbf, expressed as Unix epoch seconds. This decoder labels the registered claims and converts the time claims to your local timezone with a relative offset, which turns debugging "401 Unauthorized" loops into a two-second glance.
Anyone can decode a JWT; only a holder of the right key can verify one. Verification recomputes the signature — built per RFC 7515, the JSON Web Signature spec a JWT's third segment follows — over the header and payload and compares it against that segment. With HS* algorithms the same secret signs and verifies; with RS*/ES* the issuer signs with a private key and you verify with the public one.
This page verifies HS256, HS384, HS512 and RS256 — the four algorithms behind the overwhelming majority of real-world tokens — using WebCrypto in your browser. Treat the result the way your API gateway would: an invalid signature means the token was tampered with, signed by someone else, or corrupted in transit.
This is the canonical HS256 demo token from jwt.io — the same value the Sample button loads in the decoder above. Its three base64url segments decode to the header and payload shown here.
| Claim | Value | Meaning |
|---|---|---|
| sub | 1234567890 | Subject — the id of the user this token represents |
| name | John Doe | A custom claim carrying a display name (not part of RFC 7519's registered set) |
| iat | 1516239022 | Issued At, in Unix epoch seconds — January 18, 2018, 01:30:22 UTC |
{
"alg": "HS256",
"typ": "JWT"
}{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}Help
Everything you need to know about the JWT Decoder.
Paste the token into the input — decoding happens as you type. The three base64url segments are color-coded, the header and payload appear as formatted JSON, and every claim is listed in a table with registered-claim labels (iss, sub, aud…) and local-time renderings of date claims.
The status badge evaluates exp and nbf against your clock and reports valid, expired, or not-yet-valid, with a relative time ("exp in 2 hours"). Remember that decoding never proves authenticity — check the signature if that matters.
Your browser's WebCrypto API implements the same primitives your backend uses. For HS256/384/512, enter the shared secret and the tool recomputes the HMAC; for RS256, paste the issuer's public key in PEM (SPKI) form. The result is a cryptographic yes/no, computed locally.
It shouldn't — both decode the same RFC 7519 structure. Differences usually mean your token was truncated in transit (check for missing trailing characters) or contains a non-JSON payload, which this tool reports explicitly instead of guessing.
Keep working
Round-trip any text through Base64 — emoji and all — with a URL-safe mode for tokens and strict validation that catches corrupted input.
Developer Tools
Format, beautify, and validate JSON instantly in a professional VS Code-style editor — free, fast, and 100% private.
Developer Tools
Paste a timestamp in seconds or milliseconds — or a date string — and get every form of the same instant at once, without ever consulting the clock.
Developer Tools
Learn the format
What a cryptographic hash guarantees, why MD5 and SHA-1 are broken but fine for checksums, how HMAC differs from a hash, and why passwords need Argon2.
6 min readGuide · Web & APIsDecode any JWT in seconds: the three-part structure, Base64url quirks, code and no-code methods — and the critical difference between decoding and verifying.
2 min readGuide · Web & APIsHow Base64 works: 3 bytes become 4 characters, why the = padding exists, where it's used (JWT, data URIs, K8s secrets) — and why it's NOT encryption.
2 min read