SRI für Next.js konfigurieren

Schritt-für-Schritt-Anleitung: Externe Scripts mit next/script und integrity-Prop absichern, Layout-Komponente für Stylesheets einrichten und das Webpack-Plugin für automatische Hash-Generierung konfigurieren.

Next.js · Schritt für Schritt

SRI in Next.js

Next.js generiert bei jedem Build automatisch Hashes für alle eigenen Bundles und Chunks — das ist ein großer Vorteil gegenüber anderen Stacks. Für externe CDN-Ressourcen müssen Sie jedoch selbst aktiv werden: next/script unterstützt das integrity-Prop direkt, und das webpack-subresource-integrity Plugin automatisiert die Hash-Generierung für den Build-Output.

SRI bringt 15 von 166 Punkten im Wolf-Agents Web Security Check. Diese Anleitung zeigt die Konfiguration in vier Schritten — von der einfachsten Methode mit next/script über die Layout-Komponente für Stylesheets bis zum vollautomatischen Webpack-Plugin für Produktions-Builds.

1 Schritt 1 von 4

next/script für externe Scripts mit SRI

Die next/script-Komponente ist die empfohlene Methode, externe Scripts in Next.js einzubinden. Sie unterstützt das integrity-Prop direkt und leitet es als HTML-Attribut an das generierte <script>-Tag weiter. Wichtig: Das JSX-Prop heißt crossOrigin (camelCase) — ohne dieses Attribut kann der Browser den Hash nicht prüfen.

app/layout.tsx next/script
// pages/_app.tsx oder app/layout.tsx
import Script from 'next/script';

export default function RootLayout({ children }) {
  return (
    <html lang="de">
      <body>
        // Externes Script mit SRI absichern
        <Script
          src="https://cdn.example.com/analytics.js"
          integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
          crossOrigin="anonymous"
          strategy="afterInteractive"
        />
        // Weiteres CDN-Script — gleiche Methode
        <Script
          src="https://cdn.example.com/tracking.js"
          integrity="sha384-..."
          crossOrigin="anonymous"
          strategy="lazyOnload"
        />
        {children}
      </body>
    </html>
  );
}
strategy-Prop und SRI

SRI funktioniert mit allen strategy-Werten: beforeInteractive, afterInteractive und lazyOnload. Wählen Sie die Strategie nach Performance-Anforderungen — für kritische Abhängigkeiten beforeInteractive, für Analytics und Tracking lazyOnload.

2 Schritt 2 von 4

Layout-Komponente für Stylesheets mit SRI

Externe Stylesheets werden nicht über next/script, sondern über <link>-Tags im <head> eingebunden. In der App Router-Architektur gehören sie in die app/layout.tsx. Das crossOrigin-Prop muss ebenfalls in camelCase angegeben werden. Für <script>-Tags im <head> gilt dieselbe Schreibweise.

app/layout.tsx Link + Script
// app/layout.tsx — Externe Stylesheets mit SRI
import type { Metadata } from 'next';

export const metadata: Metadata = {
  title: 'Meine App',
};

export default function RootLayout({ children }) {
  return (
    <html lang="de">
      <head>
        {/* Externes Stylesheet mit SRI */}
        <link
          rel="stylesheet"
          href="https://cdn.example.com/styles.css"
          integrity="sha384-7mAd4y5SCmwD3aKHQDtGurx9i0FY0hvRxqPEToMBRkBmZDVnTOeNLHkdvQ2y9A/n"
          crossOrigin="anonymous"
        />
        {/* Externes Script im <head> mit SRI */}
        <script
          src="https://cdn.example.com/lib.js"
          integrity="sha384-..."
          crossOrigin="anonymous"
          defer
        />
      </head>
      <body>{children}</body>
    </html>
  );
}
Attribut (JSX) HTML-Ausgabe Pflicht?
integrity integrity="sha384-..." Ja — ohne Hash kein SRI
crossOrigin="anonymous" crossorigin="anonymous" Ja — ohne CORS kein Hash-Vergleich
crossOrigin="use-credentials" crossorigin="use-credentials" Nur bei authentifizierten CDN-Anfragen
Hash-Generierung auf der Kommandozeile: curl -s https://cdn.example.com/styles.css | openssl dgst -sha384 -binary | openssl base64 -A — dann sha384- voranstellen. Nutzen Sie immer versionierte URLs, damit sich die Datei nicht ohne Ihr Wissen ändert.
3 Schritt 3 von 4

Webpack-Plugin für automatische Hash-Generierung

Das Plugin webpack-subresource-integrity berechnet beim Build automatisch SHA-384-Hashes für alle generierten Chunks und Bundle-Dateien und bettet sie als integrity-Attribute in die HTML-Ausgabe ein. Es läuft nur clientseitig (isServer: false) und nur in der Produktion — das verhindert Build-Overhead in der Entwicklung.

Terminal Installation
# Plugin installieren
npm install --save-dev webpack-subresource-integrity

# Alternativ mit yarn
yarn add --dev webpack-subresource-integrity
next.config.js Webpack-Plugin
// next.config.js — webpack-subresource-integrity Plugin
const { SubresourceIntegrityPlugin } = require('webpack-subresource-integrity');

module.exports = {
  webpack: (config, { isServer }) => {
    if (!isServer) {
      // crossOriginLoading ist Voraussetzung für SRI
      config.output.crossOriginLoading = 'anonymous';

      config.plugins.push(
        new SubresourceIntegrityPlugin({
          hashFuncNames: ['sha384'],
          enabled: process.env.NODE_ENV === 'production',
        })
      );
    }
    return config;
  },
};
crossOriginLoading: 'anonymous' in der Webpack-Konfiguration ist Voraussetzung für das Plugin. Ohne diese Einstellung generiert das Plugin zwar Hashes, der Browser kann die Ressourcen aber nicht laden, da CORS fehlt.
4 Schritt 4 von 4

SRI-Konfiguration verifizieren

Nach dem Production Build prüfen Sie, ob alle script- und link-Tags das integrity-Attribut enthalten. Fehlgeschlagene SRI-Checks erscheinen in der Browser-Konsole als Fehler — das ist das erwünschte Verhalten, wenn ein Hash nicht stimmt. Im Normalbetrieb sollten keine solchen Fehler auftreten.

Terminal + Browser DevTools Verifizierung
# 1. Production Build erstellen
npm run build

# 2. HTML-Ausgabe prüfen — integrity-Attribute sollten sichtbar sein
# Im .next/server/pages/_document.html oder ähnlichen Artefakten

# 3. Hash für externe Datei manuell berechnen
curl -s https://cdn.example.com/analytics.js \
  | openssl dgst -sha384 -binary \
  | openssl base64 -A

# Ausgabe: oqVuAfXRKap7fdg... → integrity="sha384-oqVuAfXRKap7fdg..."

# 4. Browser DevTools: Konsole auf Integrity-Fehler prüfen
# Fehler: "Failed to find a valid digest in the 'integrity' attribute"
# bedeutet: Hash stimmt nicht — Datei geändert oder falscher Hash
Browser DevTools: Network-Tab

Öffnen Sie DevTools (F12) → Network → laden Sie die Seite neu. Klicken Sie auf eine Script- oder CSS-Ressource und prüfen Sie im Headers-Tab unter Request Headers, ob origin gesendet wird (CORS aktiv). Im Elements-Tab sehen Sie, ob das integrity-Attribut im generierten HTML vorhanden ist.

Wie steht Ihre Domain bei Subresource Integrity?

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

Häufig gestellte Fragen

Unterstützt next/script das integrity-Prop?

Ja. Die next/script-Komponente leitet alle unbekannten Props als HTML-Attribute an das generierte script-Tag weiter. Sie können integrity und crossOrigin direkt als JSX-Props übergeben: <Script src="..." integrity="sha384-..." crossOrigin="anonymous" />. Das funktioniert mit allen strategy-Werten (beforeInteractive, afterInteractive, lazyOnload).

Warum heißt das Prop crossOrigin (mit großem O) und nicht crossorigin?

In JSX und React werden HTML-Attribute in camelCase geschrieben. Das HTML-Attribut crossorigin heißt in JSX crossOrigin. Next.js übersetzt das intern korrekt in das lowercase HTML-Attribut. Ohne crossOrigin="anonymous" kann der Browser den Inhalt der externen Datei nicht lesen und die Hash-Prüfung schlägt fehl.

Was macht das webpack-subresource-integrity Plugin genau?

Das Plugin berechnet beim Build SHA-384-Hashes für alle von Webpack generierten Chunks und Bundle-Dateien und fügt das integrity-Attribut in die generierten script- und link-Tags ein. So müssen Sie keine manuellen Hashes pflegen. Das Plugin läuft nur clientseitig (isServer: false) und nur in der Produktion.

Erzeugt Next.js SRI-Hashes für eigene Bundles automatisch?

Next.js selbst generiert keine SRI-Hashes ohne Plugin. Das webpack-subresource-integrity Plugin ergänzt diese Funktionalität. Für externe CDN-Ressourcen müssen Sie den Hash immer manuell berechnen (z.B. mit openssl dgst -sha384 -binary datei.js | openssl base64 -A) oder das SRI-Hash-Generator-Tool auf srihash.org nutzen.

Wie generiere ich einen SHA-384-Hash für eine externe Datei?

Entweder auf der Kommandozeile: curl -s https://cdn.example.com/lib.js | openssl dgst -sha384 -binary | openssl base64 -A — und dann sha384- voranstellen. Oder Sie nutzen srihash.org / developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity. Wichtig: Holen Sie die Datei zum Hash-Generieren von der exakt selben URL, die Sie auch einbinden.

Funktioniert SRI mit dynamisch geladenem Code (React.lazy, next/dynamic)?

Nein. SRI funktioniert nur für statisch im HTML deklarierte script- und link-Tags. Dynamisch per JavaScript geladene Bundles (next/dynamic, React.lazy) können nicht mit SRI gesichert werden — hier hilft das webpack-subresource-integrity Plugin für die initiale Bundle-Integrität. Für API-Aufrufe ist HTTPS + CORS die richtige Absicherung.

Was passiert, wenn sich eine CDN-Datei nach dem Hash-Generieren ändert?

Der Browser blockiert die Ressource und zeigt in der Konsole einen Integrity-Fehler. Das ist das erwünschte Verhalten — genau dieser Schutz soll verhindern, dass manipulierter Code ausgeführt wird. Lösung: Versionierte CDN-URLs verwenden (z.B. lib-3.2.0.min.js), Hash aktualisieren, neu deployen.