JWT Decoder
Paste a JSON Web Token (JWT) below to decode and inspect its header, payload claims, and signature. Decoding happens entirely in your browser — your token is never sent to any server.
Header
Payload
Signature
Signature verification requires the secret key and is not performed by this tool.
What Is a JWT?
A JSON Web Token (JWT) is a compact, URL-safe way to transmit claims between two parties. It is the standard credential format used by OAuth 2.0, OpenID Connect, and most modern REST APIs for authentication and authorization. A JWT is made up of three Base64URL-encoded sections joined by dots (.):
| Part | Description | Example value |
|---|---|---|
| Header | Token type and signing algorithm | {"alg":"HS256","typ":"JWT"} |
| Payload | Claims — statements about the user and token metadata | {"sub":"1234","exp":1893456000} |
| Signature | Cryptographic signature to verify the token has not been tampered with | SflKxwRJSMeKKF2QT4fwpMeJf36… |
Because the header and payload are only encoded (not encrypted), any party can read the contents. The signature is what prevents tampering — it is computed using a secret key (for HMAC algorithms like HS256) or a private key (for RSA/ECDSA algorithms like RS256). Never put sensitive data such as passwords in a JWT payload unless the token is also encrypted (JWE).
Standard JWT Claims Explained
The JWT specification (RFC 7519) defines a set of registered claim names. While none are required, most well-formed tokens include several of these:
| Claim | Name | Description |
|---|---|---|
| iss | Issuer | The system or server that issued the token (e.g., https://auth.example.com). |
| sub | Subject | The principal the token represents — typically a user ID. |
| aud | Audience | The recipient(s) the token is intended for. Servers should reject tokens where aud does not match. |
| exp | Expiration | Unix timestamp after which the token must no longer be accepted. |
| nbf | Not Before | Unix timestamp before which the token must not be accepted. |
| iat | Issued At | Unix timestamp when the token was issued. Useful for determining token age. |
| jti | JWT ID | A unique identifier for the token, used to prevent replay attacks. |
Applications frequently add their own custom claims alongside these registered ones — for example, role, email, scope, or permissions. These are called private claims.
Common JWT Algorithms
The alg field in the header tells receiving parties how the signature was created. Common values are:
- HS256 / HS384 / HS512 — HMAC with SHA-256/384/512. Uses a single shared secret. Fast and simple, but both issuer and verifier must know the secret.
- RS256 / RS384 / RS512 — RSA with SHA-256/384/512. Uses a private key to sign and a public key to verify. Better for multi-service architectures where verifiers should not know the signing secret.
- ES256 / ES384 / ES512 — ECDSA with SHA-256/384/512. Produces smaller signatures than RSA with similar security.
- none — No signature. Should never be accepted by a secure server.
Frequently Asked Questions
Is it safe to paste my JWT into this tool?
Yes — decoding happens entirely in your browser using JavaScript. No data is transmitted to any server. However, as a general rule, treat JWTs like passwords: avoid pasting production access tokens into any website you do not fully trust. If you need to inspect a sensitive token, copy the JavaScript from this page and run it in your browser's developer console instead.
Does this tool verify the JWT signature?
No. Verifying a signature requires the secret key (for HMAC) or the public key (for RSA/ECDSA). This tool only decodes — it reads the base64url-encoded data and displays it in a readable format. To verify a signature programmatically, use a library like jsonwebtoken (Node.js), PyJWT (Python), or your platform's built-in JWT support.
Why is my JWT showing as expired even though my app accepts it?
Some servers allow a small clock-skew window (typically 30–60 seconds) when validating the exp claim, so a token a minute past expiration might still be accepted. Others issue tokens with no exp claim at all, which means they never expire. This tool uses your browser's current time to evaluate expiration, with no clock-skew tolerance applied.
What is base64url encoding?
JWTs use a variant of Base64 called base64url, which replaces + with -, / with _, and omits the = padding characters. This makes the token safe to embed in URLs and HTTP headers without extra encoding. If you need to convert to or from standard Base64, the Base64 encoder and Base64 decoder on this site can help.
Can I use this tool to debug JWTs from any provider?
Yes. The decoder handles tokens from any standard-compliant provider — Auth0, Firebase, AWS Cognito, Okta, Google, Microsoft Azure AD, Keycloak, and custom implementations — as long as the token follows the three-part header.payload.signature format defined in RFC 7519.
What's the difference between a JWT and an opaque token?
An opaque token is a random string with no embedded data; only the issuing server can look up what it means (typically via a database query). A JWT carries its own claims, so any service that trusts the signature can validate the token without a database lookup. This makes JWTs well-suited for stateless, distributed systems — but it also means a JWT cannot be revoked before it expires unless you maintain a token blocklist.