JWT (JSON Web Token) is a technology we encounter in almost every backend project. Most of us have used it, most of us have taken it to production.
But how many of us can truly say we understand it at a deep level?
To be honest, I think I truly grasped JWT only after my last two projects. JWT is a suitable solution for most projects—but when used unconsciously, what you think provides security can actually become a shortcut for attackers.
This needs to be stated clearly: JWT does not possess divine power. It is only one piece of security. When used correctly, it becomes a solid door; when used incorrectly, it becomes an open invitation.
In this article, I want to focus on where JWT came from, why it became so widespread, and its most critical risk points.
Before JWT: The XML and SAML Era
Before JWT, the software world was dominated by an XML-centric ecosystem. Systems communicated with XML, and on the authentication side, XML-based structures like SAML were predominantly used.
The XML Problem
However, with the rise of JavaScript, two fundamental problems emerged:
- JavaScript's clumsiness in XML processing
- XML's inherent verbosity and performance costs
This situation pushed developers to seek lighter and more flexible alternatives.
In 2010, when JSON began to shake XML's throne, the search for alternatives to XML-based solutions like SAML accelerated. This is exactly where JWT's birth lies. In fact, JWT owes its existence largely to JSON's rise.
Although JWT emerged around 2010, its standardization as RFC 7519 in 2015 was made possible by engineers from major players like Microsoft, Google, and Cisco.
Why Did JWT Become So Popular?
Two important factors stand out in JWT's widespread adoption:
1. Microservice Architectures
Microservices, by their nature, work independently from each other. This means constantly querying the database even to get the most basic user information (e.g., user ID).
This situation creates:
- Performance costs
- Multiplied load on the database
Thanks to JWT, services can use the information in the token to recognize users without going to the database every time. This provides a significant advantage, especially in scalable systems.
2. The Rise of Mobile Applications
Cookie-based session management worked well in the browser world for a long time. However, for mobile applications, it had:
- Less comfort
- Less portability
- Limited structure in terms of security
JWT adapted more naturally to the mobile and API-first world.
JWT and the JOSE Family
JWT is not actually a standalone technology; it's a member of the JOSE (JSON Object Signing and Encryption) family—and the most popular one.
JWS
Signed data (most JWTs are actually JWS)
JWE
Fully encrypted content
JWA
Definition of cryptographic algorithms used
JWT's First Major Test: The alg=none Vulnerability
One of the most instructive events in JWT history was a security vulnerability that was both funny and frightening.
The Attack Vector
The JWT Header specifies which algorithm will be used. Some old libraries, when sent an
algorithm of "none", would completely skip signature verification.
Attackers could log into the system as any user they wanted by simply changing the Header and deleting the Signature part.
The Lesson Learned
Never blindly trust any information coming from the client—not even the
Header.
Always validate the algorithm server-side and never accept alg=none in
production.
JWT's Role Today
Today, when you click on buttons like "Sign in with Google" or "Connect with GitHub," you're typically handed a JWT at the end of the complex flow running in the background.
OpenID Connect (OIDC) adopts JWT as the standard identity representation. This places JWT at the center of modern authentication systems.
JWT's Weak Point: Being Stateless
JWT is designed for a stateless architecture. This brings an important risk with it:
The Stateless Risk
If a token is stolen, it can be used by the attacker until it expires. Tokens have a time-based lifespan, and they carry potential risk throughout this period.
Against this situation, developers generally produce indirect solutions such as:
- Short-lived access tokens (e.g., 15 minutes)
- Refresh tokens for obtaining new access tokens
- Token blacklists (which defeats the stateless purpose)
But here's a clear truth:
There is no perfect and universal revocation solution for JWT. Every approach brings new complexities with it.
The Anatomy of JWT
JWT is not as complex as it seems. It consists of three parts:
(HS256, RS256, ES256, etc.)
⚠️ Not encrypted, only Base64 encoded
Never include passwords or sensitive data
Even the slightest change to the payload
invalidates the signature
If you're curious about the content of a JWT you have, you can easily examine it at jwt.io.
Best Practices for JWT Security
- Use short expiration times - 15-30 minutes for access tokens
- Implement refresh tokens - With longer lifespans and stricter validation
- Use strong algorithms - RS256 or ES256 for asymmetric signing
- Never trust the Header - Validate the algorithm server-side
- Store tokens securely - HttpOnly cookies for web, secure storage for mobile
- Implement proper key management - Rotate signing keys periodically
- Add additional claims - Like
aud(audience) andiss(issuer) - Monitor for anomalies - Track unusual token usage patterns
Conclusion
JWT is a powerful tool—but it is not a security solution on its own. Without the right architecture, short-lived tokens, refresh mechanisms, and additional security layers, its advantages can quickly turn into risks.
JWT should not be seen as a lock, but as just one part of a secure door.
Understanding JWT's history, its vulnerabilities (like the alg=none attack), and
its inherent stateless limitations is crucial for building secure authentication systems.
Security is not about using the right tools—it's about using them correctly, with full awareness of their strengths and weaknesses.