{"id":10251,"date":"2026-08-15T00:38:26","date_gmt":"2026-08-14T22:38:26","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/werkzeuge\/set-cookie-itp-lifetime-simulator\/"},"modified":"2026-10-04T23:09:43","modified_gmt":"2026-10-04T21:09:43","slug":"set-cookie-itp-lifetime-simulator","status":"publish","type":"page","link":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/set-cookie-itp-lifetime-simulator\/","title":{"rendered":"Set-Cookie pr\u00fcfen und Laufzeit unter ITP absch\u00e4tzen"},"content":{"rendered":"<div class=\"gtm-analyser-container\" style=\"background: var(--bg-panel, #1e1e24); padding: 25px; border-radius: 8px; border: 1px solid var(--border, #2a2a35);\">\n<p style=\"color: var(--text-secondary, #a0a0b0); margin-bottom: 20px;\">Ein Cookie bittet um zwei Jahre und bekommt sieben Tage. Was davon gilt, entscheidet die Art, wie es gesetzt wurde, nicht der Header. Nach Einf\u00fcgen des Headers und der Angabe, wie es gesetzt wird, steht die wirkliche Laufzeit da.<\/p>\n<p>    <label for=\"ck-eingabe\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Set-Cookie-Header, einer je Zeile<\/label><br \/>\n    <textarea id=\"ck-eingabe\" class=\"form-control\" style=\"width: 100%; height: 110px; padding: 12px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; font-size: 0.85rem; box-sizing: border-box;\" placeholder=\"Set-Cookie: _ga=GA1.1.123.456; Max-Age=63072000; Path=\/; SameSite=Lax\"><\/textarea><\/p>\n<div style=\"display: flex; gap: 12px; flex-wrap: wrap; margin-top: 15px;\">\n<div style=\"flex: 1; min-width: 210px;\">\n            <label for=\"ck-quelle\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Gesetzt durch<\/label><br \/>\n            <select id=\"ck-quelle\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\"><option value=\"http\">Antwortheader des Servers<\/option><option value=\"js\">document.cookie in JavaScript<\/option><\/select>\n        <\/div>\n<div style=\"flex: 1; min-width: 210px;\">\n            <label for=\"ck-lage\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Zusammenhang<\/label><br \/>\n            <select id=\"ck-lage\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\"><option value=\"erst\">eigene Domain, eigener Server<\/option><option value=\"cname\">eigene Subdomain, CNAME zu einem Dienstleister<\/option><option value=\"dritt\">Drittanbieter-Zusammenhang<\/option><\/select>\n        <\/div>\n<div style=\"flex: 1; min-width: 210px;\">\n            <label for=\"ck-schema\" style=\"color: var(--text-secondary, #a0a0b0); display: block; font-size: 0.85rem; margin-bottom: 5px;\">Schema<\/label><br \/>\n            <select id=\"ck-schema\" class=\"form-control\" style=\"width: 100%; padding: 10px; background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); border-radius: 6px; font-family: monospace; box-sizing: border-box;\"><option value=\"https\">https<\/option><option value=\"http\">http<\/option><\/select>\n        <\/div>\n<\/p><\/div>\n<div style=\"display: flex; gap: 10px; flex-wrap: wrap; margin: 18px 0 0;\">\n        <button id=\"ck-btn\" class=\"button\" style=\"background: var(--accent, #7ee787); color: var(--on-accent); border: none; padding: 12px 24px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Pr\u00fcfen<\/button><br \/>\n        <button id=\"ck-beispiel\" class=\"button\" type=\"button\" style=\"background: transparent; color: var(--text-primary, #e8e8ee); border: 1px solid var(--border, #2a2a35); padding: 12px 20px; border-radius: 6px; font-weight: 700; cursor: pointer;\">Beispiel laden<\/button>\n    <\/div>\n<div data-mp-mask id=\"ck-ergebnis\" style=\"margin-top: 22px;\"><\/div>\n<\/div>\n<p><script>\n(function () {\n    'use strict';<\/p>\n<p>    const T = {\"einleitung\":\"Ein Cookie bittet um zwei Jahre und bekommt sieben Tage. Was davon gilt, entscheidet die Art, wie es gesetzt wurde, nicht der Header. Nach Einf\u00fcgen des Headers und der Angabe, wie es gesetzt wird, steht die wirkliche Laufzeit da.\",\"label_header\":\"Set-Cookie-Header, einer je Zeile\",\"label_quelle\":\"Gesetzt durch\",\"quelle_http\":\"Antwortheader des Servers\",\"quelle_js\":\"document.cookie in JavaScript\",\"label_lage\":\"Zusammenhang\",\"lage_erst\":\"eigene Domain, eigener Server\",\"lage_cname\":\"eigene Subdomain, CNAME zu einem Dienstleister\",\"lage_dritt\":\"Drittanbieter-Zusammenhang\",\"label_schema\":\"Schema\",\"knopf\":\"Pr\u00fcfen\",\"beispiel\":\"Beispiel laden\",\"fehler_leer\":\"Es wurde kein Header eingegeben.\",\"fehler_zeile\":\"Diese Zeile tr\u00e4gt kein Paar aus Name und Wert: %s\",\"sitzung\":\"Sitzungscookie\",\"geloescht\":\"wird nicht behalten\",\"nicht_gesetzt\":\"nicht gesetzt\",\"ja\":\"ja\",\"nein\":\"nein\",\"d_sekunden\":\"Sekunden\",\"d_minuten\":\"Minuten\",\"d_stunden\":\"Stunden\",\"d_tage\":\"Tage\",\"d_jahre\":\"Jahre\",\"l_wert\":\"Wert\",\"l_laufzeit\":\"Gew\u00fcnschte Laufzeit\",\"h_browser\":\"Was die Browser daraus machen\",\"h_befunde\":\"Befunde\",\"h_empfehlung\":\"Header, wie er standhielte\",\"s_unveraendert\":\"beh\u00e4lt die gew\u00fcnschte Laufzeit\",\"s_js\":\"Safari k\u00fcrzt jedes \u00fcber document.cookie geschriebene Cookie auf sieben Tage.\",\"s_cname\":\"Die Antwort kommt \u00fcber einen CNAME von woanders, und solche Cookies k\u00fcrzt Safari ebenfalls auf sieben Tage.\",\"s_dritt\":\"Im Drittanbieter-Zusammenhang blockiert Safari das Cookie vollst\u00e4ndig.\",\"c_400\":\"Chrome kappt jedes Cookie bei 400 Tagen.\",\"c_dritt\":\"Drittanbieter-Cookies laufen aus; ohne die Partitionierung nach CHIPS kommt hier nichts an.\",\"f_400\":\"Firefox kappt jedes Cookie bei 400 Tagen.\",\"f_dritt\":\"Firefox trennt Drittanbieter-Cookies je Seite, jede Seite sieht damit ihre eigenen.\",\"b_gross\":\"Name und Wert ergeben zusammen %s Byte. Ab 4096 Byte verwirft der Browser das Cookie kommentarlos.\",\"b_none_ohne_secure\":\"SameSite=None ohne Secure lehnt jeder aktuelle Browser ab.\",\"b_ohne_samesite\":\"SameSite fehlt. Chrome behandelt das als Lax, das Cookie fehlt damit bei Anfragen von fremden Seiten.\",\"b_samesite_unbekannt\":\"SameSite=%s ist kein vorgesehener Wert, das Cookie f\u00e4llt damit auf die Voreinstellung zur\u00fcck.\",\"b_none_erstpartei\":\"SameSite=None bei einem Erstanbieter-Cookie gibt es auch bei jeder fremden Anfrage mit, das ist selten gewollt.\",\"b_secure_ohne_tls\":\"Secure \u00fcber einfaches http bedeutet, dass das Cookie gar nicht erst gespeichert wird.\",\"b_ohne_secure\":\"Ohne Secure wandert das Cookie auch \u00fcber unverschl\u00fcsselte Verbindungen.\",\"b_httponly_js\":\"HttpOnly l\u00e4sst sich aus JavaScript nicht setzen. Das Attribut bleibt hier wirkungslos.\",\"b_ohne_httponly\":\"Ohne HttpOnly liest jedes Skript auf der Seite das Cookie mit.\",\"b_host_secure\":\"Das Pr\u00e4fix __Host- verlangt Secure.\",\"b_host_domain\":\"Das Pr\u00e4fix __Host- verbietet ein Domain-Attribut.\",\"b_host_pfad\":\"Das Pr\u00e4fix __Host- verlangt Path=\\\/.\",\"b_secure_praefix\":\"Das Pr\u00e4fix __Secure- verlangt das Attribut Secure.\",\"b_partitioned_secure\":\"Partitioned wirkt nur zusammen mit Secure.\",\"b_domain_punkt\":\"Der f\u00fchrende Punkt bei Domain ist seit Jahren wirkungslos und kann weg.\",\"b_domain_ohne_punkt\":\"Domain=%s tr\u00e4gt keinen Punkt, das nimmt au\u00dferhalb von localhost kein Browser an.\",\"b_laufzeit_ungueltig\":\"Die Laufzeit l\u00e4sst sich nicht lesen: Max-Age muss eine ganze Zahl sein, Expires ein Datum im HTTP-Format.\",\"b_sitzung\":\"Weder Max-Age noch Expires: Das Cookie verschwindet, sobald der Browser schlie\u00dft.\",\"b_vergangenheit\":\"Der Zeitpunkt liegt in der Vergangenheit, das l\u00f6scht das Cookie, statt es zu setzen.\",\"b_beide_laufzeiten\":\"Max-Age und Expires stehen beide da. Max-Age gewinnt, Expires ist nur f\u00fcr sehr alte Browser dabei.\",\"b_ueber_400\":\"Die gew\u00fcnschten %s \u00fcberschreiten die 400 Tage, die Browser h\u00f6chstens zulassen.\",\"b_cname\":\"Hinter dem CNAME steckt ein fremder Anbieter. Safari behandelt solche Cookies wie die von Dritten und k\u00fcrzt sie auf sieben Tage.\",\"b_dritt\":\"Im Drittanbieter-Zusammenhang \u00fcberlebt das Cookie nur dort, wo Drittanbieter-Cookies \u00fcberhaupt noch wirken.\",\"b_js_lang\":\"Das Cookie m\u00f6chte l\u00e4nger als sieben Tage, wird aber aus JavaScript geschrieben und von Safari gek\u00fcrzt. Der Weg daran vorbei f\u00fchrt \u00fcber die Antwort des eigenen Servers.\"};<\/p>\n<p>    \/\/ --- reine Auswertung ---<\/p>\n<p>    const TAG = 86400;\n    const VIERHUNDERT_TAGE = 400 * TAG;\n    const SIEBEN_TAGE = 7 * TAG;<\/p>\n<p>    function zerlegen(zeile) {\n        const roh = String(zeile === undefined || zeile === null ? '' : zeile).trim()\n            .replace(\/^set-cookie\\s*:\\s*\/i, '');\n        const keks = {\n            roh: roh, name: '', wert: '', attribute: {}, reihenfolge: [], gueltig: false\n        };\n        if (roh === '') { return keks; }<\/p>\n<p>        const teile = roh.split(';');\n        const erstes = teile[0];\n        const gleich = erstes.indexOf('=');\n        if (gleich <= 0) { return keks; }\n        keks.name = erstes.slice(0, gleich).trim();\n        keks.wert = erstes.slice(gleich + 1).trim();\n\n        for (let i = 1; i < teile.length; i++) {\n            const stueck = teile[i].trim();\n            if (stueck === '') { continue; }\n            const trenner = stueck.indexOf('=');\n            const schluessel = (trenner === -1 ? stueck : stueck.slice(0, trenner)).trim().toLowerCase();\n            const wert = trenner === -1 ? true : stueck.slice(trenner + 1).trim();\n            keks.attribute[schluessel] = wert;\n            keks.reihenfolge.push(schluessel);\n        }\n        keks.gueltig = keks.name !== '';\n        return keks;\n    }\n\n    function laufzeitSekunden(keks, jetzt) {\n        \/\/ Max-Age schlaegt Expires, so steht es in der Spezifikation.\n        const a = keks.attribute;\n        if (a['max-age'] !== undefined &#038;&#038; a['max-age'] !== true) {\n            const wert = parseInt(String(a['max-age']).trim(), 10);\n            if (!isFinite(wert)) { return { art: 'ungueltig', sekunden: 0 }; }\n            return { art: 'max-age', sekunden: wert };\n        }\n        if (a.expires !== undefined &#038;&#038; a.expires !== true) {\n            const zeit = Date.parse(String(a.expires));\n            if (!isFinite(zeit)) { return { art: 'ungueltig', sekunden: 0 }; }\n            return { art: 'expires', sekunden: Math.round((zeit - jetzt) \/ 1000) };\n        }\n        return { art: 'sitzung', sekunden: 0 };\n    }\n\n    function dauerText(sekunden) {\n        const s = Math.abs(Math.round(sekunden));\n        if (s < 60) { return s + ' ' + T.d_sekunden; }\n        if (s < 3600) { return Math.round(s \/ 60) + ' ' + T.d_minuten; }\n        if (s < TAG) { return Math.round(s \/ 3600) + ' ' + T.d_stunden; }\n        if (s < 90 * TAG) { return Math.round(s \/ TAG) + ' ' + T.d_tage; }\n        const jahre = s \/ (365 * TAG);\n        if (jahre >= 1) { return (Math.round(jahre * 10) \/ 10) + ' ' + T.d_jahre; }\n        return Math.round(s \/ TAG) + ' ' + T.d_tage;\n    }<\/p>\n<p>    function browserLaufzeiten(keks, gewuenscht, lage, quelle) {\n        const raus = [];<\/p>\n<p>        \/\/ Safari: alles, was per document.cookie entsteht, wird auf sieben\n        \/\/ Tage gekuerzt. Dasselbe gilt fuer Cookies aus einer Antwort, die\n        \/\/ ueber einen fremden CNAME kam.\n        let safari = gewuenscht;\n        let safariGrund = T.s_unveraendert;\n        if (quelle === 'js') {\n            safari = Math.min(gewuenscht, SIEBEN_TAGE);\n            safariGrund = T.s_js;\n        } else if (lage === 'cname') {\n            safari = Math.min(gewuenscht, SIEBEN_TAGE);\n            safariGrund = T.s_cname;\n        } else if (lage === 'dritt') {\n            safari = 0;\n            safariGrund = T.s_dritt;\n        }\n        raus.push({ name: 'Safari', sekunden: safari, grund: safariGrund, gekuerzt: safari < gewuenscht });\n\n        \/\/ Chrome kappt seit Version 104 jede Lebensdauer bei 400 Tagen.\n        let chrome = Math.min(gewuenscht, VIERHUNDERT_TAGE);\n        let chromeGrund = chrome < gewuenscht ? T.c_400 : T.s_unveraendert;\n        if (lage === 'dritt') { chromeGrund = T.c_dritt; }\n        raus.push({ name: 'Chrome', sekunden: chrome, grund: chromeGrund, gekuerzt: chrome < gewuenscht });\n\n        let firefox = Math.min(gewuenscht, VIERHUNDERT_TAGE);\n        let firefoxGrund = firefox < gewuenscht ? T.f_400 : T.s_unveraendert;\n        if (lage === 'dritt') { firefoxGrund = T.f_dritt; }\n        raus.push({ name: 'Firefox', sekunden: firefox, grund: firefoxGrund, gekuerzt: firefox < gewuenscht });\n\n        return raus;\n    }\n\n    function befunde(keks, laufzeit, lage, quelle, schema) {\n        const liste = [];\n        const a = keks.attribute;\n        const name = keks.name;\n        const sameSite = a.samesite === undefined ? '' : String(a.samesite).toLowerCase();\n        const sicher = a.secure === true || a.secure === '';\n        const nurHttp = a.httponly === true || a.httponly === '';\n\n        \/\/ Groesse\n        const groesse = (name + '=' + keks.wert).length;\n        if (groesse > 4096) {\n            liste.push({ schwer: true, text: T.b_gross.replace('%s', String(groesse)) });\n        }<\/p>\n<p>        \/\/ SameSite\n        if (sameSite === 'none' && !sicher) {\n            liste.push({ schwer: true, text: T.b_none_ohne_secure });\n        }\n        if (sameSite === '') {\n            liste.push({ schwer: false, text: T.b_ohne_samesite });\n        }\n        if (sameSite !== '' && ['strict', 'lax', 'none'].indexOf(sameSite) === -1) {\n            liste.push({ schwer: true, text: T.b_samesite_unbekannt.replace('%s', String(a.samesite)) });\n        }\n        if (sameSite === 'none' && lage === 'erst') {\n            liste.push({ schwer: false, text: T.b_none_erstpartei });\n        }<\/p>\n<p>        \/\/ Secure und Schema\n        if (sicher && schema === 'http') {\n            liste.push({ schwer: true, text: T.b_secure_ohne_tls });\n        }\n        if (!sicher && schema === 'https') {\n            liste.push({ schwer: false, text: T.b_ohne_secure });\n        }<\/p>\n<p>        \/\/ HttpOnly\n        if (nurHttp && quelle === 'js') {\n            liste.push({ schwer: true, text: T.b_httponly_js });\n        }\n        if (!nurHttp && quelle === 'http') {\n            liste.push({ schwer: false, text: T.b_ohne_httponly });\n        }<\/p>\n<p>        \/\/ Namenspraefixe\n        if (name.indexOf('__Host-') === 0) {\n            if (!sicher) { liste.push({ schwer: true, text: T.b_host_secure }); }\n            if (a.domain !== undefined) { liste.push({ schwer: true, text: T.b_host_domain }); }\n            if (a.path === undefined || String(a.path) !== '\/') { liste.push({ schwer: true, text: T.b_host_pfad }); }\n        }\n        if (name.indexOf('__Secure-') === 0 && !sicher) {\n            liste.push({ schwer: true, text: T.b_secure_praefix });\n        }<\/p>\n<p>        \/\/ Partitioned nach dem Modell der geteilten Ablage\n        if (a.partitioned !== undefined && !sicher) {\n            liste.push({ schwer: true, text: T.b_partitioned_secure });\n        }<\/p>\n<p>        \/\/ Domain\n        if (a.domain !== undefined && a.domain !== true) {\n            const domain = String(a.domain).trim();\n            if (domain.charAt(0) === '.') {\n                liste.push({ schwer: false, text: T.b_domain_punkt });\n            }\n            if (domain.indexOf('.') === -1) {\n                liste.push({ schwer: true, text: T.b_domain_ohne_punkt.replace('%s', domain) });\n            }\n        }<\/p>\n<p>        \/\/ Laufzeit\n        if (laufzeit.art === 'ungueltig') {\n            liste.push({ schwer: true, text: T.b_laufzeit_ungueltig });\n        }\n        if (laufzeit.art === 'sitzung') {\n            liste.push({ schwer: false, text: T.b_sitzung });\n        }\n        if (laufzeit.sekunden < 0 &#038;&#038; laufzeit.art !== 'sitzung') {\n            liste.push({ schwer: true, text: T.b_vergangenheit });\n        }\n        if (a['max-age'] !== undefined &#038;&#038; a.expires !== undefined) {\n            liste.push({ schwer: false, text: T.b_beide_laufzeiten });\n        }\n        if (laufzeit.sekunden > VIERHUNDERT_TAGE) {\n            liste.push({ schwer: true, text: T.b_ueber_400.replace('%s', dauerText(laufzeit.sekunden)) });\n        }<\/p>\n<p>        \/\/ Lage\n        if (lage === 'cname') {\n            liste.push({ schwer: true, text: T.b_cname });\n        }\n        if (lage === 'dritt') {\n            liste.push({ schwer: true, text: T.b_dritt });\n        }\n        if (quelle === 'js' && laufzeit.sekunden > SIEBEN_TAGE) {\n            liste.push({ schwer: true, text: T.b_js_lang });\n        }<\/p>\n<p>        return liste;\n    }<\/p>\n<p>    function empfehlung(keks, lage, quelle) {\n        const a = keks.attribute;\n        const teile = [keks.name + '=' + keks.wert];\n        const sameSite = a.samesite === undefined ? '' : String(a.samesite).toLowerCase();\n        teile.push('Max-Age=' + (lage === 'erst' && quelle === 'http' ? String(VIERHUNDERT_TAGE) : String(SIEBEN_TAGE)));\n        teile.push('Path=\/');\n        if (a.domain !== undefined && a.domain !== true) { teile.push('Domain=' + String(a.domain).replace(\/^\\.\/, '')); }\n        teile.push('Secure');\n        if (quelle === 'http') { teile.push('HttpOnly'); }\n        teile.push('SameSite=' + (sameSite === 'none' ? 'None' : 'Lax'));\n        return 'Set-Cookie: ' + teile.join('; ');\n    }<\/p>\n<p>    function untersuchen(text, lage, quelle, schema, jetzt) {\n        const ergebnis = { ok: false, fehler: '', kekse: [] };\n        const zeilen = String(text === undefined || text === null ? '' : text).split(\/\\r?\\n\/);\n        const zeit = isFinite(jetzt) ? jetzt : Date.now();<\/p>\n<p>        zeilen.forEach(function (zeile) {\n            if (String(zeile).trim() === '') { return; }\n            const keks = zerlegen(zeile);\n            if (!keks.gueltig) {\n                ergebnis.kekse.push({ gueltig: false, roh: String(zeile).trim() });\n                return;\n            }\n            const laufzeit = laufzeitSekunden(keks, zeit);\n            const gewuenscht = laufzeit.art === 'sitzung' ? 0 : Math.max(0, laufzeit.sekunden);\n            ergebnis.kekse.push({\n                gueltig: true,\n                name: keks.name,\n                wert: keks.wert,\n                attribute: keks.attribute,\n                laufzeit: laufzeit,\n                gewuenscht: gewuenscht,\n                browser: laufzeit.art === 'sitzung' ? [] : browserLaufzeiten(keks, gewuenscht, lage, quelle),\n                befunde: befunde(keks, laufzeit, lage, quelle, schema),\n                empfehlung: empfehlung(keks, lage, quelle)\n            });\n        });<\/p>\n<p>        if (!ergebnis.kekse.length) { ergebnis.fehler = T.fehler_leer; return ergebnis; }\n        ergebnis.ok = true;\n        return ergebnis;\n    }<\/p>\n<p>    if (typeof window !== 'undefined') {\n        window.LW_TEST = window.LW_TEST || {};\n        window.LW_TEST.CK = {\n            untersuchen: untersuchen, zerlegen: zerlegen,\n            laufzeitSekunden: laufzeitSekunden, dauerText: dauerText\n        };\n    }<\/p>\n<p>    \/\/ --- Anbindung an das Dokument ---<\/p>\n<p>    const btn = document.getElementById('ck-btn');\n    const out = document.getElementById('ck-ergebnis');\n    const feld = document.getElementById('ck-eingabe');\n    const quelleFeld = document.getElementById('ck-quelle');\n    const lageFeld = document.getElementById('ck-lage');\n    const schemaFeld = document.getElementById('ck-schema');\n    const beispielBtn = document.getElementById('ck-beispiel');\n    if (!btn || !out || !feld || !quelleFeld || !lageFeld || !schemaFeld || !beispielBtn) { return; }<\/p>\n<p>    const KASTEN = 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-radius: 6px; padding: 14px; margin-bottom: 18px;';\n    const UEBERSCHRIFT = 'color: var(--text-primary, #e8e8ee); font-weight: 700; margin-bottom: 8px;';<\/p>\n<p>    function el(tag, css, text) {\n        const knoten = document.createElement(tag);\n        if (css) { knoten.setAttribute('style', css); }\n        if (text !== undefined && text !== null) { knoten.textContent = text; }\n        return knoten;\n    }<\/p>\n<p>    function zeigen(erg) {\n        out.textContent = '';<\/p>\n<p>        erg.kekse.forEach(function (k) {\n            if (!k.gueltig) {\n                out.appendChild(el('div', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left: 3px solid #ffb86c; color: var(--text-secondary, #a0a0b0); padding: 14px; border-radius: 6px; margin-bottom: 18px;', T.fehler_zeile.replace('%s', k.roh)));\n                return;\n            }<\/p>\n<p>            out.appendChild(el('div', UEBERSCHRIFT, k.name));<\/p>\n<p>            const kasten = el('div', KASTEN);\n            const werte = [\n                [T.l_wert, k.wert.length > 60 ? k.wert.slice(0, 60) + '...' : k.wert],\n                [T.l_laufzeit, k.laufzeit.art === 'sitzung' ? T.sitzung : dauerText(k.gewuenscht) + ' (' + k.laufzeit.art + ')'],\n                ['Path', k.attribute.path === undefined ? T.nicht_gesetzt : String(k.attribute.path)],\n                ['Domain', k.attribute.domain === undefined ? T.nicht_gesetzt : String(k.attribute.domain)],\n                ['SameSite', k.attribute.samesite === undefined ? T.nicht_gesetzt : String(k.attribute.samesite)],\n                ['Secure', k.attribute.secure !== undefined ? T.ja : T.nein],\n                ['HttpOnly', k.attribute.httponly !== undefined ? T.ja : T.nein]\n            ];\n            if (k.attribute.partitioned !== undefined) { werte.push(['Partitioned', T.ja]); }\n            werte.forEach(function (paar) {\n                const z = el('div', 'display: flex; justify-content: space-between; gap: 14px; flex-wrap: wrap; padding: 4px 0;');\n                z.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0);', paar[0]));\n                z.appendChild(el('span', 'color: var(--text-primary, #e8e8ee); font-family: monospace; word-break: break-all; text-align: right;', paar[1]));\n                kasten.appendChild(z);\n            });\n            out.appendChild(kasten);<\/p>\n<p>            if (k.browser.length) {\n                out.appendChild(el('div', UEBERSCHRIFT, T.h_browser));\n                const tabelle = el('div', KASTEN);\n                k.browser.forEach(function (b) {\n                    const z = el('div', 'display: flex; gap: 12px; align-items: flex-start; padding: 7px 0; border-bottom: 1px solid var(--border, #2a2a35);');\n                    z.appendChild(el('span', 'width: 80px; color: var(--text-primary, #e8e8ee); font-weight: 700;', b.name));\n                    z.appendChild(el('span', 'width: 110px; font-family: monospace; color: ' + (b.gekuerzt ? '#ffb86c' : 'var(--accent, #7ee787)') + ';', b.sekunden <= 0 ? T.geloescht : dauerText(b.sekunden)));\n                    z.appendChild(el('span', 'flex: 1; color: var(--text-secondary, #a0a0b0); font-size: 0.85rem; line-height: 1.5;', b.grund));\n                    tabelle.appendChild(z);\n                });\n                out.appendChild(tabelle);\n            }\n\n            if (k.befunde.length) {\n                out.appendChild(el('div', UEBERSCHRIFT, T.h_befunde));\n                const kasten2 = el('div', KASTEN);\n                k.befunde.forEach(function (b) {\n                    const z = el('div', 'display: flex; gap: 10px; padding: 5px 0;');\n                    z.appendChild(el('span', 'color: ' + (b.schwer ? '#ffb86c' : 'var(--text-secondary, #a0a0b0)') + '; font-family: monospace;', b.schwer ? '!' : '-'));\n                    z.appendChild(el('span', 'color: var(--text-secondary, #a0a0b0); font-size: 0.9rem; line-height: 1.5;', b.text));\n                    kasten2.appendChild(z);\n                });\n                out.appendChild(kasten2);\n            }\n\n            out.appendChild(el('div', UEBERSCHRIFT, T.h_empfehlung));\n            out.appendChild(el('pre', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); color: var(--text-primary, #e8e8ee); padding: 16px; border-radius: 6px; overflow-x: auto; font-family: monospace; font-size: 0.85rem; white-space: pre-wrap; word-break: break-all; margin-bottom: 22px;', k.empfehlung));\n        });\n    }\n\n    btn.addEventListener('click', function () {\n        const erg = untersuchen(feld.value, lageFeld.value, quelleFeld.value, schemaFeld.value, Date.now());\n        out.textContent = '';\n        if (!erg.ok) {\n            out.appendChild(el('div', 'background: var(--bg-body, #14141a); border: 1px solid var(--border, #2a2a35); border-left: 3px solid #ffb86c; color: var(--text-secondary, #a0a0b0); padding: 14px; border-radius: 6px;', erg.fehler));\n            return;\n        }\n        zeigen(erg);\n    });\n\n    beispielBtn.addEventListener('click', function () {\n        feld.value = 'Set-Cookie: _ga=GA1.1.1234567890.1785578400; Max-Age=63072000; Path=\/; SameSite=Lax';\n        quelleFeld.value = 'js';\n        lageFeld.value = 'erst';\n        schemaFeld.value = 'https';\n        btn.click();\n    });\n})();\n<\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Liest einen Set-Cookie-Header, pr\u00fcft die Attribute, an denen Browser ein Cookie rundweg ablehnen, und zeigt, wie lange es in Safari, Chrome und Firefox wirklich \u00fcberlebt.<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":9283,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"template-tool-base.php","meta":{"footnotes":""},"tags":[92265,92148,92071],"class_list":["post-10251","page","type-page","status-publish","hentry","tag-prywatnosc-danych-pl-de","tag-server-side-gtm-de","tag-web-security-de"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Set-Cookie pr\u00fcfen und Laufzeit unter ITP absch\u00e4tzen | Lukas Wojcik<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/set-cookie-itp-lifetime-simulator\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Set-Cookie pr\u00fcfen und Laufzeit unter ITP absch\u00e4tzen | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Liest einen Set-Cookie-Header, pr\u00fcft die Attribute, an denen Browser ein Cookie rundweg ablehnen, und zeigt, wie lange es in Safari, Chrome und Firefox wirklich \u00fcberlebt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/set-cookie-itp-lifetime-simulator\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-04T21:09:43+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/set-cookie-itp-lifetime-simulator\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/set-cookie-itp-lifetime-simulator\\\/\",\"name\":\"Set-Cookie pr\u00fcfen und Laufzeit unter ITP absch\u00e4tzen | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-14T22:38:26+00:00\",\"dateModified\":\"2026-10-04T21:09:43+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/set-cookie-itp-lifetime-simulator\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/set-cookie-itp-lifetime-simulator\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/set-cookie-itp-lifetime-simulator\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Toolbox\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/de\\\/werkzeuge\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Set-Cookie pr\u00fcfen und Laufzeit unter ITP absch\u00e4tzen\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Set-Cookie pr\u00fcfen und Laufzeit unter ITP absch\u00e4tzen | Lukas Wojcik","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/set-cookie-itp-lifetime-simulator\/","og_locale":"en_US","og_type":"article","og_title":"Set-Cookie pr\u00fcfen und Laufzeit unter ITP absch\u00e4tzen | Lukas Wojcik","og_description":"Liest einen Set-Cookie-Header, pr\u00fcft die Attribute, an denen Browser ein Cookie rundweg ablehnen, und zeigt, wie lange es in Safari, Chrome und Firefox wirklich \u00fcberlebt.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/set-cookie-itp-lifetime-simulator\/","og_site_name":"Lukas Wojcik - Blog","article_modified_time":"2026-10-04T21:09:43+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/08\/og-default.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/set-cookie-itp-lifetime-simulator\/","url":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/set-cookie-itp-lifetime-simulator\/","name":"Set-Cookie pr\u00fcfen und Laufzeit unter ITP absch\u00e4tzen | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-14T22:38:26+00:00","dateModified":"2026-10-04T21:09:43+00:00","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/set-cookie-itp-lifetime-simulator\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/set-cookie-itp-lifetime-simulator\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/set-cookie-itp-lifetime-simulator\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Toolbox","item":"https:\/\/www.lukaswojcik.com\/blog\/de\/werkzeuge\/"},{"@type":"ListItem","position":3,"name":"Set-Cookie pr\u00fcfen und Laufzeit unter ITP absch\u00e4tzen"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10251","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=10251"}],"version-history":[{"count":4,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10251\/revisions"}],"predecessor-version":[{"id":21076,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10251\/revisions\/21076"}],"up":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/9283"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10251"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10251"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}