Next.js Middleware mit Claude Code: Edge-Logik & Auth 2026
Next.js Middleware läuft auf der Edge — vor dem Rendering, weltweit verteilt, ultra-schnell. Claude Code kennt alle Middleware-Patterns: Auth Guards, A/B Testing, Geolocation-Redirects, Rate Limiting und i18n-Routing.
Was ist Next.js Middleware?
EdgeMiddleware: Vor dem Render ausführen
# middleware.ts liegt im Root (neben app/)
# Läuft auf Vercel Edge Network — weltweit, <1ms
# KEIN Node.js API — nur Web Standard APIs (fetch, Request, Response, URL)
# Was Middleware kann:
# ✅ Requests umleiten (redirect)
# ✅ Responses modifizieren (headers setzen, rewrite)
# ✅ Cookies lesen/schreiben
# ✅ Geo/IP-Daten (bei Vercel verfügbar)
# ✅ JWT-Tokens verifizieren
# ❌ Datenbank-Queries (kein Node.js!)
# ❌ fs-Module
# ❌ native Node Crypto (aber crypto.subtle funktioniert!)
Auth Guard: Geschützte Routen
AuthJWT-Verification in der Middleware
// middleware.ts
// Prompt: "Schütze alle /dashboard/* Routen mit JWT-Auth"
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
const PROTECTED_PATHS = ['/dashboard', '/settings', '/api/user'];
const PUBLIC_PATHS = ['/', '/login', '/signup', '/blog'];
export async function middleware(request: NextRequest) {
const { pathname } = request.nextUrl;
// Prüfen ob Route geschützt ist:
const isProtected = PROTECTED_PATHS.some(p => pathname.startsWith(p));
if (!isProtected) return NextResponse.next();
// Token aus Cookie lesen:
const token = request.cookies.get('auth-token')?.value;
if (!token) {
return NextResponse.redirect(new URL(`/login?next=${pathname}`, request.url));
}
try {
// JWT verifizieren mit Web Crypto API (Edge-kompatibel):
const payload = await verifyJWT(token, process.env.JWT_SECRET!);
// User-Info als Header weitergeben (Server Components können lesen):
const response = NextResponse.next();
response.headers.set('x-user-id', payload.sub);
response.headers.set('x-user-role', payload.role);
return response;
} catch {
// Ungültiges Token → Cookie löschen + Redirect:
const response = NextResponse.redirect(new URL('/login', request.url));
response.cookies.delete('auth-token');
return response;
}
}
// Matcher: Middleware nur für relevante Pfade:
export const config = {
matcher: ['/((?!_next/static|_next/image|favicon.ico|public).*)'],
};
JWT in Middleware: Verwende
jose für JWT-Verifikation — es ist Edge-kompatibel (kein Node.js nötig). Auth.js (NextAuth v5) hat eine eingebaute auth()-Middleware die genau dieses Pattern implementiert.A/B Testing mit Middleware
A/B TestVarianten-Zuweisung am Edge
// Prompt: "A/B Test für neue Landing Page — 50/50 Split"
export async function middleware(request: NextRequest) {
const { pathname } = request.nextUrl;
if (pathname !== '/') return NextResponse.next();
// Bestehende Variante aus Cookie lesen (konsistente UX):
let variant = request.cookies.get('ab-variant')?.value;
if (!variant) {
// Zufällige Zuweisung (50/50):
variant = Math.random() < 0.5 ? 'control' : 'treatment';
}
// URL rewrite — User sieht immer "/", bekommt aber Variante:
const url = request.nextUrl.clone();
url.pathname = variant === 'treatment' ? '/landing-v2' : '/';
const response = NextResponse.rewrite(url);
// Variante in Cookie speichern (konsistent für nächste Besuche):
response.cookies.set('ab-variant', variant, {
maxAge: 60 * 60 * 24 * 7, // 7 Tage
httpOnly: true,
sameSite: 'lax',
});
// Analytics-Header für Tracking:
response.headers.set('x-ab-variant', variant);
return response;
}
Rate Limiting am Edge
Rate LimitIP-basiertes Rate Limiting
// Prompt: "API-Endpunkte auf 100 Requests/Minute pro IP limitieren"
// Upstash Redis für Edge-kompatibles Rate Limiting:
import { Ratelimit } from '@upstash/ratelimit';
import { Redis } from '@upstash/redis';
const ratelimit = new Ratelimit({
redis: Redis.fromEnv(),
limiter: Ratelimit.slidingWindow(100, '1 m'),
analytics: true,
});
export async function middleware(request: NextRequest) {
if (!request.nextUrl.pathname.startsWith('/api/')) {
return NextResponse.next();
}
const ip = request.headers.get('x-forwarded-for') ?? '127.0.0.1';
const { success, limit, remaining, reset } = await ratelimit.limit(ip);
if (!success) {
return new NextResponse('Too Many Requests', {
status: 429,
headers: {
'X-RateLimit-Limit': String(limit),
'X-RateLimit-Remaining': '0',
'X-RateLimit-Reset': String(reset),
'Retry-After': String(Math.round((reset - Date.now()) / 1000)),
},
});
}
const response = NextResponse.next();
response.headers.set('X-RateLimit-Remaining', String(remaining));
return response;
}
Geolocation und i18n-Routing
// Prompt: "Deutsche und englische Version basierend auf User-Standort"
export function middleware(request: NextRequest) {
const { pathname } = request.nextUrl;
// Vercel Edge: Geo-Daten automatisch verfügbar:
const country = request.geo?.country ?? 'US';
const DE_COUNTRIES = ['DE', 'AT', 'CH'];
// Sprache aus Accept-Language Header:
const acceptLang = request.headers.get('accept-language') ?? '';
const prefersGerman = acceptLang.startsWith('de') || DE_COUNTRIES.includes(country);
// Keine Locale im Pfad? → Redirect:
if (!pathname.startsWith('/de') && !pathname.startsWith('/en')) {
const locale = prefersGerman ? 'de' : 'en';
return NextResponse.redirect(new URL(`/${locale}${pathname}`, request.url));
}
return NextResponse.next();
}
Middleware-Limits: Middleware hat eine CPU-Zeitbeschränkung (Vercel: 15ms). Keine langen DB-Queries. Für komplexe Auth-Logik: leichte JWT-Prüfung in Middleware, vollständige Session-Validierung im Server Component oder API Route.
Edge-Modul im Kurs
Im Claude Code Mastery Kurs: vollständiges Middleware-Modul mit Auth Guards, A/B Testing, Rate Limiting, Geolocation-Routing und i18n — inkl. Vercel Edge Config für dynamische Konfiguration ohne Deployment.
14 Tage kostenlos testen →