Signatur
Beschreibung
Die Eigenschaft window.credentialless gibt true zurück, wenn das aktuelle Dokument in einem iframe mit dem Attribut credentialless geladen wurde. Ein solches Dokument läuft in einem neuen, kurzlebigen Kontext: Es hat keinen Zugriff auf die Cookies, den localStorage, die IndexedDB oder den Cache seines Ursprungs. Stattdessen bekommt es einen eigenen, leeren Speicher. Dieser Speicher wird gelöscht, sobald die übergeordnete Seite geschlossen wird. Der Wert ist schreibgeschützt.
Credentialless iframes sind vor allem für Seiten gedacht, die Cross-Origin-Isolation brauchen (Cross-Origin-Embedder-Policy: require-corp bzw. credentialless), zum Beispiel für SharedArrayBuffer oder genaue Zeitmessungen mit performance.now(). Sie sollen trotzdem Inhalte von Drittanbietern einbetten können, die keinen Cross-Origin-Resource-Policy-Header senden, etwa Werbung oder Widgets. Weil keine Zugangsdaten mitgeschickt werden, kann das eingebettete Dokument keine nutzerbezogenen Daten preisgeben.
Für eingebettete Skripte ist die Eigenschaft nützlich, um festzustellen, ob sie gerade ohne Anmeldung laufen. Ein Widget kann dann zum Beispiel auf die Anzeige für angemeldete Nutzer verzichten, einen Hinweis zeigen oder auf eine andere Art der Authentifizierung ausweichen, etwa ein Pop-up-Fenster.
Rückgabewert
true, wenn das Dokument in einem credentialless iframe läuft, sonst false. In Browsern ohne diese Funktion ist die Eigenschaft undefined.Beispiele
Einfache Abfrage mit Funktionserkennung
// Im Dokument innerhalb des iframes ausführen
if ('credentialless' in window) {
console.log('credentialless:', window.credentialless);
} else {
console.log('Credentialless iframes werden nicht unterstützt.');
}
Credentialless iframe erzeugen und prüfen
// Übergeordnete Seite (Same-Origin-Inhalt, damit der Zugriff erlaubt ist)
const iframe = document.createElement('iframe');
iframe.credentialless = true; // entspricht <iframe credentialless>
iframe.src = '/widget.html';
iframe.addEventListener('load', () => {
console.log('Kind-Dokument credentialless:', iframe.contentWindow.credentialless);
});
document.body.append(iframe);
Widget passt sich an fehlende Anmeldung an
// Skript im eingebetteten Widget
const initWidget = async () => {
if (window.credentialless === true) {
// Keine Cookies verfügbar – Anmeldung per Pop-up anbieten
const btn = document.createElement('button');
btn.textContent = 'Anmelden';
btn.addEventListener('click', () => {
window.open('https://widget.example/login', '_blank', 'popup');
});
document.body.append(btn);
return;
}
const res = await fetch('/api/me', { credentials: 'include' });
const user = await res.json();
document.body.textContent = `Hallo, ${user.name}!`;
};
initWidget();
// Wichtig · Fallstricke
- Kompatibilität: Experimentell und bisher nur in Chromium-Browsern (ab Chrome 110) verfügbar. Firefox und Safari kennen die Eigenschaft nicht, dort ergibt sie
undefined. Nutzen Sie deshalb eine Funktionserkennung mit'credentialless' in window. - Das Attribut
credentiallessmuss gesetzt sein, bevor das iframe navigiert. Wird es erst nachträglich geändert, gilt das nur für die nächste Navigation. - Der temporäre Speicher wird nur zwischen credentialless iframes desselben Ursprungs geteilt, die zur selben übergeordneten Seite gehören. Wird diese Seite geschlossen, ist der Speicher weg. Verlassen Sie sich also nicht auf dauerhafte Daten.
- Sicherheit: Die Eigenschaft ist kein Schutz gegen XSS oder Clickjacking. Sie zeigt nur, dass keine Zugangsdaten mitgeschickt werden. Der Wert lässt sich zwar nicht überschreiben, sicherheitskritische Entscheidungen sollten aber trotzdem auf dem Server fallen.
- Für iframes mit
credentiallessist einCross-Origin-Resource-Policy-Header nicht nötig, auch wenn die übergeordnete SeiteCOEP: require-corpverwendet.