JWT Decoder & Debugger
Paste a token to see what’s inside it, what’s wrong with it, and whether the signature checks out. Every problem is explained in plain English with how to fix it. Verifies HS, RS, PS, ES and EdDSA, signs test tokens, and compares two.
A JWT is three base64url pieces joined by dots. The first two are just encoded JSON that anyone can read; only the signature, checked with the right secret or public key, proves the token is genuine.
How this token is built, step by step
Builds and signs a token in your browser. Use test keys only; the generated keys are for development and never leave this page.
Paste two tokens to see which claims changed, e.g. before and after a permission change, or the same user in two environments.
Both tokens are decoded locally and compared claim by claim.
How to debug a JWT
- Paste the token, or the whole
Authorization: Bearer …header. - Read the summary at the top: it names the first thing that would make a server reject the token.
- Go through the checks: expiry, clock skew, audience, issuer, algorithm and signature format, each with a fix.
- Paste the secret or the issuer’s public key (PEM, certificate, JWK or JWKS) to verify the signature.
What it catches
- Expired, not-yet-valid and future-dated tokens
- Timestamps in milliseconds or quoted as strings
alg: none, unknown algorithms, remotejkukeys- DER-encoded ECDSA signatures and wrong signature lengths
- Standard Base64 instead of base64url, truncated tokens, JWE
- Wrong secret, base64 secrets, rotated keys (
kid)
Related tools
Frequently Asked Questions
Is it safe to paste my JWT here?
Yes. Decoding, verification and signing all run in your browser with the Web Crypto API; nothing is uploaded or logged. Even so, prefer test tokens and test keys, and never paste a production private key into any website.
Why is my JWT rejected?
Paste it and read the summary at the top: it names the first problem a server would reject. The most common causes are an expired exp, a nbf in the future or clock skew, an aud or iss that doesn't exactly match what the API expects, times written in milliseconds instead of seconds, and a signature checked with the wrong secret or key.
Why does it say the signature is invalid?
For HMAC tokens (HS256/384/512) the secret differs: check case, stray spaces or line breaks, and whether the secret is base64-encoded. For RS, PS, ES and EdDSA tokens the public key doesn't belong to the key that signed it, often because the issuer rotated keys; compare the token's kid with the JWKS. Any change to the token after signing also breaks the signature.
Which algorithms and key formats can it verify?
HS256, HS384, HS512, RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384, ES512 and EdDSA (Ed25519, where your browser supports it). Public keys can be PEM (SPKI or PKCS#1), an X.509 certificate, a JWK, or a whole JWKS, in which case the key matching the token's kid is used.
Is a JWT encrypted?
No. A normal JWT (JWS) is only base64url-encoded, so anyone who has it can read the header and payload. The signature proves it wasn't changed, not that it's secret. Encrypted tokens (JWE) have five parts instead of three; this tool recognises them and shows their header.
What is the difference between HS256 and RS256?
HS256 uses one shared secret to both sign and verify, so every service that verifies tokens could also create them. RS256 (like PS256, ES256 and EdDSA) signs with a private key that only the issuer holds and verifies with a public key that can be shared freely, usually via a JWKS URL.
What do exp, nbf and iat mean?
They are times in seconds since 1 January 1970 UTC. exp is when the token expires, nbf (not before) is when it starts being valid, and iat (issued at) is when it was created. Servers usually allow about 60 seconds of clock skew. The tool shows each as a local date, as UTC and as time from now.
What does alg none mean?
The token is unsigned, so anyone can create or modify it. Servers must reject such tokens; accepting alg none is a classic JWT vulnerability. The Encode tab can create one so you can test that your API rejects it.
How do I create a JWT for testing?
Open Encode / sign, pick an algorithm, edit the header and payload (buttons add iat, exp, nbf and jti), and enter a secret or click Generate test key pair for RSA, ECDSA or Ed25519. The signed token updates as you type, and Debug this token opens it with the matching key filled in.
Can I compare two JWTs?
Yes. The Compare two tab lines up every claim from both tokens, highlights what differs or exists on only one side, notes different algorithms or keys, and shows a line diff of the decoded header and payload.