• Latest
  • Trending
  • All
Answer card: JWTs are not encrypted, anyone can read them; the signature proves who issued the token, not who may read it.

Are JWTs encrypted? No, and the difference will bite you

12 June 2026
Answer card stating that OpenAI released the Agents API in public beta on 10 September 2026 with no separate fee, billed through model tokens, tool calls and hosted sandbox time, with a choice of OpenAI hosted, self hosted or partner sandboxes, US only data residency and no Zero Data Retention support.

OpenAI’s Agents API has no fee, no ZDR and a one hour sandbox clock

14 September 2026
Answer card: Sakana Fugu Max at $2 and $6 per million tokens, Fugu Ultra v2 unchanged at $5 and $30, and Sakana saying Ultra v2 scores without Fable 5 or GPT-6 Astra in its pool.

Fugu Max costs $2 and $6 while Fugu Ultra v2 runs without Fable 5

13 September 2026
Answer card stating that DeepSeek released DeepSeek-V4.1-Flash on 10 September 2026 as a 552 billion parameter mixture of experts model with a new causal encoder decoder architecture that activates 8 billion parameters on input and 16 billion on output, with native vision, a one million token context and MIT licensed weights, that the API model name is now deepseek-flash at 0.15 dollars per million input tokens and 0.60 dollars per million output tokens off peak, and that DeepSeek announced V4 Pro would be routed to V4.1-Flash from 14 September and reversed that on 11 September.

DeepSeek V4.1-Flash arrived, and the V4 Pro retirement lasted a day

12 September 2026
Answer card stating that Cognition released SWE-2 on 10 September 2026, a coding model post-trained from Kimi K3, scoring 50.0 percent on FrontierCode 1.1 Main against 50.9 percent for Claude Fable 5.1 and 27.3 percent on Terminal-Bench 4 against 55.8 percent, available only inside Devin.

SWE-2 trails Fable 5.1 by one point, and by 28 on Terminal-Bench 4

11 September 2026
Answer card for Meta Muse, free to 100 million tokens a week then $20 a month, launched 8 September 2026 for United States adults only, running in a dedicated per user virtual machine.

Does Meta Muse do enough to earn your inbox and a card on file?

9 September 2026
Answer card stating that the public download pages for the VMware Virtual Disk Development Kit on developer.broadcom.com began returning 404 errors on 25 August 2026 with no announcement or deprecation notice, that Broadcom support tells customers the kit is no longer available for use or download, and that release lines 7.0.3.1, 8.x and 9.x are all affected.

Broadcom pulled VDDK 8.0 and 9.0, and the 404 is the only notice

8 September 2026
Answer card stating that OpenAI published its research acceleration measurements on 6 September 2026, that as of mid August 2026 its research organisation logged 3.1 agent workdays of coding agent runtime for every workday of human labour normalised to a standard eight hour day, and that OpenAI states this should not be read as a 3.1 times productivity gain because it measures runtime rather than delivered output.

OpenAI’s 3.1 agent-workdays per human day is not a 3.1x gain

7 September 2026
Answer card stating that Mullvad announced on 3 September 2026 that it is shutting down its public encrypted domain name system servers on 2 November 2026 and sponsoring the Quad9 Foundation instead, with 194.242.2.2 and its five sibling addresses all going away, and virtual private network customers unaffected.

Mullvad’s DNS servers go dark on 2 November, and Quad9 blocks no ads

5 September 2026
OpenAI announcement image for GPT-6 Astra, a spiral galaxy of white, blue and amber points of light curling around a bright core on a near black star field.

GPT-6 Astra lists at $10 and $50, 2.5x what GPT-5.6 Sol costs

6 September 2026
Google's official announcement image for the release, reading Introducing Gemini 3.8 Flash and 3.8 Flash Cyber in black type over a pale blue background with a blurred white chevron and the four colour Gemini spark below.

Gemini 3.8 Flash keeps the price and the 1 January cliff

3 September 2026
Answer card stating that Anthropic announced Enterprise Frontier Safeguards on 1 September 2026, that activity data used for misuse monitoring moves into cloud storage the customer controls under the customer own encryption keys, that Anthropic charges nothing for the feature while the cloud provider bills storage and egress, and that the phased rollout starts later in autumn 2026 with interim zero data retention on Fable 5 and Fable 5.1 for eligible customers.

Anthropic moves retention into your own cloud, for 30 days

3 September 2026
Official Google diagram of a client connection in three numbered steps: a DNS lookup with a query and an address, a TLS ClientHello and ServerHello, then a content exchange with a website. A callout on the DNS step reads 25% of global web traffic is now protected by encrypted DNS, and a callout beside an Android phone on the ClientHello step reads Android 17 supports ECH GREASE by default.

Android 17 hides the SNI, not your DNS or destination

3 September 2026
  • About
  • Contact
  • Privacy
  • Legal
Tuesday, September 15, 2026
  • Login
Packet Nebula
  • Home
  • Articles
    • Security
    • Network
    • Dev
    • Sysadmin
    • SEO
    • Email & DNS
  • Tools
    • Network tools: free, fast, no signup
    • Security tools: free, fast, no signup
    • Developer tools: free, fast, no signup
    • Sysadmin tools: free, fast, no signup
    • SEO tools: free, fast, no signup
    • Email & DNS tools: free, fast, no signup
  • Download
  • About
No Result
View All Result
Packet Nebula
No Result
View All Result
Home Security

Are JWTs encrypted? No, and the difference will bite you

by stephane
12 June 2026
in Security
0
Answer card: JWTs are not encrypted, anyone can read them; the signature proves who issued the token, not who may read it.
492
SHARES
1.4k
VIEWS
Share on FacebookShare on Twitter

Someone on your team pastes a production JWT into the group chat and half the room shrugs, because it's encrypted anyway, right? It isn't. A standard JWT is encoded and signed, not encrypted, so anyone holding it can read every claim with one line of code and no key at all. Base64url just makes a token look scrambled; it's an envelope anyone can open. What the signature does is different and genuinely useful: it proves who issued the token and that nobody altered it in transit. We'll get into what belongs in a payload and where tokens leak, plus the cases where you really do need encryption on top of the signature.

The short answer

No. A standard JWT is base64url encoded and signed, not encrypted. Anyone who gets hold of the token can read the header and payload with zero keys and one line of code. The signature proves who issued the token and that nobody modified it. It hides nothing.

2 of 3JWT parts readable by anyone
0keys needed to read a payload
JWEthe variant that actually encrypts
Answer card stating that JWTs are not encrypted and anyone can read them, since the signature proves origin and integrity rather than secrecy.
The one-card version, for the next architecture meeting.

Encoded is not encrypted

Open your browser console and run atob('eyJyb2xlIjoiYWRtaW4ifQ'). You get {"role":"admin"} back. No key, no library. That’s base64url: a reversible re-spelling of bytes as URL-safe text so tokens survive HTTP headers and query strings. Encoding is about transport. Encryption is about secrets, and it’s the thing JWTs famously don’t do.

A JWT is three of these encoded segments joined by dots. A header that declares the signing algorithm, a payload that carries the claims. Then the signature. Decode the first two and you’re reading JSON in the clear. Our JWT decoder runs entirely in your browser, which is the demonstration: a static page can decode your token without talking to any server, and so can anyone who finds it in a log file.

eyJhbGciOiJIUzI1...
↓
{ "alg": "HS256", "typ": "JWT" } 1. HEADER Base64url encoded. Readable by anyone.
eyJzdWIiOiIxMjM0...
↓
{ "sub": "user-1234", "role": "admin", "exp": 1767225600 } 2. PAYLOAD Also just encoded. Never put secrets here.
SflKxwRJSMeKKF2Q...
↓
HMAC-SHA256( header + payload, secret key ) 3. SIGNATURE Proves integrity. Hides nothing.
Three parts. The lock only proves the sender; it doesn't close the envelope.

What the signature actually protects

The signature is real cryptography doing one narrow job. The issuer computes it over the header and payload with a key (a shared secret for HS256, a private key for RS256). Any service holding the matching verification key can confirm two things: the token came from the expected issuer, and nobody altered a byte since.

Integrity and authenticity. Not confidentiality. A JWT is a postcard with a tamper-evident seal: the mailman can’t rewrite your message without breaking the seal, but he reads it whenever he likes.

That narrow job still carries all of stateless authentication. Change "role":"user" to "role":"admin" in transit and the signature check fails. The catastrophes happen when verification gets skipped or fooled, most famously the alg: none family of attacks, where early libraries let the attacker declare that no signature was needed, then forge whatever they pleased. RFC 8725, the JWT best practices RFC, exists largely because of that history. Pin your accepted algorithms server-side. Never let the token vote on its own verification.

Where tokens leak, because they do

Reading a payload requires having the token, so the real question is how often tokens escape. Routinely, it turns out. They sit in Authorization headers that land in proxy and gateway logs. They get pasted into online debuggers during production incidents (use one that runs locally; ours never sends the token anywhere). They ride along in URLs during sloppy OAuth flows and end up in browser history and analytics. localStorage hands them to any successful XSS in one expression, and browser extensions with broad permissions see them all day.

None of this is exotic. Whatever you wrote into that payload, treat it as published. Plan on it.

What belongs in a payload

Safe and standard: a user identifier, the issuer, the audience, expiry and issued-at timestamps, roles or scopes when coarse. These are the claims RFC 7519 registered: operational plumbing, not secrets.

Defensible with eyes open: an email address or display name for UI convenience. You’ve accepted that a leaked token leaks them; for many apps that’s a fair trade against a profile lookup per request.

Never, and this list comes from payloads I’ve actually seen decoded in incident reviews: passwords or their hashes, API keys for third-party services, national ID or payment data, internal hostnames and connection strings, medical anything. A JWT payload is a postcard. Write accordingly.

Size pushes the same way: the token rides on every request, so a bloated payload taxes every call.

When you actually need encryption

Sometimes the claim itself is sensitive and has to cross an untrusted hop. The standards answer is JWE, JSON Web Encryption, the JWT sibling that encrypts the payload to a recipient key so only that recipient reads it. It works. It also costs real key management, and library ergonomics are far patchier than JWS.

Most teams we’ve watched reach a simpler design first: keep the JWT as a pointer (a subject ID and its scopes, plus an expiry) and park the sensitive attributes in a server-side store the API consults. The token authenticates the lookup; the data never travels. You give back a little statelessness and get an envelope instead of a postcard, plus revocation by deleting a row.

Short expiries finish the job. A leaked token that died twenty minutes ago is an artifact; one with a 30 day lifetime is an incident. Paste any token of yours into the decoder and look at the expiry timeline. If the bar stretches past a day, fix that first. It costs one config line.

How short lifetimes stay usable: the refresh token dance

Fifteen-minute access tokens sound hostile to users until you add the second piece. The client holds two credentials: a short-lived JWT access token that rides on every API call, and a long-lived refresh token whose only job is getting the next access token from the auth server. Users stay signed in for weeks; any single stolen access token is worthless within minutes.

That design moves the risk into the refresh token, so treat it accordingly. It belongs in the most protected storage you have (an httpOnly cookie scoped to the token endpoint, or the platform keystore on mobile), never in a JWT payload or a URL, and not in localStorage either. Modern guidance adds rotation: each use of a refresh token invalidates it and issues a new one. If the server ever sees a rotated-out token replayed, it revokes the whole chain; two parties are clearly holding the same credential. OAuth 2.1 folds these practices in by default.

Notice what came back: the auth server keeps state about refresh tokens, the revocation that pure stateless JWTs famously lack. That’s the honest tradeoff in most production systems. Stateless verification where requests are hot, stateful control at the slower refresh boundary. The JWT isn’t the security model; it’s the cache layer of one.

Frequently asked questions

Can someone read my JWT without the secret key?

Yes, entirely. The secret key only comes into play when the signature gets created or checked. The header and payload are just base64url encoded, and any browser console reverses that in one line. Treat every claim in a JWT as public, because it is.

Is base64 a form of encryption?

No. Base64 is an encoding: a way to spell bytes as safe text. No key, no secrecy. Decoding it takes nothing but knowing it's base64, while encryption needs a key to reverse. Mixing those two up is the root of most JWT data leaks.

What is the difference between JWS and JWE?

Both are JWT formats. JWS (JSON Web Signature) is the common one: readable payload, signature for integrity. JWE (JSON Web Encryption) actually encrypts the payload, so only the holder of the right key can read it. If you need confidentiality, JWS doesn't give it to you, period.

Where should I store JWTs in a browser app?

The least bad common answer is an httpOnly, Secure, SameSite cookie. JavaScript can't read it, so XSS can't exfiltrate it directly. localStorage is one injected script away from token theft. Wherever they live, keep lifetimes short so a stolen token expires before it's worth much.

Tags: articleauthenticationjwtweb-security
Share197Tweet123
stephane

stephane

  • Trending
  • Comments
  • Latest
Answer card: Proton Lumo 2.0 is private by policy, not by locality. Saved history is locked so even Proton cannot read it, but the prompt is decrypted on a Proton EU server to answer it, then forgotten.

Proton Lumo 2.0 review: how private is it, really?

3 September 2026
The Agentic Coding section of the official Hy4 preview benchmark appendix published by Tencent, a table comparing Hy3 and Hy4 preview against DeepSeek V4 Pro 0813, Qwen 3.8 Max, GLM 5.3, Kimi K3, GPT 5.6 Sol and Claude Opus 5 across SWE-bench Multilingual, SWE-bench Pro, DeepSWE, three SWE Atlas tasks, SWE-Marathon, Terminal-Bench 2.1, NL2Repo-Bench, CyberGym, ProgramBench, PostTrainBench and Harbor-Index.

Tencent’s 770B Hy4 tops one benchmark row in 46

3 September 2026
Answer card: Qwen 3.7 Max is API-only and cannot run locally yet; the open Qwen models (Qwen 3.6 27B, qwen3:8b to 32b) run offline via Ollama.

Qwen 3.7 local: what you can actually run offline

22 June 2026
Answer card: JWTs are not encrypted, anyone can read them; the signature proves who issued the token, not who may read it.

Are JWTs encrypted? No, and the difference will bite you

0
Answer card: a random 8 character password falls in under 2 hours offline, while 16 random characters hold for 1.4 trillion years at the same speed.

How long does it take to crack a password in 2026?

0
Answer card: three DNS records decide if your mail lands or bounces; SPF lists allowed senders, DKIM signs messages, DMARC sets the failure policy.

SPF, DKIM and DMARC explained: the records your email needs

0
Answer card stating that OpenAI released the Agents API in public beta on 10 September 2026 with no separate fee, billed through model tokens, tool calls and hosted sandbox time, with a choice of OpenAI hosted, self hosted or partner sandboxes, US only data residency and no Zero Data Retention support.

OpenAI’s Agents API has no fee, no ZDR and a one hour sandbox clock

14 September 2026
Answer card: Sakana Fugu Max at $2 and $6 per million tokens, Fugu Ultra v2 unchanged at $5 and $30, and Sakana saying Ultra v2 scores without Fable 5 or GPT-6 Astra in its pool.

Fugu Max costs $2 and $6 while Fugu Ultra v2 runs without Fable 5

13 September 2026
Answer card stating that DeepSeek released DeepSeek-V4.1-Flash on 10 September 2026 as a 552 billion parameter mixture of experts model with a new causal encoder decoder architecture that activates 8 billion parameters on input and 16 billion on output, with native vision, a one million token context and MIT licensed weights, that the API model name is now deepseek-flash at 0.15 dollars per million input tokens and 0.60 dollars per million output tokens off peak, and that DeepSeek announced V4 Pro would be routed to V4.1-Flash from 14 September and reversed that on 11 September.

DeepSeek V4.1-Flash arrived, and the V4 Pro retirement lasted a day

12 September 2026
  • About
  • Contact
  • Privacy
  • Legal

Copyright © 2026 Stephane Cardon.

Welcome Back!

Login to your account below

Forgotten Password?

Retrieve your password

Please enter your username or email address to reset your password.

Log In
No Result
View All Result
  • Home
  • Articles
    • Security
    • Network
    • Dev
    • Sysadmin
    • SEO
    • Email & DNS
  • Tools
    • Network tools: free, fast, no signup
    • Security tools: free, fast, no signup
    • Developer tools: free, fast, no signup
    • Sysadmin tools: free, fast, no signup
    • SEO tools: free, fast, no signup
    • Email & DNS tools: free, fast, no signup
  • Download
  • About

Copyright © 2026 Stephane Cardon.