Signatur
Beschreibung
Die schreibgeschützte Eigenschaft navigator.globalPrivacyControl zeigt, welche Global Privacy Control-Einstellung (GPC) der Nutzer für die aktuelle Website gewählt hat. Der Wert true bedeutet: Der Nutzer widerspricht ausdrücklich dem Verkauf seiner personenbezogenen Daten und ihrer Weitergabe an Dritte. false heißt, dass er keine solche Präferenz angegeben hat. Eine Einwilligung ist das nicht.
GPC ist der Nachfolger des gescheiterten Do Not Track-Signals. Anders als DNT ist GPC in einigen Rechtsordnungen rechtlich verbindlich, zum Beispiel nach CCPA/CPRA in Kalifornien und nach dem Colorado Privacy Act. Unter der DSGVO kann GPC als Widerspruch nach Art. 21 gewertet werden. Das Signal kommt auf zwei Wegen an: serverseitig als HTTP-Anfrage-Header Sec-GPC: 1 und clientseitig über diese Eigenschaft.
Typische Anwendungsfälle: Tracking- oder Werbeskripte von Drittanbietern gar nicht erst laden, Consent-Management-Plattformen (CMP) passend vorbelegen oder das Opt-out an das eigene Backend melden. Die Eigenschaft gibt es auch in Web Workern über WorkerNavigator.globalPrivacyControl.
Rückgabewert
true, wenn der Nutzer dem Verkauf und der Weitergabe seiner Daten widerspricht, sonst false. Browser ohne GPC-Unterstützung liefern undefined, weil es die Eigenschaft dort nicht gibt.Beispiele
GPC-Status mit Feature-Erkennung auslesen
const getGpcStatus = () => {
if (!('globalPrivacyControl' in navigator)) {
return 'nicht unterstützt';
}
return navigator.globalPrivacyControl ? 'Opt-out aktiv' : 'kein Signal';
};
console.log(`GPC: ${getGpcStatus()}`);
Tracking-Skript nur ohne GPC-Signal nachladen
const loadScript = (src) => new Promise((resolve, reject) => {
const script = document.createElement('script');
script.src = src;
script.async = true;
script.onload = resolve;
script.onerror = reject;
document.head.append(script);
});
const initAnalytics = async () => {
if (navigator.globalPrivacyControl === true) {
console.info('GPC erkannt – Drittanbieter-Tracking wird nicht geladen.');
return;
}
await loadScript('https://analytics.example.com/tracker.js');
console.info('Analytics geladen.');
};
initAnalytics();
Opt-out an das Backend melden
const syncPrivacyPreference = async (userId) => {
const optOut = navigator.globalPrivacyControl === true;
const response = await fetch('/api/privacy-preferences', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ userId, doNotSell: optOut, source: 'gpc' })
});
return response.ok;
};
syncPrivacyPreference('u-4711').then((ok) => console.log('Gespeichert:', ok));
Auslesen in einem Web Worker
// worker.js
self.addEventListener('message', () => {
self.postMessage({ gpc: self.navigator.globalPrivacyControl ?? null });
});
// main.js
const worker = new Worker('worker.js');
worker.onmessage = ({ data }) => console.log('GPC im Worker:', data.gpc);
worker.postMessage('check');
// Wichtig · Fallstricke
- Experimentell und nicht standardisiert: Die Spezifikation stammt aus der W3C Privacy Community Group und ist kein offizieller W3C-Standard. Nativ unterstützen GPC Firefox (ab Version 120, per Einstellung), Brave und der DuckDuckGo-Browser. Chrome und Safari unterstützen es nur über Erweiterungen, zum Beispiel Privacy Badger. Deshalb immer mit
'globalPrivacyControl' in navigatorprüfen, ob die Eigenschaft existiert. falseist keine Einwilligung: Ein fehlendes Signal ersetzt kein Consent-Banner. Rechtlich nötige Einwilligungen, etwa nach DSGVO oder TTDSG, musst du weiterhin einholen.- Server bevorzugen: Der Header
Sec-GPC: 1kommt schon mit der ersten Anfrage an. Damit kannst du das Einbinden von Trackern im HTML ganz unterdrücken, bevor irgendein JavaScript läuft. - Nicht überschreibbar: Die Eigenschaft hat nur einen Getter. Eine Zuweisung wird im nicht-strikten Modus stillschweigend ignoriert und löst im strikten Modus einen
TypeErroraus. - Fingerprinting: Der Wert ist ein weiteres Unterscheidungsmerkmal zwischen Browsern. Nutze ihn nur, um die Datenschutzpräferenz des Nutzers umzusetzen.
- Die Einstellung kann je nach Website verschieden sein, weil Browser oder Erweiterungen Ausnahmen pro Website erlauben. Lies den Wert deshalb nicht nur einmal global aus, sondern auf jeder Website neu.