In February 2019, WebKit shipped Intelligent Tracking Prevention 2.1. The release notes describe two changes that, taken together, broke a class of measurement architecture that had been quietly standard for years: a seven-day expiry on persistent cookies written through document.cookie, and the removal of partitioned cookies for domains classified as cross-site trackers. The first change capped the lifetime of the identifier most client-side attribution vendors relied on. The second removed the fallback that had let those vendors keep a separate cookie jar per top-level site.
This is a mechanism-level account of what ITP 2.1 actually did, what it did not do, and why the CNAME cloaking crackdown that followed was a policy consequence rather than a separate technical feature. The primary sources are WebKit’s own release posts and its tracking prevention policy. Where behavior is undocumented, this article says so and stops.
What ITP 2.1 changed, in the exact words of the release
The ITP 2.1 post states the rule plainly: “With ITP 2.1, all persistent client-side cookies, i.e. persistent cookies created through document.cookie, are capped to a seven day expiry.” The post gives three stated reasons: cross-site trackers were using first-party cookie jars for persistent tracking; cookies readable via document.cookie are exposed to speculative execution and cross-site scripting attacks; and cookie proliferation slows page loads.
The scope matters. The cap applies to persistent cookies created through the document.cookie API, in both first-party contexts and third-party iframes. It does not apply to session cookies, which remain session cookies. It does not apply to cookies set in HTTP responses. And it does not apply to cookies with an expiry shorter than seven days, which keep their shorter expiry.
The same release removed partitioned cookies for classified domains. ITP 1.0 had introduced partitioning as a compromise: a tracker’s cookies were isolated per top-level site rather than purged outright. ITP 2.0 removed the 24-hour cookie access window. ITP 2.1 removed partitioning entirely, so classified third parties “now have to use the Storage Access API to get any cookie access.”
Why the cap hit measurement specifically
Client-side attribution vendors had a standard pattern: a JavaScript tag on the publisher’s page writes an identifier into a first-party cookie via document.cookie, then reads it back on subsequent pageviews and on conversion pages. The identifier is first-party in name because it is set on the publisher’s registrable domain, but it is written by a third-party script. That is exactly the pattern ITP 2.1 targeted.
The seven-day cap means the identifier expires after seven days unless it is rewritten. Rewriting is possible on every pageview where the tag fires, so the practical effect is not that the identifier disappears after seven days of active browsing. The effect is that it cannot survive a gap of more than seven days without a pageview on a property where the tag fires. For a measurement window that spans a consideration period longer than a week, the identifier is gone.
WebKit’s stated rationale for the cap is explicit about the first-party cookie jar: “Say social.example writes a user tracking ID as a news.example first-party cookie. Now analytics.example, adnetwork.example, and video.example can leverage or cross pollinate that user tracking ID through their scripts on news.example.” The cap is a limit on how long any script-written identifier can persist, regardless of which script wrote it.
The CNAME cloaking problem
CNAME cloaking is a DNS-level workaround. A publisher creates a subdomain such as metrics.publisher.example and points it, via a CNAME record, at a third-party tracking vendor’s domain. The browser sees a request to a subdomain of the publisher’s registrable domain. Cookies set on that subdomain are first-party cookies by the browser’s default rules, because the registrable domain matches the top-level site.
WebKit’s tracking prevention policy defines a first party as “a website that a user is intentionally and knowingly visiting, as displayed by the URL field of the browser, and the set of resources on the web operated by the same organization.” It then states the operational test: “In practice, we consider resources to belong to the same party if they are part of the same registrable domain: a public suffix plus one additional label.”
That definition is the crackdown. A CNAME-cloaked subdomain is part of the publisher’s registrable domain, so under a naive reading it is first-party. But the policy’s definition of first party requires that the resources be “operated by the same organization” as the site the user is visiting. A subdomain that resolves to a third-party vendor’s infrastructure is not operated by the publisher in the sense the policy means. The policy does not name CNAME cloaking as a technique, but the definition of first party is the hook that makes it a circumvention.
The policy’s circumvention clause is unambiguous: “We treat circumvention of shipping anti-tracking measures with the same seriousness as exploitation of security vulnerabilities. If a party attempts to circumvent our tracking prevention methods, we may add additional restrictions without prior notice.” CNAME cloaking is a circumvention of the registrable-domain test, and the policy reserves the right to respond without notice.
What the policy does and does not promise
The policy lists “Measuring the effectiveness of advertising” and “Audience measurement” under “Unintended Impact” — practices WebKit does not intend to disrupt but which may be affected because they rely on techniques that can also be used for tracking. The policy states: “When faced with a tradeoff, we will typically prioritize user benefits over preserving current website practices.” It also states that WebKit “will try to limit unintended impact” and may “design and implement new web technologies to re-enable these practices without reintroducing tracking capabilities,” citing the Storage Access API and Private Click Measurement as examples.
That is the honest boundary of the primary sources. The policy commits to trying to limit unintended impact on measurement. It does not commit to preserving any specific measurement technique. It does not name CNAME cloaking. It does not specify how detection works at the network layer. WebKit’s public posts describe the classification model in general terms — on-device statistics, a machine learning classifier, vectors including subresource under number of unique domains, sub frame under number of unique domains, and number of unique domains redirected to — but they do not publish the CNAME detection logic. Any claim about the specific signals WebKit uses to identify a cloaked subdomain would be speculation, and this article does not make one.
The economic consequence, stated narrowly
The measurable consequence of ITP 2.1 is a hard ceiling on the lifetime of a script-written first-party identifier: seven days, with no partitioned fallback for classified domains. For any measurement method that depends on that identifier surviving a longer gap, the method fails in Safari. That is not a claim about how much revenue was lost or what percentage of conversions were affected. Those numbers would require data this article does not have. It is a claim about the mechanism: the identifier’s maximum lifetime is bounded, and the bound is enforced by the browser.
The CNAME crackdown is a policy consequence, not a separate release. Once WebKit defined first party by operation rather than by DNS, a cloaked subdomain became a circumvention target. The policy’s no-exceptions clause reinforces this: “We do not grant exceptions to our tracking prevention technologies to specific parties. Some parties might have valid uses for techniques that are also used for tracking. But WebKit often has no technical means to distinguish valid uses from tracking.”
What operators can actually verify
Three things are checkable against the primary sources without speculation:
- Whether a cookie is set via
document.cookieor via an HTTP response header. The ITP 2.1 cap applies only to the former. Authentication cookies set in HTTP responses withSecureandHttpOnlyare not affected by the lifetime cap, as the release post states. - Whether a subdomain resolves via CNAME to a third-party domain. That is a DNS query, not a browser behavior, and it is observable.
- Whether a domain has been classified by ITP. WebKit does not publish a list. The classification is on-device and algorithmic. The ITP 2.0 post states there is no whitelisting feature and no centralized blacklist.
What is not checkable from public sources is the exact detection logic for CNAME cloaking or the exact classifier weights. WebKit has not published those, and this article does not invent them.
FAQ
Does the seven-day cap apply to cookies set by the server?
No. The ITP 2.1 post states the cap applies to “persistent client-side cookies, i.e. persistent cookies created through document.cookie.” Cookies set in HTTP responses are not covered by this specific change.
Does the cap apply in first-party contexts?
Yes. The post states: “The change covers cookies created in first-party contexts as well as in third-party iframes.”
Does ITP treat subdomains as separate parties?
No. The ITP 2.0 FAQ states: “ITP captures statistics and applies its rules for the effective top-level domain plus one, or eTLD+1.” A subdomain of the publisher’s registrable domain is the same party under that test — which is why CNAME cloaking was possible in the first place, and why the policy’s operation-based definition of first party is the relevant counter.
Is there a whitelist for legitimate measurement domains?
No. The ITP 2.0 FAQ states: “Is there a way for users to whitelist my domain to be excepted from ITP’s rules? No, there is no such whitelisting feature.” The policy’s no-exceptions clause restates this.
What replaced the removed techniques?
The policy names the Storage Access API and Private Click Measurement as technologies designed to re-enable specific practices without reintroducing tracking capabilities. The Storage Access API requires user interaction with embedded content, as described in the ITP 2.0 post. Private Click Measurement is referenced in the policy but not detailed in the sources retrieved for this article.
Sources
- WebKit, “Intelligent Tracking Prevention” (June 5, 2017) — https://webkit.org/blog/7675/intelligent-tracking-prevention/
- WebKit, “Intelligent Tracking Prevention 2.0” (June 4, 2018) — https://webkit.org/blog/8311/intelligent-tracking-prevention-2-0/
- WebKit, “Intelligent Tracking Prevention 2.1” (February 21, 2019) — https://webkit.org/blog/8613/intelligent-tracking-prevention-2-1/
- WebKit, “Tracking Prevention Policy” — https://webkit.org/tracking-prevention-policy/
- W3C, “Tracking Preference Expression (DNT)” (Working Group Note, January 17, 2019) — https://www.w3.org/TR/tracking-dnt/



