Developer inspecting code on a dark screen

Why developers still paste JWTs into random online tools (and what to check instead)

Most developers paste JWTs into random online tools without thinking twice. Here's what those tokens actually contain and why the tool you use matters more than you'd think.

· 6 min read

Timothee

Most developers paste JWTs into the first tool Google returns without thinking twice. Here's what you should actually check before you do that — and a safer way to decode tokens instantly.

It happens dozens of times a week in most development workflows. Something is wrong with authentication. A token is getting rejected, or a claim is missing, or you just need to see what's actually inside the thing your auth server handed back. So you copy the token, open a browser tab, type "jwt decoder", and paste it into whatever comes up first.

It works. You see the payload. You fix the issue and move on. But at no point did you stop to think about where that token just went.

This isn't about paranoia. It's about understanding what a JWT actually contains, which tools handle it safely, and why the distinction matters — especially when you're working with tokens that carry real user data or sensitive claims.


1. What's Actually Inside a JWT

A JSON Web Token is three base64url-encoded strings joined by dots. Each part is readable by anyone who has the token — the encoding is not encryption. If you can paste a JWT into a decoder, so can anyone else who gets hold of it.

🔑 The three parts of a JWT

Header — algorithm and token type (e.g. HS256, JWT)

Payload — the claims: user ID, roles, expiry, email, custom data

Signature — verifies the token hasn't been tampered with

The payload is where it gets interesting. Depending on how your auth server is configured, a JWT payload might contain a user's email address, their role or permissions, an internal user ID, subscription status, or even custom claims your team added. None of that is encrypted. It's just encoded — which means base64-decoding it is trivial for anyone.

The signature is the only part that provides real security, and it can only be verified server-side using the secret or public key. A client-side decoder can show you what's in the token; it cannot tell you whether the token is genuine.


2. Why the Tool You Use Actually Matters

Most JWT decoders do their job fine. But not all of them are transparent about what happens to the token after you paste it in.

Server-side logging

If a decoder sends your token to a backend to parse it, that token can be logged — by the tool's server, by a CDN, by an analytics platform sitting in the middle. For a token containing real user data from a production environment, that's a genuine data handling concern. It probably won't cause a breach, but it's the kind of thing that fails a security audit.

Third-party scripts

Many free tool sites run advertising or analytics scripts that have access to everything on the page, including whatever you paste into an input field. You're not just trusting the tool — you're trusting every script the tool loads.

The safe alternative

A decoder that runs entirely in the browser — using JavaScript's built-in atob() to split and parse the token client-side — never sends anything anywhere. The token stays in your browser's memory and goes nowhere else. That's the only architecture worth using when the token carries anything sensitive.

✅ What to look for in a safe JWT decoder

Explicit statement that decoding runs in the browser only

No network requests when you paste and decode

Open or inspectable source so you can verify the claim

No third-party ad scripts with access to input fields


3. What to Actually Check When You Decode a JWT

Most developers open a decoder to solve one specific problem. But while the token is in front of you, it's worth spending ten seconds on a few things that frequently cause issues and are easy to miss.

The expiry claim (exp)

The exp claim is a Unix timestamp. A decoder that shows you expiration status — whether the token is still valid, already expired, or has no expiry set — saves you from manually converting the number. An expired token is one of the most common causes of auth failures that look confusing at first glance.

The issued-at and not-before claims (iat, nbf)

If a token has an nbf (not before) claim set in the future, it will be rejected even if it was just issued. This trips up a surprising number of developers who are testing across machines with slightly out-of-sync clocks.

The algorithm in the header (alg)

Check that the algorithm matches what your server expects. A mismatch here — for example, a token signed with RS256 being sent to a server configured for HS256 — will cause a rejection that's easy to misread as a permissions issue.

Custom claims

If your token includes custom claims (roles, tenant IDs, feature flags), verify they're present and formatted exactly as your application expects. A claim with the wrong key name or an unexpected value type is a common source of bugs that are tedious to track down without actually looking at the token.

⏱️
Expiration Status
Check exp against current time. Expired tokens are the most common silent auth failure.
expiatnbf
🔐
Algorithm
Confirm the alg in the header matches your server config. HS256 vs RS256 mismatches cause quiet rejections.
algHeader
👤
Subject and Issuer
Verify sub and iss are what you expect. Wrong issuer means the token came from somewhere it shouldn't have.
subiss
🏷️
Custom Claims
Check that roles, tenant IDs, and feature flags are present, correctly named, and the right type.
PayloadClaims

4. A Note on Production Tokens

The safest approach for production tokens is to decode them locally — either in a browser-based tool that you've verified runs client-side only, or directly in your terminal using a one-liner:

💻 Decode a JWT in your terminal

echo "YOUR_JWT_PAYLOAD_PART" | base64 -d | python3 -m json.tool

(Replace YOUR_JWT_PAYLOAD_PART with the middle section of the token)

That said, for most development and staging workflows, a browser-based decoder that runs entirely client-side is fast, readable, and perfectly fine. The key is knowing which category the tool you're using falls into.

The JWT Decoder on WebToolsHQ decodes entirely in your browser using standard JavaScript — no server requests, no third-party scripts with access to your input. Paste your token, inspect the header, payload, and signature, and check the expiration status. That's it.


5. What a JWT Decoder Cannot Do

It's worth being clear about the limits, because this trips people up regularly.

A client-side decoder cannot verify the signature. Signature verification requires the secret key (for HMAC algorithms like HS256) or the public key (for RSA/ECDSA algorithms like RS256). Neither of those belongs in a browser tool. What you see in a decoder is the decoded content of the token — not confirmation that the token is authentic.

If you need to verify that a token is genuinely signed by your auth server, that has to happen server-side, in your application code, using a proper JWT library. A decoder is for inspection and debugging, not for validation.

⚠️ What a JWT decoder can and cannot do

✓ Show you the decoded header, payload, and signature bytes

✓ Tell you whether the token has expired based on the exp claim

✓ Display all claims in a readable format

✗ Verify that the signature is valid

✗ Confirm the token was issued by a trusted server

✗ Replace server-side JWT validation in your application


The Bottom Line

Pasting a JWT into a random online tool is something most developers do without thinking. That's usually fine — but it's worth being deliberate about which tools you use, especially when the token comes from a production environment and carries real user data.

Use a decoder that runs client-side, check the claims that actually matter (exp, alg, sub, your custom claims), and remember that what you're seeing is decoded content, not verified content. Those two things are very different.

Decode your JWT securely — free, runs entirely in your browser, no sign-up required.

Decode a JWT in Seconds

Browser-only. No server. No sign-up. Token never leaves your machine.

Open the JWT Decoder →

About the Author

Timothee

Back to Blog