🪙 Security

JWT Debugger & Decoder

Paste any JWT token to instantly decode and inspect the header, payload and claims. Checks signature algorithm, expiry (exp), issued-at (iat) and more — entirely in your browser, nothing sent to a server.

🪙 JWT Token
📋 Header
📋
Header will appear here
📦 Payload
📦
Payload will appear here
Privacy: Decoding happens entirely in your browser using JavaScript's atob(). Your token is never sent to any server. However, never paste production tokens in untrusted tools — this reminder applies even here.
📖 How to Use This Tool
1
Paste a JWT token (starts with eyJ...) into the input
2
Header, payload and signature decode instantly
3
Check expiry time and signing algorithm
4
Copy individual sections with the Copy buttons
📝 Examples
JWT decode
Input: eyJhbGciOiJIUzI1NiJ9...
Output: Header: {alg:HS256} Payload: {sub:123,name:John}

Splitting Three Dots Into Something Readable

A JWT is structurally just three Base64url-encoded segments joined by dots — header.payload.signature — and that's exactly the shape the decoder operates on. It splits the token string on the two dot separators, converts each of the first two segments from Base64url padding to standard Base64 (replacing - with + and _ with /, then restoring the = padding Base64url strips out), decodes each with the browser's built-in atob(), and parses the resulting string as JSON. The header decodes to a small object declaring the signing algorithm — HS256, RS256, or ES256 being the common ones — and the payload decodes to the claims object: sub, iss, exp, iat, aud, plus whatever custom fields the issuer added. The signature segment is displayed as raw Base64url text rather than decoded, because unlike the other two segments it isn't JSON at all — it's a binary HMAC or signature output, and this tool deliberately never attempts to verify it, since real verification requires the secret or public key, which should never be typed into a browser-based tool.

Decoding One Token vs. Auditing an Entire Fleet's Tokens

Pasting a single token here and reading the result is effectively instant — the decode work is three string operations and a JSON.parse, negligible even on modest hardware. That single-token workflow doesn't scale to the kind of auditing task that comes up periodically: confirming that every service in a fleet issues tokens with a sane expiry window, or checking that no token anywhere in a log sample uses alg: none. At that scale, the right tool is a script — a few lines of Python using the base64 and json standard library modules, or a one-liner with a JWT CLI — run over a batch of captured tokens, with this decoder reserved for the follow-up step of eyeballing one specific token the script flagged as suspicious. The tool's job is fast single-token inspection; bulk auditing belongs in code that can loop.

Catching a Bad Token Before It Reaches Production

Decoding belongs earlier in the pipeline than most teams initially put it. During integration testing against an identity provider — Okta, Auth0, Keycloak, Azure AD — decoding the ID token and access token the provider actually issues, rather than trusting the documentation's example payload, catches mismatches (a missing scope, an unexpected audience, a shorter-than-expected expiry) before application code that assumes those claims are present ships to production. The same check fits naturally as a manual gate during code review of a new microservice's auth flow: decode a sample token, confirm the algorithm isn't none, and check that no sensitive data — a password, a full credit card number — has been accidentally embedded in the payload, which is unencrypted and trivially readable by anyone who intercepts the token. It is not, however, something to automate as a CI assertion against production tokens themselves, since that would mean storing or transmitting live bearer tokens through a build pipeline — the decoding step belongs in manual review and staging-environment testing, not in a job that handles real credentials.

Rules Worth Hardcoding Into Your Verification Layer

Frequently Asked Questions

What is a JWT token?

A JSON Web Token (JWT) is a compact, URL-safe token format used for authentication and authorization between services. It consists of three Base64url-encoded parts separated by dots: the header (which specifies the signing algorithm, such as HS256 or RS256), the payload (which contains claims — key-value assertions about the user or session, including expiry time and user identity), and the signature (which is computed using the header, payload, and a secret or private key). JWTs are self-contained, meaning the server does not need to look up a session in a database — it simply validates the signature and reads the claims directly from the token.

Is it safe to decode JWT tokens online?

Yes, on DevOpsArsenal it is completely safe. The decoding happens 100% in your browser using JavaScript — the token is never sent to any server. You can verify this by opening your browser's developer tools, going to the Network tab, and confirming that no requests are made when you paste a token. That said, as a general security practice you should avoid pasting long-lived production tokens into any online tool, since tokens grant access to real resources. For debugging in production environments, prefer using your terminal with a local tool or a JWT library in your language of choice.

Can this tool verify JWT signatures?

This tool decodes and displays the header, payload, and raw signature section. It also checks the exp claim and indicates whether the token is expired. Full cryptographic signature verification requires the signing key — either the shared secret for HS256/HS384/HS512 tokens, or the public key for RS256/RS384/RS512 and ES256/ES384/ES512 tokens. Pasting signing keys into online tools is a serious security risk and should never be done with real production keys. For verified JWT handling, use a trusted JWT library in your programming language (such as jsonwebtoken for Node.js, PyJWT for Python, or golang-jwt/jwt for Go).