Dmytro Morar
Next.js

Auth in App Router

Auth in App Router is server-first: cookies, middleware, and server components handle access checks.

Session storage

  • HTTP-only cookies (recommended), JWT in cookies, or DB-backed sessions.
  • Read cookies on the server:
import { cookies } from "next/headers";

Middleware checks

  • Runs before the route on Edge Runtime.
  • Use for redirects, admin protection, i18n, rate limiting.
import { NextResponse } from "next/server";
export function middleware(request) {
  const token = request.cookies.get("token");
  if (!token) return NextResponse.redirect(new URL("/login", request.url));
  return NextResponse.next();
}

Server components as guards

  • Check access in page.js:
const user = await getUser();
if (!user) notFound();

Login/signup with Server Actions

"use server";
export async function login(formData) {
  const { email, pass } = Object.fromEntries(formData);
  const session = await verifyUser(email, pass);
  cookies().set("session", session.token, { httpOnly: true });
}
<form action={login}>...</form>

When API routes are needed

  • Mobile apps, external integrations, webhooks, OAuth callbacks.

Notes

  • Never store tokens in localStorage (XSS risk).
  • Middleware is Edge-only; no Node APIs.

On this page