Security-Header-Architektur für Nuxt 3

Drei Konfigurationswege im Vergleich: nuxt-security Modul, routeRules in nuxt.config.ts und Nitro Server Middleware — von einfach bis maximal flexibel.

Nuxt 3 · Schritt für Schritt

Architektur-Überblick für Nuxt 3

Nuxt 3 basiert auf dem Nitro Server Engine und Vue 3. Für Security Headers stehen drei Konfigurationswege zur Verfügung: das nuxt-security Modul für umfassende Defaults mit automatischen Nonces, routeRules in nuxt.config.ts für statische Header, und Nitro Server Middleware für maximale Kontrolle über dynamische Header.

Der Wolf-Agents Web Security Check bewertet Ihre Nuxt-Konfiguration anhand von 166 Prüfpunkten und zeigt genau, welche Header fehlen. In der Praxis erreichen Nuxt-Anwendungen mit dem nuxt-security Modul die höchsten Bewertungen, weil das Modul automatisch alle wichtigen Header mit sicheren Defaults setzt.

1 Schritt 1 von 4

nuxt-security Modul installieren (empfohlen)

Das nuxt-security Modul ist der empfohlene Weg für alle Security Headers in Nuxt 3. Es setzt automatisch CSP, HSTS, X-Frame-Options, X-Content-Type-Options, Referrer-Policy und Permissions-Policy mit sicheren Defaults. Installation: npx nuxi module add nuxt-security.

nuxt.config.ts Empfohlen
// nuxt.config.ts — nuxt-security Modul (empfohlen)
export default defineNuxtConfig({
  modules: ['nuxt-security'],

  security: {
    headers: {
      contentSecurityPolicy: {
        'default-src': ["'self'"],
        'script-src': ["'self'", "'nonce-{{nonce}}'", "'strict-dynamic'"],
        'style-src': ["'self'", "'unsafe-inline'"],
        'img-src': ["'self'", "data:"],
        'object-src': ["'none'"],
        'base-uri': ["'self'"],
      },
      strictTransportSecurity: 'max-age=31536000; includeSubDomains; preload',
      xFrameOptions: 'DENY',
      xContentTypeOptions: 'nosniff',
      referrerPolicy: 'strict-origin-when-cross-origin',
      permissionsPolicy: {
        'camera': ["()"],
        'microphone': ["()"],
        'geolocation': ["()"],
      },
    },
    nonce: true,
  },
})
nuxt-security vs. manuelle Konfiguration

Das nuxt-security Modul übernimmt Nonce-Generierung, CSP-Header, Rate-Limiting und CORS automatisch. Manuelle routeRules-Header werden vom Modul überschrieben — verwenden Sie entweder das Modul oder routeRules, nicht beides gleichzeitig.

2 Schritt 2 von 4

routeRules für statische Header

Wenn Sie kein zusätzliches Modul verwenden möchten, setzen Sie statische Security Headers über routeRules in nuxt.config.ts. Dieser Ansatz ist einfach, deklarativ und funktioniert mit allen Nitro-Presets — aber ohne automatische Nonces.

nuxt.config.ts routeRules
// nuxt.config.ts — routeRules (ohne Modul)
export default defineNuxtConfig({
  routeRules: {
    '/**': {
      headers: {
        'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload',
        'X-Frame-Options': 'DENY',
        'X-Content-Type-Options': 'nosniff',
        'Referrer-Policy': 'strict-origin-when-cross-origin',
        'Permissions-Policy': 'camera=(), microphone=(), geolocation=()',
      },
    },
  },
})
routeRules setzen keine CSP mit Nonces. Für Nonce-basierte CSP verwenden Sie das nuxt-security Modul oder die Nitro Server Middleware. Statische CSP ohne Nonces erfordern 'unsafe-inline' für script-src — deutlich weniger sicher.
3 Schritt 3 von 4

Nitro Server Middleware für dynamische Header

Für maximale Kontrolle implementieren Sie Security Headers als Nitro Server Middleware in server/middleware/. Dieser Ansatz ermöglicht dynamische Nonce-Generierung pro Request und bedingte Header-Logik.

server/middleware/security.ts Middleware
// server/middleware/security.ts — Nitro Server Middleware
import crypto from 'node:crypto';

export default defineEventHandler((event) => {
  const nonce = crypto.randomBytes(16).toString('base64');
  event.context.nonce = nonce;

  setHeaders(event, {
    'Content-Security-Policy':
      `default-src 'self'; script-src 'self' 'nonce-${nonce}' 'strict-dynamic'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; object-src 'none'; base-uri 'self'; form-action 'self'`,
    'Strict-Transport-Security': 'max-age=31536000; includeSubDomains; preload',
    'X-Frame-Options': 'DENY',
    'X-Content-Type-Options': 'nosniff',
    'Referrer-Policy': 'strict-origin-when-cross-origin',
    'Permissions-Policy': 'camera=(), microphone=(), geolocation=()',
  });
})
Middleware vs. API Routes

Nitro Server Middleware läuft bei jedem Request — auch bei API-Routen. Wenn Sie Header nur für HTML-Seiten setzen möchten, prüfen Sie event.path oder verwenden Sie routeRules mit spezifischen Pfadmustern.

4 Schritt 4 von 4

Header verifizieren

Starten Sie den Nuxt-Dev-Server und prüfen Sie die gesetzten Header. Beachten Sie, dass der Dev-Server andere Header setzen kann als der Produktiv-Build — testen Sie daher immer auch den Production-Build.

Terminal Verifizieren
# Production-Build erstellen und starten
npx nuxi build
node .output/server/index.mjs

# Header prüfen
curl -sI https://ihre-domain.de | grep -iE "(strict-transport|content-security|x-frame|x-content|referrer|permissions)"

# Erwartete Ausgabe:
# Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
# Content-Security-Policy: default-src 'self'; script-src 'self' 'nonce-...'
# X-Frame-Options: DENY
# X-Content-Type-Options: nosniff
# Referrer-Policy: strict-origin-when-cross-origin
# Permissions-Policy: camera=(), microphone=(), geolocation=()

Häufige Fehler

nuxt-security überschreibt routeRules

Das nuxt-security Modul hat Vorrang vor manuellen routeRules-Headern. Konfigurieren Sie Header entweder über das Modul oder über routeRules — nicht beides gleichzeitig für denselben Header.

SSG hat keine Server-Header

nuxt generate erzeugt statische Dateien ohne Node-Server. HTTP-Header müssen dann auf Hosting-Ebene (Vercel, Netlify, Nginx) konfiguriert werden. routeRules greifen nur bei SSR.

Middleware läuft nicht bei Client-Navigation

Nitro Server Middleware wird nur bei initialen Requests ausgeführt. Client-seitige Navigation (Vue Router) sendet keine neuen HTTP-Header. Das ist bei Security Headers kein Problem — sie gelten für die gesamte Sitzung.

Dev-Server hat andere Header als Production

Der nuxi dev-Server setzt andere Header als nuxi build + Node. Testen Sie Security Headers immer mit dem Production-Build: npx nuxi build && node .output/server/index.mjs.

Compliance-Relevanz

Eine konsolidierte Security-Header-Architektur vereinfacht Audits und Compliance-Nachweise. PCI DSS 4.0 fordert die Kontrolle aller auf Zahlungsseiten geladenen Scripts — eine zentrale Header-Konfiguration dokumentiert dies nachvollziehbar. NIS2 verlangt technische Maßnahmen zur Cybersicherheit — der Wolf-Agents Web Security Check bewertet alle Header in einem Report und liefert den Compliance-Nachweis.

Wie steht Ihre Domain bei Implementierungs-Architektur?

Prüfen Sie es jetzt — kostenlos, ohne Registrierung, mit 166 Prüfpunkte.