JWT Decoder
Paste a JSON Web Token to see its header, payload and claims in plain language, with readable dates and a live expiry countdown. Optionally verify the signature with a secret or public key. Everything stays in your browser.
Header
Payload
Claims
| Claim | Value | Meaning |
|---|
Verify the signature optional
How to use the JWT Decoder
- Paste your JWT into the box. A leading
Beareris removed automatically. - Read the decoded parts: the header shows the algorithm, the payload shows every claim as formatted JSON.
- Check the claims table for readable issue, not-before and expiry dates and the live countdown.
- Verify the signature (optional): type the shared secret for HS256/384/512 or paste the public key for RS, PS, ES or EdDSA tokens, then press Verify signature.
- Copy the header or payload JSON with one click.
Anatomy of a JSON Web Token
A signed JWT (a JWS in compact form) is three base64url strings joined by dots: header.payload.signature. Base64url is ordinary base64 with - and _ instead of + and / and no = padding, which makes the token safe for URLs and HTTP headers.
| Part | Contains | Example (decoded) |
|---|---|---|
| Header | The signing algorithm (alg), token type (typ) and sometimes a key ID (kid) | {"alg":"HS256","typ":"JWT"} |
| Payload | The claims: who the token is about, who issued it, for whom, and when it is valid | {"sub":"42","exp":1767225600} |
| Signature | The algorithm applied to base64url(header) + "." + base64url(payload) with a secret or private key | Raw bytes, base64url encoded |
Because the header and payload are only encoded, never put passwords or other secrets in a JWT payload unless the token is also encrypted (JWE).
Registered claims and time values
RFC 7519 defines seven registered claim names. Time claims are NumericDate values: whole seconds since 1 January 1970 UTC, not milliseconds. For example exp: 1767225600 is 1 January 2026 00:00:00 UTC.
| Claim | Name | What servers check |
|---|---|---|
| iss | Issuer | Matches the expected identity provider |
| sub | Subject | The user or client the token represents |
| aud | Audience | Contains this API's identifier, otherwise reject |
| exp | Expiration time | Current time is before exp (often with a small clock-skew allowance) |
| nbf | Not before | Current time is at or after nbf |
| iat | Issued at | Used to compute token age |
| jti | JWT ID | Unique ID, can be stored to block replays |
Signing algorithms compared
| alg | Type | Key needed to verify | Typical use |
|---|---|---|---|
| HS256 / HS384 / HS512 | HMAC with SHA-2 | The same shared secret used to sign | One service that both issues and checks tokens |
| RS256 / RS384 / RS512 | RSA PKCS#1 v1.5 | RSA public key | OAuth and OpenID Connect providers |
| PS256 / PS384 / PS512 | RSA-PSS | RSA public key | Modern RSA deployments |
| ES256 / ES384 / ES512 | ECDSA on P-256 / P-384 / P-521 | EC public key | Short signatures, mobile and IoT |
| EdDSA | Ed25519 | Ed25519 public key | Fast, modern signatures |
| none | Unsigned | Nothing | Never accept in production |
An HMAC secret for HS256 should be at least 32 random bytes. Short, guessable secrets can be brute-forced offline from any captured token.
Frequently asked questions
What is a JWT?
A JSON Web Token is a compact string with three base64url parts separated by dots: a header that names the signing algorithm, a payload of claims such as the user ID and expiry time, and a signature that proves the first two parts were not changed.
Is it safe to paste my token here?
Yes. The decoder runs entirely in your browser with JavaScript and the Web Crypto API. The token, secret and keys are never uploaded, logged or stored. Even so, treat live production tokens like passwords and avoid sharing them.
Does decoding a JWT mean it is valid?
No. Anyone can decode a JWT because the header and payload are only base64url encoded, not encrypted. A token is only trustworthy after its signature is verified with the right secret or public key and its exp, nbf, iss and aud claims are checked.
How do I know when a JWT expires?
The exp claim holds the expiry time as Unix seconds. The decoder converts it to your local time and UTC, shows a live countdown, and switches to an Expired badge once the time has passed.
How do I verify an HS256 signature?
Enter the shared secret that the server uses to sign tokens. The tool computes HMAC-SHA256 over the header and payload and compares it with the signature. Tick the base64 option if your secret is stored base64 encoded.
Can it verify RS256 tokens?
Yes. Paste the issuer's public key as a PEM block that starts with BEGIN PUBLIC KEY, or as a JWK or JWKS JSON from the provider's jwks endpoint. RS, PS, ES (P-256, P-384, P-521) and EdDSA tokens are supported where your browser supports the algorithm.
Why does my token show 'NOT YET VALID'?
Its nbf (not before) claim is in the future, so servers should reject it until then. This often means the issuing server's clock is ahead of yours.