Start · Sprachen · JavaScript · Referenz · Window.crossOriginIsolated

Window.crossOriginIsolated

Eigenschaft

Schreibgeschützte Eigenschaft, die mit <code>true</code> oder <code>false</code> angibt, ob das aktuelle Dokument Cross-Origin-isoliert ist.

seit JavaScript Baseline 2021: Chrome 87+, Firefox 72+, Safari 15. Kategorie: webapi

Signatur

Window.crossOriginIsolated

Beschreibung

window.crossOriginIsolated ist ein schreibgeschützter boolescher Wert. Er ist true, wenn das Dokument in einem Cross-Origin-isolierten Kontext läuft. Dafür muss der Server das Hauptdokument mit zwei HTTP-Headern ausliefern: Cross-Origin-Opener-Policy: same-origin (COOP) und Cross-Origin-Embedder-Policy: require-corp oder credentialless (COEP).

Die Isolation schützt vor Seitenkanal-Angriffen wie Spectre. Erst mit ihr gibt der Browser leistungsstarke, aber sicherheitskritische Funktionen frei, vor allem SharedArrayBuffer (also geteilter Speicher zwischen Workern, z. B. für WebAssembly-Threads), performance.measureUserAgentSpecificMemory() und genauere Zeitmessungen mit performance.now().

In der Praxis prüft man mit der Eigenschaft zur Laufzeit, ob diese Funktionen verfügbar sind. Je nach Ergebnis lädt man dann z. B. eine WebAssembly-Variante mit mehreren Threads oder weicht auf eine Variante mit nur einem Thread aus. Die Eigenschaft gibt es auch in Workern als self.crossOriginIsolated (WorkerGlobalScope).

Rückgabewert

Typ
boolean
Beschreibung
true, wenn das Dokument Cross-Origin-isoliert ist (COOP und COEP korrekt gesetzt, sicherer Kontext), sonst false.

Beispiele

Isolationsstatus prüfen

if (window.crossOriginIsolated) {
  console.log('Isoliert: SharedArrayBuffer ist verfügbar');
} else {
  console.log('Nicht isoliert: COOP/COEP-Header fehlen');
}
Nicht isoliert: COOP/COEP-Header fehlen

SharedArrayBuffer mit Ausweichlösung für Worker

const worker = new Worker('rechner.js');

if (crossOriginIsolated) {
  // Geteilter Speicher: Worker und Hauptthread sehen dieselben Daten
  const shared = new SharedArrayBuffer(1024);
  const view = new Int32Array(shared);
  worker.postMessage({ buffer: shared });
  Atomics.store(view, 0, 42);
} else {
  // Ausweichlösung: Daten kopieren bzw. übertragen
  const buffer = new ArrayBuffer(1024);
  worker.postMessage({ buffer }, [buffer]);
}

Passende WebAssembly-Variante laden

const loadWasm = async () => {
  const url = crossOriginIsolated
    ? '/wasm/engine-threads.wasm'
    : '/wasm/engine-single.wasm';
  const { instance } = await WebAssembly.instantiateStreaming(fetch(url));
  console.log(`Geladen: ${url}`);
  return instance;
};

loadWasm();
Geladen: /wasm/engine-single.wasm

Server-Header setzen (Node.js/Express)

import express from 'express';

const app = express();

app.use((req, res, next) => {
  res.set('Cross-Origin-Opener-Policy', 'same-origin');
  res.set('Cross-Origin-Embedder-Policy', 'require-corp');
  next();
});

app.use(express.static('public'));
app.listen(3000, () => console.log('Server läuft auf http://localhost:3000'));
Server läuft auf http://localhost:3000

// Wichtig · Fallstricke

  • Nebenwirkungen von COEP: Mit require-corp müssen alle Ressourcen von fremden Ursprüngen (Bilder, Skripte, iframes) entweder per CORS geladen werden oder den Header Cross-Origin-Resource-Policy senden. Sonst blockiert der Browser sie. Werbe- und Analyse-Skripte oder CDNs funktionieren dann oft nicht mehr. Ein Ausweg ist credentialless; Safari unterstützt diesen Wert aber erst seit kurzem bzw. nur eingeschränkt.
  • Nebenwirkungen von COOP: same-origin trennt die Verbindung zu Pop-ups von fremden Ursprüngen. window.opener ist dann null, was z. B. OAuth- oder Zahlungs-Pop-ups stören kann.
  • Die Isolation funktioniert nur in sicheren Kontexten (HTTPS oder localhost).
  • In iframes muss das eingebettete Dokument die Isolation ebenfalls erfüllen, und der Einbettende muss sie per allow=\"cross-origin-isolated\" (Permissions Policy) erlauben.
  • Die Eigenschaft ist schreibgeschützt. Eine Zuweisung hat keine Wirkung; man kann die Isolation nur über Server-Header steuern, nicht per JavaScript.
  • Ältere Browser kennen die Eigenschaft nicht. Dann ist sie undefined; eine einfache Wahrheitsprüfung behandelt das korrekt als „nicht isoliert“.