javascript / expert
Snippet
Strict Content Security Policy Nonce Injection via Middleware
In modern Next.js App Router applications, implementing a Strict Content Security Policy (CSP) requires injecting a unique cryptographic nonce per request. Edge Middleware generates a base64-encoded random UUID nonce and forwards it via custom headers to both downstream Server Components and HTTP response headers, preventing Cross-Site Scripting (XSS) attacks.
snippet.js
javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import { NextResponse } from 'next/server';export function middleware(request) {const nonce = Buffer.from(crypto.randomUUID()).toString('base64');const cspHeader = `default-src 'self';script-src 'self' 'nonce-${nonce}' 'strict-dynamic';object-src 'none';base-uri 'self';`.replace(/\s{2,}/g, ' ').trim();const requestHeaders = new Headers(request.headers);requestHeaders.set('x-nonce', nonce);requestHeaders.set('Content-Security-Policy', cspHeader);const response = NextResponse.next({request: { headers: requestHeaders },});response.headers.set('Content-Security-Policy', cspHeader);return response;}
nextjs
Breakdown
1
const nonce = Buffer.from(crypto.randomUUID()).toString('base64');
Generates a cryptographically secure random UUID and encodes it as a base64 string to act as a per-request nonce.
2
requestHeaders.set('x-nonce', nonce);
Passes the generated nonce down to Server Components via request headers.