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.

Tokens and keys never leave your browser
Encoded token
Try a sample:

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.

Builds and signs a token in your browser. Use test keys only; the generated keys are for development and never leave this page.

Header
Payload
Secret

Paste two tokens to see which claims changed, e.g. before and after a permission change, or the same user in two environments.

Token A
Token B

Both tokens are decoded locally and compared claim by claim.

How to debug a JWT

  1. Paste the token, or the whole Authorization: Bearer … header.
  2. Read the summary at the top: it names the first thing that would make a server reject the token.
  3. Go through the checks: expiry, clock skew, audience, issuer, algorithm and signature format, each with a fix.
  4. 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, remote jku keys
  • DER-encoded ECDSA signatures and wrong signature lengths
  • Standard Base64 instead of base64url, truncated tokens, JWE
  • Wrong secret, base64 secrets, rotated keys (kid)

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.

More Developer Tools

JSON ToolsValidate, repair, compare & JSONPath JSON FormatterPretty-print and beautify JSON CSV Viewer & EditorView, edit and convert CSV files YAML ConverterConvert YAML to JSON and back Regex TesterTest regular expressions live Text DiffCompare two texts side by side JWT ToolDecode, encode, compare and verify JWTs JWT DecoderInspect JWT header and payload XML FormatterFormat, validate and convert XML URL EncoderEncode, decode and parse URLs Base64Encode and decode Base64 strings Hash GeneratorSHA-256, MD5, HMAC and CRC32 SHA-256Generate SHA-256 checksums MD5 GeneratorGenerate MD5 hash values Text ToolsCase convert, count and transform text Number ConverterBinary, hex and octal converter Token CalculatorEstimate LLM token counts from text PDF EditorEdit text, sign and annotate PDFs Schema GeneratorJSON to TypeScript, Go, Rust, Python IndexNowSubmit URLs to Bing, Yandex & more PII RedactorMask personal data & keys before AI Timestamp ConverterUnix epoch to date and back UUID GeneratorUUID v4/v7, ULID, Nano ID Password GeneratorSecure passwords & passphrases MCP Config BuilderConfigs for Claude, Cursor, VS Code AGENTS.md GeneratorCLAUDE.md, Cursor rules, Copilot AI Crawler Controlsrobots.txt for AI bots & llms.txt Cron ParserExplain crontab, next run times SQL FormatterBeautify & minify SQL queries cURL ConvertercURL to fetch, Python, Go, PHP Chat Export ConverterChatGPT/Claude export to Markdown Markdown PreviewLive GFM preview & to HTML Color & ContrastHEX/RGB/OKLCH, WCAG checker QR Code GeneratorURL, Wi-Fi, vCard; PNG & SVG Image EditorConvert, compress, resize & crop Tool Schema ConverterOpenAI ↔ Anthropic ↔ Gemini ↔ MCP JSONL ValidatorFine-tuning & batch files SSE Stream ParserReassemble LLM streaming responses Prompt Template & DiffFill {{vars}}, compare versions