NV ToolkitFormat · Validate · Convert

Developer Tools

JWT Decoder & Verifier

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

  • Decodes header, payload & claims
  • iat/exp/nbf as local time + relative
  • Expired / not-yet-valid badge

Runs entirely in your browser — nothing you paste or open here is uploaded, logged, or stored.How we handle data →

Why this tool

A JWT debugger that respects your secrets

Tokens grant access to real systems — pasting them into a random website is a risk. Here, decoding and verification run in your browser only.

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.

Time claims, humanized

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.

Real signature checks

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.

Built for debugging flow

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

What's inside a JSON Web Token?

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.

Decoding vs. verifying — the distinction that matters

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.

Worked example

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.

The three claims in the payload
ClaimValueMeaning
sub1234567890Subject — the id of the user this token represents
nameJohn DoeA custom claim carrying a display name (not part of RFC 7519's registered set)
iat1516239022Issued At, in Unix epoch seconds — January 18, 2018, 01:30:22 UTC
Decoded header
{
  "alg": "HS256",
  "typ": "JWT"
}
Decoded payload
{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

Help

Frequently asked questions

Everything you need to know about the JWT Decoder.

01How do I decode a JWT?

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.

02Can this tell me if a token is expired?

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.

03How does signature verification work without a server?

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.

04Why does jwt.io show the same token differently?

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

Related tools

Learn the format

Related guides

All guides →