JWT Decoder

Decode JSON Web Tokens (JWT) instantly. View header, payload, and signature with human-readable timestamps.

fact_check Reviewed by Senior Editor
verified Reviewed: Jul 28, 2026
update Updated: Jul 28, 2026
commit v2.0.0
schedule 6 min read

lightbulb When to use this tool

  • check_circle Debugging a 401 Unauthorized error by inspecting the JWT payload to check user roles, permissions, or required claims.
  • check_circle Checking whether a JWT token has expired by reading the exp (expiration) timestamp in human-readable format.
  • check_circle Verifying the algorithm in the header (alg field) matches what your backend expects (HS256, RS256, etc.).
  • check_circle Inspecting custom application claims in the payload during development to confirm they are populated correctly.
  • check_circle Reading the sub (subject), iss (issuer), and aud (audience) claims to debug token validation failures.

Why use our tool?

Three-Section Breakdown — Header, Payload, Signature Status

Epoch Timestamps Converted to Readable Dates

Your Token Never Leaves Your Browser

Instant — No Submit Button Required

Clear Invalid Token Error Handling

How it works

1

Paste your full JWT token (the three-part string beginning with eyJ...) into the input field.

2

The tool immediately splits the token and displays decoded JSON for the Header and Payload sections.

3

Review the Header for the algorithm (alg) and token type (typ).

4

Review the Payload for all claims: sub, iss, aud, exp, iat, nbf, and any application-specific custom claims.

5

Check the expiry (exp) field — it is displayed as both the raw Unix timestamp and a human-readable datetime.

Examples

science Debugging a 401 — Checking Token Claims

science Checking Algorithm for Security Review

Frequently Asked Questions

Does this tool verify the JWT signature? expand_more
No — and this is by design. JWT signature verification requires the secret key (for HMAC algorithms like HS256) or the public key (for RSA/EC algorithms like RS256, ES256). These keys are secret by definition and should never be pasted into a browser tool. Signature verification must happen on your backend server using your secure key material. This tool decodes the header and payload sections for inspection — it does not validate that the token has not been tampered with.
Is it safe to paste a real JWT token into this tool? expand_more
The token is decoded entirely client-side in your browser using JavaScript's atob() function — it is never transmitted to Utility Spark's servers. However, general security hygiene recommends treating production JWTs containing real user data as sensitive. If possible, use test environment tokens for debugging. If you must inspect a production token, this tool is safer than alternatives that process tokens server-side (like JWT.io, which routes through Auth0's infrastructure).
What are the three parts of a JWT? expand_more
A JWT consists of three Base64url-encoded segments separated by dots (.). The Header contains the signing algorithm (alg) and token type (typ: JWT). The Payload contains the claims — standardized ones like sub (subject/user ID), iss (issuer), exp (expiration), iat (issued at), and any custom application-specific data. The Signature is a cryptographic hash of the header and payload, signed with the secret/private key. Only the header and payload are decoded as readable text — the signature is binary data.
What does 'alg: none' mean in a JWT header, and why is it dangerous? expand_more
An alg claim of 'none' means the token has no cryptographic signature — it is an unsigned JWT. Any server that accepts alg:none tokens can be attacked by an adversary who crafts a JWT with any claims they want (any user ID, any roles), signs it with 'none', and the server accepts it as valid. This is a known critical vulnerability (originally discovered in 2015). Seeing alg:none in a token you are debugging is a serious finding that should be escalated immediately.
What is the exp claim and how do I convert it to a readable date? expand_more
The exp (expiration time) claim is a Unix epoch timestamp — the number of seconds since January 1, 1970 UTC. To convert manually: in JavaScript, new Date(exp * 1000).toString(). In Python: datetime.fromtimestamp(exp). This tool automatically converts exp, iat, and nbf timestamps to human-readable local datetime strings alongside the raw value.
Can I decode a JWT from a cookie or localStorage? expand_more
Yes. If your application stores the JWT in localStorage, open your browser's DevTools (F12), go to the Application tab, find Local Storage for your domain, locate the token value, copy it, and paste it here. For cookies, go to the Application tab, find Cookies, locate the JWT cookie value, and copy it.
Why does my token say 'Invalid JWT format'? expand_more
JWTs must have exactly three segments separated by two dots: header.payload.signature. If your pasted string has fewer or more dots, it is not a valid JWT. Other common issues: (1) The token was URL-encoded — look for %2F and %2B characters that should be / and + (or - and _ in Base64url). (2) You pasted only the payload segment without the header and signature. (3) The token has extra whitespace or newline characters — ensure there are no line breaks in the pasted value.

More Developer & Security