oktools

JWT Decoder

Decode and inspect JSON Web Tokens, then verify a JWT signature against your own secret or public key — HS256, RS256, ES256, EdDSA and the rest of the RFC 7518 algorithms. Everything runs in your browser — no token or key is ever sent anywhere.

155 characters

Header

HS256
{
  "alg": "HS256",
  "typ": "JWT"
}

Payload

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}
Registered claims
Subject (sub)1234567890
Issued at (iat)2018-01-18 01:30:22 UTC (9 years ago)

Signature

SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
Paste the secret above to verify this signature.
Supported signature algorithms
HS256HMAC with SHA-256
HS384HMAC with SHA-384
HS512HMAC with SHA-512
RS256RSASSA-PKCS1-v1_5 with SHA-256
RS384RSASSA-PKCS1-v1_5 with SHA-384
RS512RSASSA-PKCS1-v1_5 with SHA-512
PS256RSASSA-PSS with SHA-256
PS384RSASSA-PSS with SHA-384
PS512RSASSA-PSS with SHA-512
ES256ECDSA on P-256 with SHA-256
ES384ECDSA on P-384 with SHA-384
ES512ECDSA on P-521 with SHA-512
EdDSAEdDSA (Ed25519)
Ed25519EdDSA (Ed25519)
noneUnsecured — no signature

Ed25519 verification depends on browser support for the Web Crypto Ed25519 curve.

Frequently asked questions

How do I decode a JWT?

Paste the token into the box. It is split on its dots and the header and payload are Base64url-decoded and pretty-printed immediately, with the registered claims labelled and timestamps rendered as readable dates. No key or secret is needed to read a token — only to verify it.

Is decoding a JWT the same as verifying it?

No, and conflating the two is a serious security bug. Decoding just Base64-decodes text that anybody holding the token can read and edit. Verifying checks the signature against the issuer’s key, which is what proves the claims have not been tampered with. Never trust a claim from a token your server has not verified.

Why does my JWT have three parts separated by dots?

A JWT is header.payload.signature. The header names the signing algorithm and key, the payload carries the claims, and the signature covers the first two so any change to them invalidates it. The first two parts are only Base64url-encoded, not encrypted — anyone with the token can read them.

What do the exp, iat, nbf, iss, aud and sub claims mean?

They are the registered claims from RFC 7519: iat is when the token was issued, nbf the earliest moment it may be accepted, and exp when it expires, all as Unix timestamps in seconds. iss identifies the issuer, aud the intended recipient and sub the subject, usually the user ID. Each one is labelled and its dates spelled out here.

Why does the signature not verify with my secret?

Usually the algorithm and the key do not match. An HS256 token needs the shared secret exactly as bytes, including any trailing newline your editor added, while an RS256 or ES256 token needs the issuer’s public key in PEM form, not the private key and not a certificate fingerprint. A token copied with a line break or a missing final character will also fail.

Is it safe to paste a real token here?

The token never leaves your browser — it is decoded locally and no request is made. Still treat any live token as a password: it grants whatever access it represents until it expires, so avoid pasting production tokens on a shared or managed machine, and revoke or let expire anything you have handled loosely.