Developer Tools

Free JWT Decoder

Decode any JSON Web Token — split into header, payload and signature. View all claims with human-readable timestamps, check expiry status, and verify HS256, HS384 or HS512 signatures. All in your browser.

100% Private Expiry Check HS256/384/512 Verify Claim Breakdown

Your Token

Paste JWT (with or without "Bearer ")
0 characters Live decoding as you paste
Security: A JWT is encoded, not encrypted. Anyone with the token can read its contents. Only use tokens over HTTPS and never paste production tokens into websites you don't trust.

Decoded Token

No token yet

Paste a JWT in the left panel to decode it

What Is a JWT?

A JSON Web Token (JWT, pronounced "jot") is a compact, URL-safe way to represent claims — statements about a subject — that are transferred between two parties. It is defined by RFC 7519 and is the default authentication mechanism for virtually every modern web API.

A JWT has three parts separated by dots:

PartContentsEncoding
HeaderAlgorithm and token typeBase64url
PayloadClaims (user data, timestamps, roles)Base64url
SignatureHMAC or RSA/ECDSA signature over header.payloadBase64url

The full token looks like xxxxx.yyyyy.zzzzz — three Base64url segments joined by periods. Almost every JWT starts with eyJ, because the header is always a JSON object starting with the byte for {.

The header

The header is a small JSON object that describes the token itself. It typically contains two fields, and may contain more:

FieldMeaningExample
algSigning algorithmHS256, RS256, ES256
typToken typeJWT
kidKey ID — which key was used2024-key-1
ctyContent type (for nested JWTs)JWT

Standard claims (registered names)

RFC 7519 defines seven "registered" claim names that have defined meanings. Any other claim name is application-specific and free-form.

ClaimNameMeaning
issIssuerWho created the token (often a URL)
subSubjectWho the token is about (usually a user ID)
audAudienceWho the token is intended for
expExpirationUnix timestamp after which the token is invalid
nbfNot BeforeUnix timestamp before which the token is invalid
iatIssued AtUnix timestamp when the token was created
jtiJWT IDUnique identifier for the token

All three timestamp claims (exp, iat, nbf) are integers representing seconds since the Unix epoch. A common mistake is to mistake them for milliseconds — which makes the date come out as the year 56000-something.

Signing algorithms

FamilyAlgorithmsKey typeVerification
HMACHS256, HS384, HS512Symmetric secret✅ Verifiable in this tool
RSARS256, RS384, RS512, PS256…RSA public/private⚠️ Server-side
ECDSAES256, ES384, ES512EC public/private⚠️ Server-side
Nonenone—❌ Insecure — never accept

HMAC uses a shared secret, which is why this tool can verify it client-side: both sides hold the same key. RSA and ECDSA use a private key to sign and a public key to verify, so real verification requires importing the public key.

The critical distinction: decode ≠ verify

This is the single most important concept to understand about JWTs:

An attacker can freely change the payload of a JWT (for example, promote themselves from "role":"user" to "role":"admin"), and the token will still decode perfectly. Only signature verification on the server catches this. Never trust decoded claims without verifying them first.

Common use cases

Debug Auth Bugs

See exactly what claims your server issued in a session token.

Check Expiry

Confirm a token has not expired before wasting time on it.

Verify Signatures

Test that your server's HS256 secret produces the expected signature.

Inspect Roles

See which permissions and scopes a token carries.

Security Review

Spot insecure alg: none or weak algorithms in your pipeline.

Debug OAuth Flows

Trace the ID token returned by an OAuth or OIDC provider.

Inspect Webhook Tokens

Decode signed webhooks from Stripe, GitHub, Shopify and others.

Learn JWT Structure

See the header-payload-signature layout visually.

Privacy and security

This JWT decoder runs entirely in your browser. Decoding uses atob and TextDecoder, verification uses the native Web Crypto API. Nothing is uploaded, stored or transmitted — but remember that a JWT is a bearer credential. Anyone who holds it can use it. Treat pasting one into any tool as a security decision, even a client-side one, and prefer test tokens over production ones.

Frequently Asked Questions

What is a JWT?
A JWT (JSON Web Token) is a compact, URL-safe way to represent claims that are transferred between two parties. It has three parts separated by dots: a header, a payload and a signature. Each part is Base64url-encoded. JWTs are commonly used for authentication and authorization in web APIs.
Is this JWT decoder free?
Yes. It is 100% free, requires no sign-up, and runs entirely in your browser. There are no input-size limits, no watermarks and no premium tier.
Is my JWT sent to a server?
No. All decoding happens locally in your browser using the atob function, TextDecoder and the Web Crypto API. Your token never leaves your device — nothing is uploaded, stored or transmitted.
Is decoding a JWT the same as verifying it?
No, and this distinction is critical. Decoding simply reverses the Base64url encoding — anyone can do it and it provides no security. Verifying checks the signature against a key, which is what proves the token was issued by someone who holds that key and that its contents have not been modified. Always verify on the server side before trusting any claim.
What does the header contain?
The header usually contains two fields: alg (the algorithm used to sign the token, such as HS256, RS256 or ES256) and typ (the token type, almost always JWT). It may also contain kid (key ID) to indicate which key was used, and other metadata for specific implementations.
What are the standard claims in the payload?
The registered claim names are: iss (issuer), sub (subject), aud (audience), exp (expiration time), nbf (not before), iat (issued at) and jti (JWT ID). All timestamps are expressed as Unix seconds since the epoch. Any additional claim names are application-specific.
Can I verify the signature in the browser?
Yes, for HMAC algorithms (HS256, HS384, HS512). Because HMAC uses a symmetric secret key, the browser can compute the expected signature and compare it with the token's signature. For RSA (RS*) and ECDSA (ES*) algorithms, only the public key is available client-side, and verifying those properly requires importing the key — this tool labels them as unverified rather than pretending otherwise.
Why does my token start with eyJ?
Because the header and payload are Base64url-encoded JSON, and every JSON object starts with the byte 0x7B, which is a left curly brace. In Base64url that byte is always the first two characters ey, and the next two characters (J...) come from the rest of the typical header like {"alg":. Almost every JWT therefore begins with eyJ.
What does "Signature verification failed" mean?
It means the signature does not match what the secret key would produce for that header and payload. This can happen if the token was tampered with, if the wrong secret is used, if the algorithm declared in the header does not match the one you are verifying with, or if the token was signed with a different key than the one you entered. A failed signature means the token must not be trusted.
Can I use this tool to sign tokens?
No. This tool decodes and — for HMAC algorithms — verifies signatures only. It does not produce or modify tokens. Signing should always be done server-side where the private key or secret is protected, never in a browser.

Related Developer Tools

Done!