DEV Community

Cover image for Understanding JSON Web Tokens (JWT) for Secure Information Sharing
Amr Saafan for Nile Bits

Posted on

Understanding JSON Web Tokens (JWT) for Secure Information Sharing

Many businesses have used JSON Web Tokens (JWT) as their standard for authorization and authentication in order to overcome these constraints. JWTs provide a sophisticated, lightweight, and stateless method for securely exchanging data between trusted parties and verifying user identification.

This article offers a thorough and useful summary of how JWTs operate, the reasons why contemporary applications accept them, typical problems, and best practices. Both developers and architects will get a strong basis for incorporating JWTs into their own systems.

In modern distributed architectures, especially those built on microservices, serverless functions, and cloud-native platforms, one of the biggest challenges development teams face is how to authenticate and securely share information across systems without sacrificing performance or scalability. Traditional session-based authentication models often fall short, particularly when applications run across multiple servers or require stateless communication.

What Is a JSON Web Token (JWT)?

A JSON Web Token (JWT) is an open standard (RFC 7519) that defines a secure way to transmit information as a JSON object, digitally signed to verify integrity and sometimes encrypted for confidentiality.

A typical JWT is structured like this:

xxxxx.yyyyy.zzzzz

It contains three components:

Header – identifies the algorithm and token type

Payload – carries claims such as user ID or permissions

Signature – validates that the token has not been tampered with

Because JWTs are stateless and self-contained, they are ideal for microservices and distributed systems where storing user session data on the server is inefficient.

Key JWT Advantages

Stateless (no server-side sessions needed)

Lightweight and fast

Works across domains and platforms

Used widely in OAuth2 and OpenID Connect

Easily transmitted through HTTP headers, cookies, or query parameters

JWT Structure Explained

  1. Header

Example:

{
"alg": "HS256",
"typ": "JWT"
}

  1. Payload (Claims)

The payload contains claims, which are statements about the user or system. These include:

Registered claims: iss, exp, sub

Public claims: custom shared claims

Private claims: app-specific claims

Example:

{
"sub": "1234567890",
"name": "John Doe",
"role": "admin",
"iat": 1712426734,
"exp": 1712430334
}

  1. Signature

The signature is generated using:

HMACSHA256(
base64UrlEncode(header) + "." + base64UrlEncode(payload),
secret
)

This ensures that if the token is modified in any way, verification fails.

How JWT Authentication Works

Here is a simplified lifecycle for JWT-based authentication:

User logs in using their credentials.

Server verifies the credentials.

Server generates a JWT containing user claims.

The client stores the JWT (commonly in localStorage or a secure HTTP-only cookie).

For each request, the client sends the JWT in the Authorization header: Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6...

Server verifies the signature and validates the token.

Access is granted accordingly.

Because the server does not store any session data, this system easily scales horizontally.

Example: Generating JWT in Node.js

Below is a simple example using the jsonwebtoken library:

const jwt = require('jsonwebtoken');

const user = {
id: "123",
email: "john@example.com"
};

const secretKey = "MY_SUPER_SECRET_KEY";

const token = jwt.sign(
{ userId: user.id, email: user.email },
secretKey,
{ expiresIn: "1h" }
);

console.log("Generated Token:", token);

Verifying the Token

try {
const decoded = jwt.verify(token, secretKey);
console.log("Decoded Token:", decoded);
} catch (err) {
console.error("Invalid Token:", err.message);
}

Example: Using JWT in ASP.NET Core

Adding JWT Authentication

builder.Services
.AddAuthentication("Bearer")
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,
ValidateAudience = false,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes("MY_SUPER_SECRET_KEY"))
};
});

Generating a Token

var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, user.Id),
new Claim(JwtRegisteredClaimNames.Email, user.Email),
new Claim("role", user.Role)
};

var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("MY_SUPER_SECRET_KEY"));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

var token = new JwtSecurityToken(
issuer: "nilebits.com",
audience: "nilebits.com",
claims: claims,
expires: DateTime.Now.AddHours(1),
signingCredentials: creds);

return new JwtSecurityTokenHandler().WriteToken(token);

JWT vs. OAuth2 vs. Sessions

FeatureJWTOAuth2Server SessionsStatelessYesYesNoScalabilityHighHighLowUse casesAPIs, microservicesAuthorization delegationSimple web appsBackend storage requiredNoMinimalYes

OAuth2 often uses JWTs internally, but they serve different purposes. JWT is a token format, while OAuth2 is an authorization protocol.

Common Security Risks and How to Prevent Them

While JWTs are powerful, they require correct implementation. Here are frequent pitfalls and solutions:

  1. Using Weak Secrets

Always use strong keys when signing tokens.

Bad:

secret

Good:

fj39!3jf9203_jdf9-23Nd!jf93Fjei230f#df90df3

  1. No Token Expiration

Tokens must expire.

{ "exp": 1712430334 }

  1. Storing JWT in localStorage

This exposes the token to XSS attacks.

Best practice: Store JWT in secure, HTTP-only cookies.

  1. Accepting “none” Algorithm

Never allow the token to specify alg: none. Most libraries now block this by default.

  1. Not Validating Audience/Issuer

Always check the token’s intended scope.

Best Practices for Production

To securely deploy JWT-based authentication in production:

Always use HTTPS

Use strong signing keys or asymmetric RSA keys

Implement short expiration times

Use refresh tokens for long-term sessions

Apply role-based access control (RBAC)

Avoid storing sensitive data in the token

Frequently rotate signing keys

Use trusted libraries for token verification

External Resources and Further Reading

JWT Official Website:
https://jwt.io

RFC 7519: JSON Web Token (JWT):
https://datatracker.ietf.org/doc/html/rfc7519

Node.js jsonwebtoken library:
https://github.com/auth0/node-jsonwebtoken

OWASP JWT Cheat Sheet:
https://cheatsheetseries.owasp.org/cheatsheets/JSON_Web_Token_for_Java_Cheat_Sheet.html

Final Thoughts

In distributed, cloud-native, and API-driven applications, JWTs are now essential for safe information exchange. They enable contemporary apps to function safely across platforms and settings by offering a scalable and effective substitute for conventional session-based authentication.

JWTs must be used carefully, though. Your system is readily vulnerable to attacks due to weak secrets, bad storage choices, or missing validation processes. JWTs are dependable and secure when used appropriately, with appropriate signature, validation, and rotation.

Elevate Your Security with Nile Bits

At Nile Bits, we architect and build secure, scalable, and high-performance software solutions for enterprises and startups around the world. Our engineering teams specialize in:

Authentication and identity management

API security and microservices

Cloud-native architecture

Custom web and mobile development

Staff augmentation and dedicated engineering teams

If you need expert support implementing JWT-based authentication, modernizing your application, or improving overall security posture, our engineers are ready to help.

Contact us today and let’s build something secure and exceptional together.

Top comments (0)