JWT Decoder

Paste a JWT — the signed token a website hands your browser to keep you logged in — and read what is inside: who issued it, what it permits, and whether it has expired. Nothing is sent anywhere, which matters when a token is a working login.

How to use it

A JWT is a login token made of three parts separated by full stops.

  1. Paste the token Paste the whole thing. If you copied it with the word "Bearer" in front, that is fine — it is ignored.
  2. Check the status line It tells you straight away whether the token is valid, expired, or not active yet.
  3. Read the claims Each piece of data is listed with a plain explanation. Times are shown as real dates plus how long ago or how far away they are.
Full instructions
A JWT is usually a live credential. Anyone holding it can often act as you until it expires. This tool decodes it entirely inside your browser and sends nothing anywhere — but be careful where else you paste tokens.

Your token

What is inside

In depth

Reading what a login token actually says

What the three parts of a JWT are, how to spot an expired one, why the signature is not checked here, and the security habits that keep tokens from becoming liabilities.

Screenshot: How to read a JSON Web Token
How to read a JSON Web Token as it appears when the page opens.

What a JSON Web Token is

A JSON Web Token is a small block of text that a server hands to a client after login. The client sends it back on every request to prove who it is, without the server having to look anything up in a database each time.

The token has three parts separated by dots. The first part is the header, which says what signing algorithm was used. The second is the payload, which holds the claims - facts about the user such as their name, role, and when the token expires. The third is the signature, which proves the token has not been changed since the server created it.

All three parts are Base64 encoded. That is a way of writing binary data using only letters, numbers, and a few symbols. It is not encryption. Anyone who has the token can decode the first two parts and read every claim in them, which is exactly what this page does.

Pasting a token

The left panel is labelled Your token. Paste the whole string. It typically starts with eyJ, because that is what the opening brace of the JSON header looks like after Base64 encoding.

If you copied the token from an HTTP header, you may have the word Bearer in front of it. That is fine. The tool strips it automatically. Press Example to see a sample token decoded, or Clear to start over.

A warning banner sits above the panels reminding you that a JWT is usually a live credential. Anyone who holds it can act as you until it expires. The tool decodes it inside your browser and sends nothing anywhere, but you should still be careful about where else you paste tokens.

What appears on the right

The right panel is labelled What is inside. It shows two sections: the header and the payload, each broken down into labelled fields.

The header usually contains just two fields. alg tells you the signing algorithm, such as HS256 or RS256. typ is almost always JWT. If alg is set to none, that is a red flag. Some older libraries accepted unsigned tokens, which was a serious security hole. A modern server should reject them.

The payload holds the claims. Standard claims have short names. sub is the subject, usually a user ID. iss is the issuer, the server that created the token. aud is the intended audience. iat is the time the token was issued. exp is when it expires. nbf is when it becomes valid, if that is different from when it was issued.

Custom claims can be anything. A token from an authorization service might include a list of roles or permissions. One from a payment gateway might carry a transaction reference. Whatever the server put in, it appears here.

Expiry and the status line

The status line below the token input tells you the state of the token straight away. A valid token that has not yet expired shows a green status. An expired token shows a warning with how long ago it stopped working. A token that has a nbf claim set in the future shows that it is not active yet.

Time claims in a JWT are stored as Unix timestamps. That is the number of seconds since 1 January 1970. The decoder converts each one into a normal date and time, then adds a human note like expires in 3 hours or expired 2 days ago. This saves you from having to look up a timestamp converter.

Expiry is the most common reason people decode a token. A request that was working suddenly gets a 401 response. The first question is always whether the token has run out, and the status line answers it in plain language. You do not need to paste the timestamp into a separate converter or do mental arithmetic. The answer is right there next to the claim.

Why the signature is not verified

The third part of the token is the signature. Checking it would prove the token was created by your server and has not been tampered with. This tool does not check it, and that is deliberate.

Verifying a signature requires the signing secret or the public key. Pasting your secret into any website, no matter how trustworthy it looks, would give that site the ability to forge tokens for your entire system. That is not a risk worth taking for a quick inspection.

If you need to verify a signature, do it in your own code. Libraries exist for every language. The decoder here is for reading what is inside a token, not for confirming it is genuine.

What you should and should not put in a token

A JWT is readable by anyone who holds it. That means passwords, card numbers, and any private information must never go inside one. If you can decode it on this page without a key, so can anyone else.

Put identifiers in the token - a user ID, a session reference, a role name. Keep the actual sensitive data on the server and look it up using the ID when you need it. The token is a ticket that says who you are, not a folder that carries your whole file.

Keep tokens short. Every request sends the token in a header, and headers have size limits. A token stuffed with redundant claims slows every request down and can be rejected by proxies that enforce header size caps. A good token carries just enough to authorize the request and nothing more.

Copying the decoded output

Press Copy as JSON to put the header and payload on your clipboard as formatted JSON. This is useful for pasting into a bug report, a support ticket, or a test fixture.

Be careful with what you share. A decoded token still contains the claims, and some of those may identify a real person. Strip out anything sensitive before you paste the JSON into a public issue tracker or a team chat. The user ID and email sitting in a sub or email claim are real data about a real account.

Common claims and what they mean

  • sub - the subject, typically a user ID or username.
  • iss - the issuer, which server or service created the token.
  • aud - the audience, which server or service the token is intended for.
  • exp - the expiry time, after which the token should be rejected.
  • nbf - not before, the earliest time the token is valid.
  • iat - issued at, when the token was created.
  • jti - a unique ID for this particular token, used to prevent replay.
  • scope or permissions - what the holder is allowed to do, added by many authorization servers.

Debugging a failed request

A 401 or 403 from your API is often a token problem. Here is a quick checklist for working through it.

First, paste the token and check whether it has expired. If it has, the fix is to request a fresh one. Second, check the iss and aud claims to make sure the token came from the right server and is aimed at the right service. A token issued for a staging environment will not work against production if the audience is checked. Third, look at the roles or permissions claims to confirm the user has the right access level.

If all the claims look correct and the token has not expired, the problem is likely on the server side. The signature may be checked against the wrong key, or the clock on the server may be out of sync.

Your token never leaves this tab

The entire decoding process runs inside your browser. The token is split on the dots, each part is Base64 decoded, and the resulting JSON is parsed and displayed. No network request is made.

This is especially important for JWTs because a valid token is often as good as a password. If it were sent to a server, whoever ran that server could use it to access your account. Here, the only copy of the token is in your browser's memory, and it disappears when you close the tab or clear the input. You can prove it by disconnecting from the network and pasting a token. The decoding still works, because there was never an outside connection involved.

Help

How to read a JSON Web Token

A JWT is a login token made of three parts separated by full stops. The first two are just readable data with no encryption at all — this tool turns them back into something you can read. The third is a signature that proves the token has not been altered.

Paste the token

Paste the whole thing. If you copied it with the word "Bearer" in front, that is fine — it is ignored.

Check the status line

It tells you straight away whether the token is valid, expired, or not active yet.

Read the claims

Each piece of data is listed with a plain explanation. Times are shown as real dates plus how long ago or how far away they are.

Copy if you need it

Copy as JSON gives you the header and payload for pasting into a bug report or a test.

The contents of a JWT are not secret

The first two parts are only Base64 encoded, not encrypted. Anyone who has the token can read every claim in it, exactly as this page does — no key required. That means you must never put passwords, card numbers or anything private inside a JWT. The signature stops people changing a token, but it does nothing to hide what it says.

Good to know

The signature is not checked here, on purpose

Verifying it needs your signing secret or public key. Any website asking you to paste a signing secret is asking for control of your whole login system. Verify signatures in your own code instead.

Expiry is the usual question

The "exp" claim is when the token stops working. The status line converts it into plain language such as "expires in 3 hours" or "EXPIRED 2 days ago".

Nothing is uploaded

The token is decoded entirely in your browser. That matters — a working token often grants access to a real account.

alg set to none is a red flag

If the algorithm says "none", the token carries no real signature. Some old libraries accepted these, which was a serious security hole.

Common questions

What do the three parts mean?
Header (which algorithm signed it), payload (the actual claims such as who you are and when it expires), and signature (proof it has not been changed).
Is my token sent anywhere?
No. It is decoded inside your browser. Nothing is transmitted, which is important because a valid token is often as good as a password.
Why is the signature not verified?
Because that requires the secret key. Pasting your signing secret into any website would be a serious mistake, so this tool deliberately does not ask for it.
Can I edit a token here?
You could change the payload, but the signature would no longer match and any correctly built server would reject it. That is precisely what the signature is for.
What does "exp" mean?
The expiry time, stored as the number of seconds since 1 January 1970. This tool converts it into a normal date and tells you how long is left.
Is it safe to put user data in a JWT?
Only data you are happy for the user to read. Anyone holding the token can decode it. Keep anything sensitive on your server and reference it by ID.