Bird
Raised Fist0
NextJSframework~5 mins

JWT vs session strategy in NextJS

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

JWT and session strategies help keep users logged in safely. They decide how your app remembers who you are.

You want users to stay logged in across many devices without server checks.
You want to keep user info on the server for better control and security.
You need to build a simple login system for a small app.
You want to build a scalable app that works well with many servers.
You want to easily share login info between different parts of your app.
Syntax
NextJS
JWT: Store user info in a token sent to client.
Session: Store user info on server, client keeps session ID cookie.

JWT tokens are usually stored in localStorage or cookies on the client.

Sessions keep data on the server and use cookies to identify the user.

Examples
This example shows creating a JWT token and sending it to the client. The client sends it back in requests.
NextJS
// JWT example
const token = jwt.sign({ userId: 123 }, 'secretKey');
// Send token to client

// Client sends token in Authorization header
fetch('/api/data', { headers: { Authorization: `Bearer ${token}` } });
This example shows storing user info in a server session. The client only keeps a cookie with the session ID.
NextJS
// Session example
// Server stores session data
req.session.userId = 123;
// Client gets a cookie with session ID
// Client sends cookie automatically on requests
Sample Program

This Next.js API route creates a JWT token when a user logs in. It shows how to sign a token and send it back. The commented part shows a simple session setup idea.

NextJS
import { NextResponse } from 'next/server';
import jwt from 'jsonwebtoken';

const SECRET = 'mysecret';

export async function POST(request) {
  const { username } = await request.json();

  // Create JWT token
  const token = jwt.sign({ username }, SECRET, { expiresIn: '1h' });

  // Return token in JSON
  return NextResponse.json({ token });
}

// Example session setup (pseudo-code)
// import session from 'next-session';
// export async function handler(req, res) {
//   await session(req, res);
//   req.session.user = { username: 'user1' };
//   res.end('Session set');
// }
OutputSuccess
Important Notes

JWT tokens are stateless and do not require server storage, making them good for scaling.

Sessions store data on the server, which can be safer but need more server resources.

Always keep your secret keys safe and use HTTPS to protect tokens and cookies.

Summary

JWT stores user info in a token on the client, good for scaling and multi-device use.

Sessions keep user info on the server, good for security and control.

Choose based on your app needs: ease of scaling vs. control and security.

Practice

(1/5)
1. What is a key difference between JWT and session strategies in Next.js authentication?
easy
A. JWT stores user info on the client, sessions store it on the server
B. JWT requires server storage, sessions do not
C. Sessions are better for scaling across devices than JWT
D. JWT tokens expire immediately after login

Solution

  1. Step 1: Understand JWT storage

    JWT stores user information inside a token on the client side, allowing stateless authentication.
  2. Step 2: Understand session storage

    Sessions keep user information on the server, maintaining state and control centrally.
  3. Final Answer:

    JWT stores user info on the client, sessions store it on the server -> Option A
  4. Quick Check:

    Storage location difference = B [OK]
Hint: Remember: JWT = client, session = server [OK]
Common Mistakes:
  • Thinking sessions store data on client
  • Believing JWT requires server storage
  • Confusing scaling benefits
2. Which code snippet correctly initializes a session in Next.js using a session strategy?
easy
A. const session = localStorage.getItem('session');
B. const token = jwt.sign(payload, secret);
C. import { getSession } from 'next-auth/react'; const session = await getSession();
D. import jwt from 'jsonwebtoken'; const token = jwt.verify(tokenString, secret);

Solution

  1. Step 1: Identify session initialization

    Using 'getSession' from 'next-auth/react' is the correct way to get session data in Next.js.
  2. Step 2: Check other options

    Options B and D relate to JWT token creation and verification, not sessions. const session = localStorage.getItem('session'); uses localStorage, which is client-side and not a session strategy.
  3. Final Answer:

    import { getSession } from 'next-auth/react'; const session = await getSession(); -> Option C
  4. Quick Check:

    Session retrieval uses getSession() [OK]
Hint: Sessions use getSession(), JWT uses jwt.sign() [OK]
Common Mistakes:
  • Confusing JWT token code with session code
  • Using localStorage as session storage
  • Missing async/await with getSession
3. Given this Next.js API route using JWT, what will be the response if the token is expired?
import jwt from 'jsonwebtoken';
export default function handler(req, res) {
  try {
    const token = req.headers.authorization?.split(' ')[1];
    jwt.verify(token, process.env.JWT_SECRET);
    res.status(200).json({ message: 'Access granted' });
  } catch (err) {
    res.status(401).json({ error: 'Invalid or expired token' });
  }
}
medium
A. 200 with message 'Access granted'
B. 401 with error 'Invalid or expired token'
C. 500 server error
D. 403 forbidden without message

Solution

  1. Step 1: Understand jwt.verify behavior

    If the token is expired, jwt.verify throws an error caught by the catch block.
  2. Step 2: Check catch block response

    The catch block sends a 401 status with error message 'Invalid or expired token'.
  3. Final Answer:

    401 with error 'Invalid or expired token' -> Option B
  4. Quick Check:

    Expired token triggers 401 error [OK]
Hint: Expired JWT triggers catch block with 401 [OK]
Common Mistakes:
  • Assuming expired token returns 200
  • Confusing 403 and 401 status codes
  • Missing try-catch around jwt.verify
4. Identify the bug in this Next.js session handling code snippet:
import { getSession } from 'next-auth/react';
export default async function handler(req, res) {
  const session = getSession();
  if (!session) {
    res.status(401).json({ error: 'Not authenticated' });
  } else {
    res.status(200).json({ message: 'Welcome!' });
  }
}
medium
A. Missing await before getSession()
B. Using getSession() instead of getServerSession()
C. No error handling for session retrieval
D. Incorrect status code for authenticated user

Solution

  1. Step 1: Check the context

    This is a Next.js API route (server-side).
  2. Step 2: Identify correct function for server-side

    While getServerSession() is recommended for server-side session retrieval, the immediate bug in the code is missing await before the async getSession() call, causing session to be a Promise instead of resolved value.
  3. Final Answer:

    Missing await before getSession() -> Option A
  4. Quick Check:

    Async function requires await to get session value [OK]
Hint: Async calls need await [OK]
Common Mistakes:
  • Forgetting await on async functions
  • Confusing getSession and getServerSession
  • Ignoring promise returned by getSession
5. You want to build a Next.js app that supports multiple devices per user and scales easily without server state. Which strategy fits best and why?
hard
A. Use sessions because they store data on the server for better control
B. Use sessions with database storage for multi-device support
C. Use JWT but store tokens only on the server
D. Use JWT because tokens store user info on client, enabling stateless scaling

Solution

  1. Step 1: Analyze multi-device and scaling needs

    Supporting multiple devices and easy scaling requires stateless authentication without server session storage.
  2. Step 2: Match strategy to needs

    JWT stores user info in tokens on the client, allowing stateless, scalable authentication across devices.
  3. Final Answer:

    Use JWT because tokens store user info on client, enabling stateless scaling -> Option D
  4. Quick Check:

    Stateless multi-device = JWT [OK]
Hint: Stateless multi-device apps use JWT [OK]
Common Mistakes:
  • Choosing sessions for stateless scaling
  • Thinking JWT tokens must be stored on server
  • Assuming sessions easily scale without extra setup