{"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-08-15T00:38:26","modified_gmt":"2026-08-14T22:38:26","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 Keks bittet um zwei Jahre und bekommt sieben Tage. Was davon gilt, entscheidet die Art, wie er gesetzt wurde, nicht der Header. Nach Einf\u00fcgen des Headers und der Angabe, wie er 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: #0b1114; 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 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 Keks bittet um zwei Jahre und bekommt sieben Tage. Was davon gilt, entscheidet die Art, wie er gesetzt wurde, nicht der Header. Nach Einf\u00fcgen des Headers und der Angabe, wie er 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\":\"Sitzungskeks\",\"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 jeden \u00fcber document.cookie geschriebenen Keks auf sieben Tage.\",\"s_cname\":\"Die Antwort kommt \u00fcber einen CNAME von woanders, und solche Kekse k\u00fcrzt Safari ebenfalls auf sieben Tage.\",\"s_dritt\":\"Im Drittanbieter-Zusammenhang blockiert Safari den Keks vollst\u00e4ndig.\",\"c_400\":\"Chrome kappt jeden Keks bei 400 Tagen.\",\"c_dritt\":\"Drittanbieter-Kekse laufen aus; ohne die Partitionierung nach CHIPS kommt hier nichts an.\",\"f_400\":\"Firefox kappt jeden Keks bei 400 Tagen.\",\"f_dritt\":\"Firefox trennt Drittanbieter-Kekse je Seite, jede Seite sieht damit ihren eigenen.\",\"b_gross\":\"Name und Wert ergeben zusammen %s Byte. Ab 4096 Byte verwirft der Browser den Keks kommentarlos.\",\"b_none_ohne_secure\":\"SameSite=None ohne Secure lehnt jeder aktuelle Browser ab.\",\"b_ohne_samesite\":\"SameSite fehlt. Chrome behandelt das als Lax, der Keks fehlt damit bei Anfragen von fremden Seiten.\",\"b_samesite_unbekannt\":\"SameSite=%s ist kein vorgesehener Wert, der Keks f\u00e4llt damit auf die Voreinstellung zur\u00fcck.\",\"b_none_erstpartei\":\"SameSite=None bei einem Erstanbieter-Keks gibt ihn auch bei jeder fremden Anfrage mit, das ist selten gewollt.\",\"b_secure_ohne_tls\":\"Secure \u00fcber einfaches http bedeutet, dass der Keks gar nicht erst gespeichert wird.\",\"b_ohne_secure\":\"Ohne Secure wandert der Keks 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 den Keks 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: der Keks verschwindet, sobald der Browser schlie\u00dft.\",\"b_vergangenheit\":\"Der Zeitpunkt liegt in der Vergangenheit, das l\u00f6scht den Keks, statt ihn 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 Kekse wie die von Dritten und k\u00fcrzt sie auf sieben Tage.\",\"b_dritt\":\"Im Drittanbieter-Zusammenhang \u00fcberlebt der Keks nur dort, wo Drittanbieter-Kekse \u00fcberhaupt noch wirken.\",\"b_js_lang\":\"Der Keks 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 Kekse 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 einen Keks rundweg ablehnen, und zeigt, wie lange er 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 - Blog<\/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 - Blog\" \/>\n<meta property=\"og:description\" content=\"Liest einen Set-Cookie-Header, pr\u00fcft die Attribute, an denen Browser einen Keks rundweg ablehnen, und zeigt, wie lange er 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=\"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 - Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-08-14T22:38:26+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\\\/toolbox-2\\\/\"},{\"@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\":\"luky\",\"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\":\"luky\"},\"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 - Blog","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 - Blog","og_description":"Liest einen Set-Cookie-Header, pr\u00fcft die Attribute, an denen Browser einen Keks rundweg ablehnen, und zeigt, wie lange er 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","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 - Blog","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"datePublished":"2026-08-14T22:38:26+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\/toolbox-2\/"},{"@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":"luky","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":"luky"},"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":0,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/pages\/10251\/revisions"}],"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}]}}