Skip to content

JWT Decoder

Decode a JSON Web Token in your browser. Read the header, payload and claims like exp and iat. Nothing you paste is sent anywhere.

Runs entirely in your browser. Nothing you paste here is sent to us or anyone else — there is no server processing, no logging of input, and no third-party scripts on this page.

A JWT decoder splits a JSON Web Token into its three parts, base64URL-decodes the header and payload, and shows you the JSON claims inside — including expiry and issue times — without ever sending the token anywhere. Paste a token above and its header, payload, signature, and time claims appear instantly. Decoding happens entirely in your browser; the token is never verified server-side and never logged.

What is a JWT?

A JSON Web Token (JWT) is a compact, URL-safe way to represent claims passed between two parties. It is the format behind most modern API authentication and single sign-on flows: after you log in, a server hands your client a signed token, and the client sends it back on each request to prove who it is. A JWT is a string with three sections separated by dots:

header.payload.signature

Each section before the dots is base64URL-encoded (a URL-safe variant of base64). Decoding is not decryption — the header and payload are merely encoded, not hidden, so anyone holding the token can read them. That is why you must never place a secret inside a JWT payload.

The three parts explained

  • Header — a small JSON object describing the token, most importantly alg (the signing algorithm, e.g. HS256 or RS256) and typ (usually JWT).
  • Payload — the JSON object carrying the claims: who the token is about, when it expires, what it grants. This is the part you usually care about.
  • Signature — a cryptographic value computed over the header and payload with a secret or private key. It lets a server confirm the token was not tampered with. This decoder shows the signature but does not verify it.

Standard time claims

The payload often contains registered claims defined by the JWT specification. The most useful are timestamps, stored as seconds since the Unix epoch:

Claim Meaning
exp Expiration time — after this instant the token must be rejected.
nbf Not before — the token is invalid until this instant.
iat Issued at — when the token was created.
sub Subject — the principal (often a user id) the token is about.
iss / aud Issuer and audience — who minted the token and who it is intended for.

The tool reads exp, iat and nbf automatically, converts them to readable dates, and flags whether the token is expired or not yet valid.

Why this tool does not verify signatures

Decoding and verifying are two different things. Decoding reveals what a token claims; verifying proves those claims are authentic and untampered. Verification requires the key that signed the token — the shared secret for HMAC algorithms like HS256, or the issuer’s public key for RSA and ECDSA algorithms like RS256 and ES256. That key never travels inside the token, so no decoder can check the signature on its own. Rather than pretend otherwise, this tool shows the signature raw and states plainly that it is unverified. Always verify tokens in your backend with the correct key before trusting them.

A worked example

Given the header {"alg":"HS256","typ":"JWT"} and a payload containing "exp":2053044800, the decoder base64URL-decodes both sections, pretty-prints the JSON, and converts the expiry to a calendar date. If that date is in the past, the status line reports the token as expired; if nbf is in the future, it warns the token is not yet valid. The signature segment is displayed but marked “not verified”.

A word on safety

Treat every JWT as a live credential. Although this page never transmits, logs, or stores what you paste — decoding runs on your device with the browser’s own base64 and JSON functions — you should never paste a production or session token into any online decoder you have not verified for yourself. A hostile page could quietly steal it. For sensitive tokens, decode them offline once this page has loaded, or use trusted local tooling. Our behaviour is inspectable so you can confirm exactly what happens to your input.

Frequently asked questions

Is my token sent to a server?

No. The token is split and base64URL-decoded entirely in your browser using built-in functions. Nothing you paste is uploaded, logged, or stored, and it is never verified server-side. You can disconnect from the internet and the decoder still works.

Does this verify the signature?

No, and it says so honestly. Verifying a JWT signature requires the signing secret (for HMAC algorithms like HS256) or the issuer's public key (for RSA/ECDSA like RS256 or ES256). Those keys are not part of the token, so a decoder that does not hold them cannot check the signature. Decoding only reveals what the token claims — it does not prove the token is authentic.

What are exp, iat and nbf?

They are standard registered claims expressed as Unix timestamps (seconds since 1 January 1970 UTC). exp is the expiry time, iat is when the token was issued, and nbf (not before) is the earliest time the token is valid. The tool converts each to a human-readable date and tells you whether the token is expired or not yet active.

Why does my payload show numbers instead of dates?

Inside a JWT, times are stored as raw Unix timestamps to keep the token compact. A value like 1716239022 is seconds since the epoch. The decoder reads exp, iat and nbf and renders them as readable UTC and local dates in the time-claims panel.

Is it safe to paste a production token here?

Treat every JWT as a live credential. Although this tool never transmits your input, you should never paste a production or session token into any online decoder you have not personally verified, because a malicious page could exfiltrate it. For real secrets, decode offline or inspect the token with local tooling.

What does "alg none" mean?

Some tokens use the algorithm "none", meaning they carry no signature at all. Such tokens are trivially forgeable and must never be trusted for authentication. If the decoder shows an empty signature or alg none, treat the token as unsigned.

The decoder says my token is a JWE. What is that?

A standard JWT you can read has three dot-separated segments. A token with five segments is a JWE — an encrypted JSON Web Token. Its payload is ciphertext and cannot be decoded without the decryption key, so this tool reports it rather than showing garbage.

Why did I get a malformed-token error?

A readable JWT is header.payload.signature — three parts joined by dots, each base64URL-encoded. The error means a segment is missing, empty, or contains characters that are not valid base64URL. Check that you copied the whole token and did not include surrounding quotes or the "Bearer " prefix.