Skip to main content

Command Palette

Search for a command to run...

JWT Authentication in Node.js Explained Simply

Published
6 min read
D
Turning confusing web concepts into simple, real-world explanations. Writing about JavaScript, Node.js, and how things actually work.

Almost every application today needs authentication.

Examples:

  • social media apps

  • banking systems

  • admin dashboards

  • e-commerce platforms

Without authentication, the server cannot answer an important question:

“Who is making this request?”

That’s where JWT authentication comes in.

JWT is one of the most common authentication approaches used in modern APIs and frontend-backend applications.

Let’s understand it step-by-step without diving too deeply into cryptography.


What Does Authentication Mean?

Authentication means verifying user identity.

Example:

  • user logs in

  • server checks credentials

  • server confirms identity

  • user gets access to protected resources

Without authentication:

  • anyone could access private data

  • user-specific operations would not be possible


The Problem Authentication Solves

HTTP is stateless.

That means:

  • every request is independent

  • the server forgets previous requests automatically

So after login, the server needs a way to recognize the user on future requests.

JWT solves this problem using tokens.


What Is JWT?

JWT stands for:

JSON Web Token

It is a token containing user-related information that the server can verify.

Example JWT:

eyJhbGciOiJIUzI1NiIs...

The token is usually sent to the client after successful login.

The client then sends this token with future requests.


JWT Is Stateless Authentication

JWT is commonly used for:

Stateless Authentication

This means:

  • server does not usually store login sessions

  • token itself carries authentication information

Instead of:

“Server remembers user”

JWT works like:

“User carries proof of identity”


Structure of a JWT

A JWT has 3 parts:

header.payload.signature

Separated by dots.


1. Header

The header contains metadata about the token.

Example:

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

Usually includes:

  • token type

  • signing algorithm


2. Payload

The payload contains actual data.

Example:

{
  "userId": 42,
  "role": "admin"
}

This information is called:

Claims

Claims describe the authenticated user.

Common examples:

  • user ID

  • email

  • roles

  • expiration time


Important Note

Payload data is not encrypted by default.

It is only encoded.

So sensitive information should not be stored directly inside JWT payloads.


3. Signature

The signature verifies token authenticity.

It helps ensure:

  • token was created by trusted server

  • token was not modified

If someone changes payload data:

  • signature validation fails

  • token becomes invalid


JWT Login Flow

Here’s the typical login flow.


Step 1: User Sends Login Request

Example:

POST /login

with:

  • email

  • password


Step 2: Server Verifies Credentials

The server checks:

  • user exists

  • password is correct

If valid:

  • JWT token is generated

Step 3: Server Sends JWT

Example response:

{
  "token": "eyJhbGciOiJIUzI1NiIs..."
}

Now the client stores the token.


Step 4: Client Sends Token With Requests

Future requests include the token.

Usually inside headers:

Authorization: Bearer eyJhbGciOiJIUzI1NiIs...

This tells the server:

“This request belongs to an authenticated user.”


JWT Authentication Flow

User logs in
↓
Server verifies credentials
↓
JWT token generated
↓
Token sent to client
↓
Client stores token
↓
Client sends token with future requests
↓
Server validates token
↓
Protected data returned

Sending Tokens With Requests

Most APIs use the:

Authorization

header.

Example:

Authorization: Bearer TOKEN_HERE

The word:

Bearer

means:

“The holder of this token is requesting access.”


Protecting Routes Using JWT

Some routes should only work for authenticated users.

Example:

  • dashboard

  • profile

  • admin routes

  • payment routes

These are called:

Protected Routes


Example Middleware Flow

app.get("/profile", verifyToken, (req, res) => {
  res.send("Protected Route");
});

Here:

  • verifyToken checks JWT validity

  • invalid token → access denied

  • valid token → request continues


What Happens During Verification?

Server:

  1. receives token

  2. verifies signature

  3. checks expiration

  4. extracts payload

  5. allows request if valid

If token fails verification:

  • request rejected

Why JWT Became Popular

JWT works very well for:

  • APIs

  • mobile apps

  • frontend/backend separated apps

  • microservices

Because:

  • server doesn’t need session storage

  • tokens are portable

  • scaling becomes easier


JWT vs Traditional Sessions

Traditional sessions:

  • server stores login state

JWT:

  • client carries authentication token

This reduces server-side state management.


Important Security Considerations

JWT simplifies authentication, but safe handling still matters.


1. Use HTTPS

Without HTTPS:

  • tokens can be intercepted

Always encrypt network traffic.


2. Keep Expiration Times

JWTs should expire.

Example:

  • 15 minutes

  • 1 hour

This limits damage if token gets stolen.


3. Avoid Storing Sensitive Data

JWT payloads should not contain:

  • passwords

  • private secrets

  • highly sensitive information


4. Store Tokens Safely

Common approaches:

  • HTTP-only cookies

  • secure storage mechanisms

Poor storage can expose tokens to attacks.


Simple Mental Model

Think of JWT like a digital identity card.

Login

“Server issues identity token.”


Future Requests

“Client shows token as proof.”


Verification

“Server checks if token is valid.”


Full JWT Lifecycle

User logs in
↓
Server creates token
↓
Token stored by client
↓
Client sends token later
↓
Server validates token
↓
Access granted

JWT authentication is essentially a token-based way to verify users across requests.

The core idea is simple:

  • user logs in once

  • server creates token

  • client carries token

  • token proves identity later

JWT became popular because it works extremely well for:

  • modern APIs

  • distributed systems

  • frontend/backend separated applications

Once you understand:

  • token structure

  • login flow

  • request verification

  • stateless authentication

JWT authentication becomes much easier to reason about.