Skip to content
cliplimeClipLime

Decode a JWT

Read a token's header, payload and expiry. Decoding is not verifying.

Your token stays in your browser and is never sent anywhere

Decoding is not verifying

Anyone can read what is inside a JWT, and anyone can change it. This page decodes the header and payload, but it does not check the signature unless you type a secret in the signature section. Never trust a token just because it decodes, and never rely on a page like this to decide who is allowed in: your server must verify the signature itself.

Your token stays in your browser. It is not sent, stored or logged anywhere.

Also works with "Bearer " in front, or copied from an Authorization header.

The header, payload, readable dates and signature section appear here once you paste a token.

At a glance

What it does
Splits a JSON Web Token and decodes its header and payload, with readable dates for exp, nbf and iat.
Not verified
Decoding is not verifying. Nothing here proves a token is genuine unless you type a secret and the signature matches.
Signature check
Optional, for HS256, HS384 and HS512 only, with a secret you type, using Web Crypto in your browser.
Other algorithms
RS256, ES256 and the rest need a public key. This page reads their header but cannot check their signature.
Times
Shown in UTC and in your time zone, with how long until the token expires or since it expired.
Also reads
Tokens with Bearer in front, tokens wrapped across lines, and the header of encrypted (JWE) tokens.
Privacy
The token and any secret stay in your browser. They are never sent, stored or logged.

How to do it

  1. 1

    Paste the token

    Paste it as it is, or with Bearer or an Authorization: header in front. The three parts are colored so you can see where each one ends.

  2. 2

    Read the header and payload

    The header says how the token was signed. The payload holds the claims, each explained, with dates for the time claims.

  3. 3

    Check the times

    A badge shows whether the token has expired, is not active yet, or has no expiry. This only compares the claims with your clock.

  4. 4

    Check an HS256 signature (optional)

    If the token uses a shared secret, type the secret in the signature section. The check runs in your browser.

What is inside a JWT

A JSON Web Token (RFC 7519) is three parts separated by dots: header.payload.signature. The header and payload are JSON written as URL-safe Base64, which is an encoding anyone can reverse, not encryption. The signature is binary data, also written as Base64.

  • Header: how the token is signed. alg is the algorithm, such as HS256 or RS256, and typ is usually JWT.
  • Payload: the claims. Registered ones include iss (issuer), sub (subject), aud (audience), exp (expiry), nbf (not before), iat (issued at) and jti (token ID). Apps add their own, such as a role or an email address.
  • Signature: a code computed from the header and payload with a secret or a private key. It is what lets a server detect tampering.

Because the payload is only encoded, anyone who holds the token can read it. Never put passwords or other secrets in a JWT payload.

Decoding is not verifying

Reading a token and trusting a token are different things. Anyone can write a header and a payload that decode perfectly, with any claims they like. The only thing that separates a genuine token from a forged one is the signature, checked with the right key.

This page decodes without checking the signature unless you type a secret, so a decoded token here proves nothing about where it came from. A server that accepts tokens has to:

  • verify the signature with its own key, and choose the algorithm itself instead of reading it from the token. Libraries that trusted the token's alg value have accepted forged tokens, including ones with alg set to none;
  • check exp and nbf against the current time, allowing a little clock difference;
  • check that iss and aud are what it expects.

Use a decoder to understand a token while debugging. Do not use one to decide who may do what.

Reading exp, nbf and iat

These three claims are a number of seconds since 1 January 1970 UTC. A value such as 1791291600 is an absolute moment, so it is the same instant everywhere. The tool shows it in UTC and in your own time zone, and how far away it is.

  • A token is expired once the current time is at or after exp.
  • A token is not yet usable while the current time is before nbf.
  • A 13 digit number is almost always milliseconds, which JWT does not use. The tool warns when it sees one.

If a token looks expired but should not be, compare the dates here with the clock of the machine that checks it. A few minutes of drift between servers is a common cause.

Checking an HS256 signature here

HS256, HS384 and HS512 sign with a shared secret. The signature is an HMAC of the exact text header.payload, with that secret as the key. To check one, type the secret. The page recomputes the HMAC with the browser's Web Crypto and compares it with the signature in the token.

A match means this secret signed this exact header and payload. It does not mean the claims are acceptable, because it says nothing about exp, iss or aud. A mismatch means the secret is wrong or the token was changed after signing. If your secret is stored as Base64, switch on the Base64 option.

Algorithms such as RS256 and ES256 use a private key to sign and a public key to verify, and this page does not take keys. It shows their header and payload and says plainly that the signature was not checked.

Questions people ask

Is it safe to paste my token here?

The token is decoded in your browser and is not sent anywhere. Even so, treat a live token like a password: anyone who has it can use it until it expires. Prefer a test token, and do not paste production tokens into pages you do not trust.

Does this tool verify my token?

No, not by default. It decodes. Only if you type a secret for an HS256, HS384 or HS512 token does it check the signature, and the result says exactly what that proves and what it does not.

What does alg none mean?

It means the token claims to have no signature at all. Anyone can write such a token, so a server must never accept one as proof of identity. The tool warns when it sees it.

Can it verify RS256 or ES256 tokens?

No. Those need the issuer's public key, and this page does not take one. It still shows the header and payload and says the signature was not checked.

Why does the expiry differ from my server logs?

JWT times are absolute moments in UTC. The tool shows both UTC and your local time, so compare like with like. Check too that the claim is in seconds and not milliseconds.

Why does my token have five parts?

Five parts means an encrypted token (JWE), not a signed one. Its payload is encrypted, so only the header can be read here.