Skip to main content
JWT Guide

jwt.io Alternative
Decode JWTs Without Uploading Them

What jwt.io actually does, where the risk sits, and why a local decoder is the right tool for production tokens.

7 min read·Updated May 2026

jwt.io alternative: a JWT decoder that runs entirely in your browser means the token stays on your machine — no Auth0 analytics scripts, no third-party CDN, no network request carrying your production user claims to someone else's server. The decoder at /tools/jwt loads once, then works completely offline.

What jwt.io Actually Does

jwt.io is maintained by Auth0 (owned by Okta). To be precise about what happens when you use it:

Does it send your token to Auth0 servers?
No — decoding is done in client-side JavaScript using standard base64url decoding. The payload never leaves your browser as a network request.
Does it load third-party scripts?
Yes — Auth0 analytics, CDN-hosted libraries, and tracking scripts run in the same page context as your pasted token. Any XSS vulnerability or compromised CDN asset would have access to it.
Does it store your token?
Not intentionally, but browsers store form field history, extensions can read page content, and your token is in the URL hash if you share the link.
Does it verify signatures?
Only if you supply the secret or public key — which you should never do for a production key in any online tool.

The Actual Risk Model

The danger with jwt.io isn't Auth0 directly stealing your token. The realistic risks are:

Third-party script compromise
Auth0 pulls scripts from CDN providers. A supply-chain attack on any of those assets would run code in the same context as your token. This is rare but has happened to other CDN-hosted tools.
Browser extensions
Password managers, ad blockers, developer tools, and productivity extensions can read the content of any page you visit. Paste a JWT and any extension with broad permissions can read it.
Browser autofill history
Browsers often store values typed into form fields. Synced browser profiles (Chrome, Edge) may upload this history to Google or Microsoft servers.
Copycat sites
Search results for "jwt decoder" include many clones of jwt.io's UI with no privacy policy and unknown backend behaviour. Some actively log submitted tokens.

Tool Comparison

Feature jwt.io ResourceCentral JWT Terminal one-liner
Token decoded client-side
No token sent to server
No third-party analytics scripts
Works fully offline after load
Human-readable claim display
Expiry time shown clearly
No browser form history risk
No extension access risk
No setup required

Decode a JWT in Your Terminal (No Tool Needed)

If you don't want any UI at all, the payload is just base64url-encoded JSON. In bash:

# Split on dots, take the second segment (payload), decode it
TOKEN="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0IiwibmFtZSI6IkpvaG4iLCJpYXQiOjE3MTYyMzkwMjJ9.abc"

echo $TOKEN | cut -d'.' -f2 | base64 -d 2>/dev/null | python3 -m json.tool

Or in Node.js, with no dependencies:

const token = 'your.jwt.token';
const payload = token.split('.')[1];
const decoded = JSON.parse(
  Buffer.from(payload, 'base64url').toString('utf8')
);
console.log(decoded);

// { sub: '1234', name: 'John', iat: 1716239022, exp: 1716242622 }

Or in Python:

import base64, json

def decode_jwt_payload(token: str) -> dict:
    payload = token.split('.')[1]
    # Add padding if needed
    payload += '=' * (4 - len(payload) % 4)
    return json.loads(base64.urlsafe_b64decode(payload))

claims = decode_jwt_payload('your.jwt.token')
print(claims)

When to Use Each Option

Debugging in development
Any tool is fine — dev tokens don't carry real user data. jwt.io is perfectly reasonable here.
Reading a production token once
Use the terminal one-liner or open the browser decoder, disconnect from WiFi, paste the token, then close the tab. No persistence, no scripts.
Regularly inspecting production tokens
Use a browser-based decoder with no third-party scripts loaded, or build a small internal tool. Avoid any public website for repeated production token inspection.
Verifying a token's signature
Do this in code, not in any online tool. Never paste your signing secret into a browser.

Try the Browser-Based JWT Decoder

Paste any token — header, payload and expiry display instantly. No scripts phoning home. Works offline after the page loads.

Open JWT Decoder →

Related