| dnt-wd3.txt | dnt-wd4.txt | |||
|---|---|---|---|---|
| W3C | W3C | |||
| Tracking Preference Expression (DNT) | Tracking Preference Expression (DNT) | |||
| W3C Working Draft 02 October 2012 | W3C Working Draft 30 April 2013 | |||
| This version: | This version: | |||
| http://www.w3.org/TR/2012/WD-tracking-dnt-20121002/ | http://www.w3.org/TR/2013/WD-tracking-dnt-20130430/ | |||
| Latest published version: | Latest published version: | |||
| http://www.w3.org/TR/tracking-dnt/ | http://www.w3.org/TR/tracking-dnt/ | |||
| Latest editor's draft: | Latest editor's draft: | |||
| http://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html | http://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html | |||
| Previous version: | Previous version: | |||
| http://www.w3.org/TR/2012/WD-tracking-dnt-20120313/ | http://www.w3.org/TR/2012/WD-tracking-dnt-20121002/ | |||
| Editors: | Editors: | |||
| Roy T. Fielding, Adobe | Roy T. Fielding, Adobe | |||
| David Singer, Apple | David Singer, Apple | |||
| Copyright (c) 2012 W3C(R) (MIT, ERCIM, Keio), All Rights Reserved. W3C | Copyright (c) 2013 W3C(R) (MIT, ERCIM, Keio, Beihang), All Rights | |||
| liability, trademark and document use rules apply. | Reserved. W3C liability, trademark and document use rules apply. | |||
| ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | |||
| Abstract | Abstract | |||
| This specification defines the technical mechanisms for expressing a | This specification defines the technical mechanisms for expressing a | |||
| tracking preference via the DNT request header field in HTTP, via an HTML | tracking preference via the DNT request header field in HTTP, via an HTML | |||
| DOM property readable by embedded scripts, and via properties accessible | DOM property readable by embedded scripts, and via properties accessible | |||
| to various user agent plug-in or extension APIs. It also defines | to various user agent plug-in or extension APIs. It also defines | |||
| mechanisms for sites to signal whether and how they honor this preference, | mechanisms for sites to signal whether and how they honor this preference, | |||
| both in the form of a machine-readable tracking status resource at a | both in the form of a machine-readable tracking status resource at a | |||
| well-known location and via a Tk response header field, and a mechanism | well-known location and via a Tk response header field, and a mechanism | |||
| for allowing the user to approve site-specific exceptions to DNT as | for allowing the user to approve exceptions to DNT as desired. | |||
| desired. | ||||
| Status of This Document | Status of This Document | |||
| This section describes the status of this document at the time of its | This section describes the status of this document at the time of its | |||
| publication. Other documents may supersede this document. A list of | publication. Other documents may supersede this document. A list of | |||
| current W3C publications and the latest revision of this technical report | current W3C publications and the latest revision of this technical report | |||
| can be found in the W3C technical reports index at http://www.w3.org/TR/. | can be found in the W3C technical reports index at http://www.w3.org/TR/. | |||
| This document is a snapshot of live discussions within the Tracking | This document is a snapshot of ongoing discussions within the Tracking | |||
| Protection Working Group. It does not yet capture all of our work. For | Protection Working Group. Text present or not present in this document | |||
| example, we have issues that are [PENDING REVIEW] with complete text | does not determine consensus within the Working Group; discussions and | |||
| proposals that have not yet made it into this draft. Text in blue boxes | debates are ongoing. Text in option boxes (highlighted with light blue | |||
| presents multiple options the group is considering. Options included in | background color) present options that the group is currently considering, | |||
| this draft should not be read as limitations on the potential outcome, but | particularly where consensus is known to be lacking, and should be read as | |||
| rather simply as possible options that are currently under consideration | a set of proposals rather than as limitations on the potential outcome. | |||
| by the working group. Readers may review changes from the previous Working | Members of the Working Group wish to emphasize that this draft is a work | |||
| Draft. An issue tracking system is available for recording raised, open, | in progress and not a decided outcome or guaranteed direction for future | |||
| pending review, closed, and postponed issues regarding this document. | versions of this document. | |||
| Readers may review changes from the previous Working Draft. An issue | ||||
| tracking system is available for recording raised, open, pending review, | ||||
| closed, and postponed issues regarding this document. | ||||
| This document was published by the Tracking Protection Working Group as a | This document was published by the Tracking Protection Working Group as a | |||
| Working Draft. This document is intended to become a W3C Recommendation. | Working Draft. This document is intended to become a W3C Recommendation. | |||
| If you wish to make comments regarding this document, please send them to | If you wish to make comments regarding this document, please send them to | |||
| public-tracking@w3.org (subscribe, archives). All feedback is welcome. | public-tracking-comments@w3.org (subscribe, archives). All comments are | |||
| welcome. | ||||
| Publication as a Working Draft does not imply endorsement by the W3C | Publication as a Working Draft does not imply endorsement by the W3C | |||
| Membership. This is a draft document and may be updated, replaced or | Membership. This is a draft document and may be updated, replaced or | |||
| obsoleted by other documents at any time. It is inappropriate to cite this | obsoleted by other documents at any time. It is inappropriate to cite this | |||
| document as other than work in progress. | document as other than work in progress. | |||
| This document was produced by a group operating under the 5 February 2004 | This document was produced by a group operating under the 5 February 2004 | |||
| W3C Patent Policy. W3C maintains a public list of any patent disclosures | W3C Patent Policy. W3C maintains a public list of any patent disclosures | |||
| made in connection with the deliverables of the group; that page also | made in connection with the deliverables of the group; that page also | |||
| includes instructions for disclosing a patent. An individual who has | includes instructions for disclosing a patent. An individual who has | |||
| skipping to change at line 87 | skipping to change at line 91 | |||
| * 1. Introduction | * 1. Introduction | |||
| * 2. Notational Conventions | * 2. Notational Conventions | |||
| * 2.1 Requirements | * 2.1 Requirements | |||
| * 2.2 Formal Syntax | * 2.2 Formal Syntax | |||
| * 2.3 Terminology | * 2.3 Terminology | |||
| * 3. Determining User Preference | * 3. Determining User Preference | |||
| * 4. Expressing a Tracking Preference | * 4. Expressing a Tracking Preference | |||
| * 4.1 Expression Format | * 4.1 Expression Format | |||
| * 4.2 DNT Header Field for HTTP Requests | * 4.2 DNT Header Field for HTTP Requests | |||
| * 4.3 JavaScript API to Detect Preference | * 4.3 JavaScript Property to Detect Preference | |||
| * 4.4 Plug-In APIs | * 4.4 Plug-In APIs | |||
| * 4.5 Tracking Preference Expressed in Other Protocols | * 4.5 Tracking Preference Expressed in Other Protocols | |||
| * 5. Communicating a Tracking Status | * 5. Communicating a Tracking Status | |||
| * 5.1 Overview | * 5.1 Overview | |||
| * 5.2 Tracking Status Value | * 5.2 Tracking Status Value | |||
| * 5.3 Tracking Status Qualifier Values | * 5.2.1 Definition | |||
| * 5.4 Tk Header Field for HTTP Responses | * 5.2.2 None (N) | |||
| * 5.4.1 Definition | * 5.2.3 First Party (1) | |||
| * 5.4.2 Referring to a Request-specific Tracking Status | * 5.2.4 Third Party (3) | |||
| * 5.2.5 Dynamic (X) | ||||
| * 5.2.6 Consent (C) | ||||
| * 5.2.7 Potential Consent (P) | ||||
| * 5.2.8 Disregarding (D) | ||||
| * 5.2.9 Updated (U) | ||||
| * 5.2.10 Non-compliant (!) | ||||
| * 5.3 Tk Header Field for HTTP Responses | ||||
| * 5.3.1 Definition | ||||
| * 5.3.2 Referring to a Request-specific Tracking Status | ||||
| Resource | Resource | |||
| * 5.4.3 Indicating an Interactive Status Change | * 5.3.3 Indicating an Interactive Status Change | |||
| * 5.5 Tracking Status Resource | * 5.4 Tracking Status Resource | |||
| * 5.5.1 Site-wide Tracking Status | * 5.4.1 Site-wide Tracking Status | |||
| * 5.5.2 Request-specific Tracking Status | * 5.4.2 Request-specific Tracking Status | |||
| * 5.5.3 Representation | * 5.4.3 Representation | |||
| * 5.5.4 Status Checks are Not Tracked | * 5.4.4 Status Checks are Not Tracked | |||
| * 5.5.5 Caching | * 5.4.5 Caching | |||
| * 5.6 Status Code for Tracking Required | * 5.5 Status Code for Tracking Required | |||
| * 5.7 Using the Tracking Status | * 5.6 Using the Tracking Status | |||
| * 5.7.1 Discovering Deployment | * 5.6.1 Discovering Deployment | |||
| * 5.7.2 Preflight Checks | * 5.6.2 Preflight Checks | |||
| * 6. User-Granted Exceptions | * 6. User-Granted Exceptions | |||
| * 6.1 Overview | * 6.1 Overview | |||
| * 6.2 Motivating Principles and Use Cases | * 6.2 Motivating Principles and Use Cases | |||
| * 6.3 Exception model | * 6.3 Exception model | |||
| * 6.3.1 Introduction | * 6.3.1 User Interaction | |||
| * 6.3.2 Exception use by browsers | * 6.3.2 Processing Model | |||
| * 6.4 JavaScript API for Site-specific Exceptions | * 6.4 JavaScript API for Site-specific Exceptions | |||
| * 6.4.1 API to request site-specific exceptions | * 6.4.1 API to Request a Site-specific Exception | |||
| * 6.4.2 API to Cancel a Site-specific Exception | * 6.4.2 API to Cancel a Site-specific Exception | |||
| * 6.4.3 API to Confirm a Site-specific Exception | ||||
| * 6.5 JavaScript API for Web-wide Exceptions | * 6.5 JavaScript API for Web-wide Exceptions | |||
| * 6.5.1 API to Request a Web-wide Exception | * 6.5.1 API to Request a Web-wide Exception | |||
| * 6.5.2 API to cancel a web-wide exception | * 6.5.2 API to Cancel a Web-wide Exception | |||
| * 6.6 Querying a host's exception status | * 6.5.3 API to Confirm a Web-wide Exception | |||
| * 6.7 Transfer of an exception to another third party | * 6.6 Transfer of an exception to another third party | |||
| * 6.8 User interface guidelines | * 6.7 User interface guidelines | |||
| * 6.8 Exceptions without interactive JavaScript | ||||
| * 6.9 Exceptions without a DNT header | * 6.9 Exceptions without a DNT header | |||
| * 6.10 Fingerprinting | * 6.10 Exception use by sites | |||
| * 6.11 Fingerprinting | ||||
| * A. Acknowledgements | * A. Acknowledgements | |||
| * B. References | * B. References | |||
| * B.1 Normative references | * B.1 Normative references | |||
| * B.2 Informative references | * B.2 Informative references | |||
| 1. Introduction | 1. Introduction | |||
| The World Wide Web (WWW, or Web) consists of millions of sites | The World Wide Web (WWW, or Web) consists of millions of sites | |||
| interconnected through the use of hypertext. Hypertext provides a simple, | interconnected through the use of hypertext. Hypertext provides a simple, | |||
| page-oriented view of a wide variety of information that can be traversed | page-oriented view of a wide variety of information that can be traversed | |||
| skipping to change at line 197 | skipping to change at line 213 | |||
| expressed preference, and JavaScript APIs for determining DNT status and | expressed preference, and JavaScript APIs for determining DNT status and | |||
| requesting a user-granted exception. | requesting a user-granted exception. | |||
| A companion document, [TRACKING-COMPLIANCE], more precisely defines the | A companion document, [TRACKING-COMPLIANCE], more precisely defines the | |||
| terminology of tracking preferences, the scope of its applicability, and | terminology of tracking preferences, the scope of its applicability, and | |||
| the requirements on compliant first-party and third-party participants | the requirements on compliant first-party and third-party participants | |||
| when an indication of tracking preference is received. | when an indication of tracking preference is received. | |||
| Issue 136: Resolve dependencies of the TPE on the compliance specification | Issue 136: Resolve dependencies of the TPE on the compliance specification | |||
| The WG has not come to consensus regarding the definition of tracking and | [OPEN] The WG has not come to consensus regarding the definition of | |||
| the scope of DNT. As such, a site cannot actually say with any confidence | tracking and the scope of DNT. As such, a site cannot actually say with | |||
| whether or not it is tracking, let alone describe the finer details in a | any confidence whether or not it is tracking, let alone describe the finer | |||
| tracking status resource. This issue will be resolved by progress on the | details in a tracking status resource. This issue will be resolved by | |||
| TCS document, though its resolution is a necessary prerequisite to | progress on the TCS document, though its resolution is a necessary | |||
| understanding and correctly implementing the protocol defined by this | prerequisite to understanding and correctly implementing the protocol | |||
| document. | defined by this document. | |||
| 2. Notational Conventions | 2. Notational Conventions | |||
| 2.1 Requirements | 2.1 Requirements | |||
| The key words MUST, MUST NOT, REQUIRED, SHOULD, SHOULD NOT, RECOMMENDED, | The key words must, must not, required, should, should not, recommended, | |||
| MAY, and OPTIONAL in this specification are to be interpreted as described | may, and optional in this specification are to be interpreted as described | |||
| in [RFC2119]. | in [RFC2119]. | |||
| 2.2 Formal Syntax | 2.2 Formal Syntax | |||
| This specification uses Augmented Backus-Naur Form [ABNF] to define | This specification uses Augmented Backus-Naur Form [ABNF] to define | |||
| network protocol syntax and WebIDL [WEBIDL] for defining scripting APIs. | network protocol syntax and WebIDL [WEBIDL] for defining scripting APIs. | |||
| 2.3 Terminology | 2.3 Terminology | |||
| This specification uses the term user agent to refer to any of the various | This specification uses the term user agent to refer to any of the various | |||
| client programs capable of initiating HTTP requests, including, but not | client programs capable of initiating HTTP requests, including, but not | |||
| limited to, browsers, spiders (web-based robots), command-line tools, | limited to, browsers, spiders (web-based robots), command-line tools, | |||
| native applications, and mobile apps [HTTP11]. | native applications, and mobile apps [HTTP11]. | |||
| The term permitted use is used to indicate a restricted set of conditions | The term permitted use is used to indicate a restricted set of conditions | |||
| under which tracking is allowed in spite of the user's DNT preference. | under which tracking is allowed in spite of the user's DNT preference. | |||
| The term user-granted exception is used when the user has permitted | The term user-granted exception is used when the user has permitted | |||
| tracking by a given third party, usually in the form of a site-specific | tracking by a given third party. | |||
| exception. | ||||
| A companion document, [TRACKING-COMPLIANCE], defines many of the terms | A companion document, [TRACKING-COMPLIANCE], defines many of the terms | |||
| used here, notably 'party', 'first party', and 'third party'. | used here, notably 'party', 'first party', and 'third party'. | |||
| 3. Determining User Preference | 3. Determining User Preference | |||
| The goal of this protocol is to allow a user to express their personal | The goal of this protocol is to allow a user to express their personal | |||
| preference regarding tracking to each server and web application that they | preference regarding tracking to each server and web application that they | |||
| communicate with via HTTP, thereby allowing each service to either adjust | communicate with via HTTP, thereby allowing each service to either adjust | |||
| their behavior to meet the user's expectations or reach a separate | their behavior to meet the user's expectations or reach a separate | |||
| agreement with the user to satisfy all parties. | agreement with the user to satisfy all parties. | |||
| Key to that notion of expression is that it MUST reflect the user's | Key to that notion of expression is that the signal sent MUST reflect the | |||
| preference, not the choice of some vendor, institution, or network-imposed | user's preference, not the choice of some vendor, institution, site, or | |||
| mechanism outside the user's control. The basic principle is that a | any network-imposed mechanism outside the user's control; this applies | |||
| tracking preference expression is only transmitted when it reflects a | equally to both the general preference and exceptions. The basic principle | |||
| deliberate choice by the user. In the absence of user choice, there is no | is that a tracking preference expression is only transmitted when it | |||
| tracking preference expressed. | reflects a deliberate choice by the user. In the absence of user choice, | |||
| there is no tracking preference expressed. | ||||
| A user agent MUST offer users a minimum of two alternative choices for a | A user agent MUST offer users a minimum of two alternative choices for a | |||
| Do Not Track preference: unset or DNT:1. A user agent MAY offer a third | Do Not Track preference: unset or DNT:1. A user agent MAY offer a third | |||
| alternative choice: DNT:0. | alternative choice: DNT:0. | |||
| If the user's choice is DNT:1 or DNT:0, the tracking preference is | If the user's choice is DNT:1 or DNT:0, the tracking preference is | |||
| enabled; otherwise, the tracking preference is not enabled. | enabled; otherwise, the tracking preference is not enabled. | |||
| A user agent MUST have a default tracking preference of unset (not | A user agent MUST have a default tracking preference of unset (not | |||
| enabled) unless a specific tracking preference is implied by the decision | enabled) unless a specific tracking preference is implied by the decision | |||
| skipping to change at line 291 | skipping to change at line 307 | |||
| have access to user agents with a predetermined preference enabled, the | have access to user agents with a predetermined preference enabled, the | |||
| user is at least able to choose whether to make use of those user agents. | user is at least able to choose whether to make use of those user agents. | |||
| In contrast, if a user brings their own Web-enabled device to a library or | In contrast, if a user brings their own Web-enabled device to a library or | |||
| cafe with wireless Internet access, the expectation will be that their | cafe with wireless Internet access, the expectation will be that their | |||
| chosen user agent and personal preferences regarding Web site behavior | chosen user agent and personal preferences regarding Web site behavior | |||
| will not be altered by the network environment, aside from blanket | will not be altered by the network environment, aside from blanket | |||
| limitations on what resources can or cannot be accessed through that | limitations on what resources can or cannot be accessed through that | |||
| network. Implementations of HTTP that are not under control of the user | network. Implementations of HTTP that are not under control of the user | |||
| MUST NOT generate or modify a tracking preference. | MUST NOT generate or modify a tracking preference. | |||
| Issue 136: Resolve dependencies of the TPE on the compliance specification | ||||
| Some participants have noted that enabled/not-enabled status may depend on | ||||
| the Compliance document or may have varying implications in different | ||||
| jurisdictions. | ||||
| 4. Expressing a Tracking Preference | 4. Expressing a Tracking Preference | |||
| 4.1 Expression Format | 4.1 Expression Format | |||
| When a user has enabled a tracking preference, that preference needs to be | When a user has enabled a tracking preference, that preference needs to be | |||
| expressed to all mechanisms that might perform or initiate tracking by | expressed to all mechanisms that might perform or initiate tracking by | |||
| third parties, including sites that the user agent communicates with via | third parties, including sites that the user agent communicates with via | |||
| HTTP, scripts that can extend behavior on pages, and plug-ins or | HTTP, scripts that can extend behavior on pages, and plug-ins or | |||
| extensions that might be installed and activated for various media types. | extensions that might be installed and activated for various media types. | |||
| skipping to change at line 329 | skipping to change at line 351 | |||
| servers might make use of other preference information outside the scope | servers might make use of other preference information outside the scope | |||
| of this protocol, such as site-specific user preferences or third-party | of this protocol, such as site-specific user preferences or third-party | |||
| registration services, to inform or adjust their behavior when no explicit | registration services, to inform or adjust their behavior when no explicit | |||
| preference is expressed via this protocol. | preference is expressed via this protocol. | |||
| 4.2 DNT Header Field for HTTP Requests | 4.2 DNT Header Field for HTTP Requests | |||
| The DNT header field is hereby defined as the means for expressing a | The DNT header field is hereby defined as the means for expressing a | |||
| user's tracking preference via HTTP [HTTP11]. | user's tracking preference via HTTP [HTTP11]. | |||
| DNT-field-name = "DNT" ; case-insensitive | DNT-field-name = "DNT" | |||
| DNT-field-value = ( "0" / "1" ) *DNT-extension ; case-sensitive | DNT-field-value = ( "0" / "1" ) *DNT-extension | |||
| DNT-extension = %x21 / %x23-2B / %x2D-5B / %x5D-7E | DNT-extension = %x21 / %x23-2B / %x2D-5B / %x5D-7E | |||
| ; excludes CTL, SP, DQUOTE, comma, backslash | ; excludes CTL, SP, DQUOTE, comma, backslash | |||
| A user agent MUST send the DNT header field on all HTTP requests if (and | A user agent MUST send the DNT header field on all HTTP requests if (and | |||
| only if) a tracking preference is enabled. A user agent MUST NOT send the | only if) a tracking preference is enabled. A user agent MUST NOT send the | |||
| DNT header field if a tracking preference is not enabled. | DNT header field if a tracking preference is not enabled. | |||
| The DNT field-value sent by a user agent MUST begin with the numeric | The DNT field-value sent by a user agent MUST begin with the numeric | |||
| character "1" (%x31) if a tracking preference is enabled, the preference | character "1" (%x31) if a tracking preference is enabled, the preference | |||
| is for no tracking, and there is not a site-specific exception for the | is for no tracking, and there is not an exception for the origin server | |||
| origin server targeted by this request. | targeted by this request. | |||
| The DNT field-value sent by a user agent MUST begin with the numeric | The DNT field-value sent by a user agent MUST begin with the numeric | |||
| character "0" (%x30) if a tracking preference is enabled and the | character "0" (%x30) if a tracking preference is enabled and the | |||
| preference is to allow tracking in general or by specific exception for | preference is to allow tracking in general or by specific exception for | |||
| the origin server targeted by this request. | the origin server targeted by this request. | |||
| Example 1 | Example 1 | |||
| GET /something/here HTTP/1.1 | GET /something/here HTTP/1.1 | |||
| Host: example.com | Host: example.com | |||
| skipping to change at line 378 | skipping to change at line 400 | |||
| DNT extensions are to be interpreted as modifiers to the main preference | DNT extensions are to be interpreted as modifiers to the main preference | |||
| expressed by the first digit, such that the main preference will be obeyed | expressed by the first digit, such that the main preference will be obeyed | |||
| if the recipient does not understand the extension. Hence, a | if the recipient does not understand the extension. Hence, a | |||
| DNT-field-value of "1xyz" can be thought of as do not track, but if you | DNT-field-value of "1xyz" can be thought of as do not track, but if you | |||
| understand the refinements defined by x, y, or z, then adjust my | understand the refinements defined by x, y, or z, then adjust my | |||
| preferences according to those refinements. DNT extensions can only be | preferences according to those refinements. DNT extensions can only be | |||
| transmitted when a tracking preference is enabled. | transmitted when a tracking preference is enabled. | |||
| The extension syntax is restricted to visible ASCII characters that can be | The extension syntax is restricted to visible ASCII characters that can be | |||
| parsed as a single word in HTTP and safely embedded in a JSON string | parsed as a single word in HTTP and safely embedded in a JSON string | |||
| without further encoding (section 5.5.3 Representation). Since the DNT | without further encoding (section 5.4.3 Representation). Since the DNT | |||
| header field is intended to be sent on every request, when enabled, | header field is intended to be sent on every request, when enabled, | |||
| designers of future extensions ought to use as few extension characters as | designers of future extensions ought to use as few extension characters as | |||
| possible. | possible. | |||
| Note | Note | |||
| This document does not have any implied or specified behavior for the | This document does not have any implied or specified behavior for the | |||
| user-agent treatment of cookies when DNT is enabled. | user-agent treatment of cookies when DNT is enabled. | |||
| 4.3 JavaScript API to Detect Preference | Note | |||
| A doNotTrack attribute on the Navigator interface [NAVIGATOR] (e.g., the | The HTTP specification [HTTP11] permits multiple headers with the same | |||
| window.navigator object) is hereby defined as the means for expressing the | field-name only under restricted circumstances which do not apply here; | |||
| user's general tracking preference to scripts running within a top-level | hence, at most one DNT header may be present in a valid HTTP request. | |||
| page. A user agent MUST provide a doNotTrack attribute on the Navigator | ||||
| interface for each top-level page. | ||||
| partial interface Navigator { | Issue 176: Requirements on intermediaries/isps and header insertion that | |||
| readonly attribute DOMString doNotTrack; | might affect tracking | |||
| }; | ||||
| doNotTrack of type DOMString, readonly | [OPEN] | |||
| When a tracking preference is enabled, the doNotTrack attribute | ||||
| for each top-level page MUST have the same string value that would | ||||
| be sent in a DNT-field-value (section 4.2 DNT Header Field for | ||||
| HTTP Requests) to an origin server that does not have any | ||||
| corresponding user-granted exceptions. When a tracking preference | ||||
| is not enabled, the doNotTrack attribute for each top-level page | ||||
| MUST have a value of null. | ||||
| The doNotTrack attribute only provides the user's general tracking | Issue 153: What are the implications on software that changes requests but | |||
| preference, independent of any user-granted exceptions or out-of-band | does not necessarily initiate them? | |||
| consent. A script wishing to determine the specific tracking preference | ||||
| for a given document origin is expected to use the API in section 6.6 | ||||
| Querying a host's exception status. | ||||
| A user agent MUST provide a doNotTrack attribute value that is consistent | [PENDING REVIEW] | |||
| with the user's current tracking preference that would be expressed via | ||||
| the DNT header field. However, changes to the user's preference might | ||||
| occur between the time when the APIs are checked and an actual request is | ||||
| made. A server MUST treat the user's most recently received preference as | ||||
| authoritative. | ||||
| Issue 116: How can we build a JS DOM property which doesn't allow inline | 4.3 JavaScript Property to Detect Preference | |||
| JS to receive mixed signals? | ||||
| [PENDING REVIEW] Updated text in this section. | This property enables a site executing code in its own origin to determine | |||
| what DNT header would be sent to it in the current context, taking into | ||||
| account the user's general preference (if any) and any user-granted | ||||
| exceptions. | ||||
| [NoInterfaceObject] | ||||
| interface WindowDoNotTrack { | ||||
| attribute DOMString doNotTrack; | ||||
| }; | ||||
| doNotTrack of type DOMString, | ||||
| Returns the same string value that would be sent in a | ||||
| DNT-field-value (section 4.2 DNT Header Field for HTTP Requests) | ||||
| to a target that is the document-origin of the window, in the | ||||
| context of the current top-level origin. If no DNT header would be | ||||
| sent (e.g. because a tracking preference is not enabled) the value | ||||
| is null. | ||||
| 4.4 Plug-In APIs | 4.4 Plug-In APIs | |||
| User agents often include user-installable component parts, commonly known | User agents often include user-installable component parts, commonly known | |||
| as plug-ins or browser extensions, that are capable of making their own | as plug-ins or browser extensions, that are capable of making their own | |||
| network requests. From the user's perspective, these components are | network requests. From the user's perspective, these components are | |||
| considered part of the user agent and thus ought to respect the user's | considered part of the user agent and thus ought to respect the user's | |||
| configuration of a tracking preference. However, plug-ins do not normally | configuration of a tracking preference. However, plug-ins do not normally | |||
| have read access to the browser configuration. | have read access to the browser configuration. | |||
| skipping to change at line 489 | skipping to change at line 508 | |||
| tracking status resource at a specific well-known location and an OPTIONAL | tracking status resource at a specific well-known location and an OPTIONAL | |||
| space of request-specific tracking status resources for sites where the | space of request-specific tracking status resources for sites where the | |||
| tracking status might vary based on data within the request. It also | tracking status might vary based on data within the request. It also | |||
| defines a Tk response header field that MAY be sent in any HTTP response, | defines a Tk response header field that MAY be sent in any HTTP response, | |||
| MUST be sent in responses to requests that modify the tracking status, and | MUST be sent in responses to requests that modify the tracking status, and | |||
| MAY direct the user to a request-specific tracking status resource | MAY direct the user to a request-specific tracking status resource | |||
| applicable to the current request. | applicable to the current request. | |||
| 5.2 Tracking Status Value | 5.2 Tracking Status Value | |||
| A tracking status value is a short notation for communicating how a | 5.2.1 Definition | |||
| A tracking status value (TSV) is a short notation for communicating how a | ||||
| designated resource conforms to the tracking protection protocol, as | designated resource conforms to the tracking protection protocol, as | |||
| defined by this document and [TRACKING-COMPLIANCE]. There is no form of | defined by this document and [TRACKING-COMPLIANCE]. For a site-wide | |||
| negative response; i.e., an origin server that does not wish to claim | tracking status resource, the designated resource to which the tracking | |||
| conformance to this protocol would not supply a tracking status resource | status applies is any resource on the same origin server. For a Tk | |||
| and would not send a Tk header field in responses. | response header field, the corresponding request target is the designated | |||
| resource and remains so for any subsequent request-specific tracking | ||||
| status resource referred to by that field. | ||||
| For a site-wide tracking status resource, the designated resource to which | The tracking status value is case sensitive, as defined formally by the | |||
| the tracking status applies is any resource on the same origin server. For | following ABNF. | |||
| a Tk response header field, the corresponding request target is the | ||||
| designated resource and remains so for any subsequent request-specific | ||||
| tracking status resource referred to by that field. | ||||
| All of the tracking status mechanisms use a common format for the tracking | TSV = "1" ; "1" - first-party | |||
| status value: a single character from a limited set. The meaning of each | / "3" ; "3" - third-party | |||
| allowed character is defined in the following table. | / %x43 ; "C" - consent | |||
| / %x44 ; "D" - disregarding | ||||
| / %x4E ; "N" - none | ||||
| / %x50 ; "P" - potential consent | ||||
| / %x55 ; "U" - updated | ||||
| / %x58 ; "X" - dynamic | ||||
| / ( "!" [testv] ) ; "!" - non-compliant | ||||
| status meaning | testv = id-char | |||
| None: The designated resource does not perform tracking of any | ||||
| N kind, not even for a permitted use, and does not make use of any | ||||
| data collected from tracking. | Issue 137: Does hybrid tracking status need to distinguish between first | |||
| First party: The designated resource is designed for use within a | party (1) and outsourcing service provider acting as a first party (s) | |||
| first-party context and conforms to the requirements on a first | ||||
| 1 party. If the designated resource is operated by an outsourced | [PENDING REVIEW] No, in practice there may be dozens of service providers | |||
| service provider, the service provider claims that it conforms to | on any given request. If the designated resource is operated by a service | |||
| the requirements on a third party acting as a first party. | provider acting as a first party, then the responsible first party is | |||
| Third party: The designated resource is designed for use within a | identified by the controller member or the owner of the origin server | |||
| 3 third-party context and conforms to the requirements on a third | domain. This satisfies the use case of distinguishing between a service | |||
| party. | provider acting for some other site and the same service provider acting | |||
| Dynamic: The designated resource is designed for use in both first | on one of its own sites. | |||
| and third-party contexts and dynamically adjusts tracking status | ||||
| accordingly. If X is present in the site-wide tracking status, more | 5.2.2 None (N) | |||
| information MUST be provided via the Tk response header field when | ||||
| X accessing a designated resource. If X is present in the Tk header | A tracking status value of N means the origin server claims that the | |||
| field, more information will be provided in a request-specific | designated resource does not perform tracking of any kind, not even for a | |||
| tracking status resource referred to by the status-id. An origin | permitted use, and does not make use of any data collected from tracking. | |||
| server MUST NOT send X as the tracking status value in the | ||||
| representation of a request-specific tracking status resource. | Issue 119: Specify "absolutely not tracking" | |||
| Consent: The designated resource believes it has received prior | ||||
| consent for tracking this user, user agent, or device, perhaps via | [OPEN] The N tracking status value corresponds to this notion of | |||
| C some mechanism not defined by this specification, and that prior | absolutely not tracking. | |||
| consent overrides the tracking preference expressed by this | ||||
| protocol. | 5.2.3 First Party (1) | |||
| Updated: The request resulted in a potential change to the tracking | ||||
| status applicable to this user, user agent, or device. A user agent | A tracking status value of 1 means that the origin server claims that the | |||
| that relies on a cached tracking status SHOULD update the cache | designated resource is designed for use only within a first-party context | |||
| U entry with the current status by making a new request on the | and conforms to the requirements on a first party. If the designated | |||
| applicable tracking status resource. An origin server MUST NOT send | resource is operated by an outsourced service provider, the service | |||
| U as a tracking status value anywhere other than a Tk header field | provider claims that it conforms to the requirements on a third party | |||
| that is in response to a state-changing request. | acting as a first party. | |||
| For the site-wide tracking status and Tk header field, the tracking status | For the site-wide tracking status and Tk header field, the tracking status | |||
| values 1 and 3 indicate how the designated resource is designed to | values 1 and 3 indicate how the designated resource is designed to | |||
| conform, not the nature of the request. Hence, if a user agent is making a | conform, not the nature of the request. Hence, if a user agent is making a | |||
| request in what appears to be a third-party context and the tracking | request in what appears to be a third-party context and the tracking | |||
| status value indicates that the designated resource is designed only for | status value indicates that the designated resource is designed only for | |||
| first-party conformance, then either the context has been misunderstood | first-party conformance, then either the context has been misunderstood | |||
| (both are actually the same party) or the resource has been referenced | (both are actually the same party) or the resource has been referenced | |||
| incorrectly. For the request-specific tracking status resource, an | incorrectly. | |||
| indication of first or third party as the status value describes how the | ||||
| resource conformed to that specific request, and thus indicates both the | ||||
| nature of the request (as viewed by the origin server) and the applicable | ||||
| set of requirements to which the origin server claims to conform. | ||||
| The tracking status value is case sensitive, as defined formally by the | For the request-specific tracking status resource, an indication of first | |||
| following ABNF. | or third party as the status value describes how the resource conformed to | |||
| that specific request, and thus indicates both the nature of the request | ||||
| (as viewed by the origin server) and the applicable set of requirements to | ||||
| which the origin server claims to conform. | ||||
| tracking-v = "1" ; "1" - first-party | 5.2.4 Third Party (3) | |||
| / "3" ; "3" - third-party | ||||
| / %x43 ; "C" - consent | ||||
| / %x4E ; "N" - none | ||||
| / %x55 ; "U" - updated | ||||
| / %x58 ; "X" - dynamic | ||||
| Issue 137: Does hybrid tracking status need to distinguish between first | A tracking status value of 3 means that the origin server claims that the | |||
| party (1) and outsourcing service provider acting as a first party (s) | designated resource is designed for use within a third-party context and | |||
| conforms to the requirements on a third party. | ||||
| [PENDING REVIEW] No, in practice there may be dozens of service providers | 5.2.5 Dynamic (X) | |||
| on any given request. If the designated resource is operated by a service | ||||
| provider acting as a first party, then the responsible first party is | ||||
| identified by the policy link or the owner of the origin server domain. | ||||
| This satisfies the use case of distinguishing between a service provider | ||||
| acting for some other site and the same service provider acting on one of | ||||
| its own sites. | ||||
| 5.3 Tracking Status Qualifier Values | A tracking status value of X means that the origin server claims that the | |||
| designated resource is designed for use in both first and third-party | ||||
| contexts and dynamically adjusts tracking status accordingly. | ||||
| When present, the tracking status qualifier member's value consists of a | If X is present in the site-wide tracking status, more information MUST be | |||
| string of characters indicating what permitted uses for tracking are being | provided via the Tk response header field when accessing a designated | |||
| used. Multiple qualifiers can be provided. | resource. If X is present in the Tk header field, more information will be | |||
| provided in a request-specific tracking status resource referred to by the | ||||
| status-id. An origin server MUST NOT send X as the tracking status value | ||||
| in the representation of a request-specific tracking status resource. | ||||
| Issue 136: Resolve dependencies of the TPE on the compliance specification | 5.2.6 Consent (C) | |||
| The list of qualifiers is intended to match one to one to the permitted | A tracking status value of C means that the origin server believes it has | |||
| uses identified by [TRACKING-COMPLIANCE], using references to the | received prior consent for tracking this user, user agent, or device, | |||
| definitions there. The list will then be updated accordingly. | perhaps via some mechanism not defined by this specification, and that | |||
| prior consent overrides the tracking preference expressed by this | ||||
| protocol. | ||||
| qualifier meaning | Issue 195: Flows and signals for handling out of band consent | |||
| Audit: Tracking is limited to that necessary for an external | ||||
| a audit of the service context and the data collected is minimized | ||||
| accordingly. | ||||
| c Ad frequency capping: Tracking is limited to frequency capping | ||||
| and the data collected is minimized accordingly. | ||||
| Fraud prevention: Tracking is limited to that necessary for | ||||
| f preventing or investigating fraudulent behavior and security | ||||
| violations; the data collected is minimized accordingly. | ||||
| Local constraints: Tracking is limited to what is required by | ||||
| l local law, rule, or regulation and the data collected is | ||||
| minimized accordingly. | ||||
| r Referrals: Tracking is limited to collecting referral | ||||
| information and the data collected is minimized accordingly. | ||||
| Qualifiers that indicate limitations on tracking correspond to the | [OPEN] The C tracking status value indicates out of band consent. | |||
| specific permitted uses in [TRACKING-COMPLIANCE]. An origin server | ||||
| indicating one or more of those permitted uses also indicates that it | ||||
| conforms to the requirements associated with those permitted uses. | ||||
| Multiple limitation qualifiers mean that multiple permitted uses of | ||||
| tracking might be present and that each such use conforms to the | ||||
| associated requirements. All limitation qualifiers imply some form of | ||||
| tracking might be used and thus MUST NOT be provided with a tracking | ||||
| status value of N (not tracking). | ||||
| Future extensions to this protocol might define additional characters as | Issue 152: User Agent Compliance: feedback for out-of-band consent | |||
| qualifiers from the ext-qualifier set (consisting of the remaining unused | ||||
| lowercase letters, dot, dash, and underscore). Recipients SHOULD ignore | ||||
| extension qualifiers that they do not understand. | ||||
| The tracking qualifier value is case sensitive, as defined formally by the | [PENDING REVIEW] Proposal is to not add UA requirements. | |||
| following ABNF. | ||||
| tracking-q = tracking-q-v* | 5.2.7 Potential Consent (P) | |||
| tracking-q-v = %x61 ; "a" - audit | ||||
| / %x63 ; "c" - capping | ||||
| / %x66 ; "f" - fraud | ||||
| / %x6C ; "l" - local | ||||
| / %x72 ; "r" - referral | ||||
| 5.4 Tk Header Field for HTTP Responses | A tracking status value of P means that the origin server does not know, | |||
| in real-time, whether it has received prior consent for tracking this | ||||
| user, user agent, or device, but promises not to use or share any DNT:1 | ||||
| data until such consent has been determined, and further promises to | ||||
| delete or de-identify within forty-eight hours any DNT:1 data received for | ||||
| which such consent has not been received. | ||||
| 5.4.1 Definition | Since this status value does not itself indicate whether a specific | |||
| request is tracked, an origin server that sends a P tracking status value | ||||
| MUST provide an edit member in the corresponding tracking status | ||||
| representation that links to a resource for obtaining consent status. | ||||
| The P tracking status value is specifically meant to address audience | ||||
| survey systems for which determining consent at the time of a request is | ||||
| either impractical, due to legacy systems not being able to keep up with | ||||
| Web traffic, or potentially "gamed" by first party sites if they can | ||||
| determine which of their users have consented. The data cannot be used for | ||||
| the sake of personalization. If consent can be determined at the time of a | ||||
| request, the C tracking status is preferred. | ||||
| Issue 195: Flows and signals for handling out of band consent | ||||
| [OPEN] The P tracking status value indicates a special case of general | ||||
| data collection which is then trimmed to exclude those without out of band | ||||
| consent. | ||||
| 5.2.8 Disregarding (D) | ||||
| A tracking status value of D means that the origin server is unable or | ||||
| unwilling to respect a tracking preference received from the requesting | ||||
| user agent. An origin server that sends this tracking status value MUST | ||||
| detail within the server's corresponding privacy policy the conditions | ||||
| under which a tracking preference might be disregarded. | ||||
| For example, an origin server might disregard the DNT field received from | ||||
| specific user agents (or via specific network intermediaries) that are | ||||
| deemed to be non-conforming, might be collecting additional data from | ||||
| specific source network locations due to prior security incidents, or | ||||
| might be compelled to disregard certain DNT requests to comply with a | ||||
| local law, regulation, or order. | ||||
| Issue 161: Do we need a tracking status value for partial compliance or | ||||
| rejecting DNT? | ||||
| [PENDING REVIEW] The D tracking status value indicates rejection. | ||||
| 5.2.9 Updated (U) | ||||
| A tracking status value of U means that the request resulted in a | ||||
| potential change to the tracking status applicable to this user, user | ||||
| agent, or device. A user agent that relies on a cached tracking status | ||||
| SHOULD update the cache entry with the current status by making a new | ||||
| request on the applicable tracking status resource. | ||||
| An origin server MUST NOT send U as a tracking status value anywhere other | ||||
| than a Tk header field that is in response to a state-changing request. | ||||
| 5.2.10 Non-compliant (!) | ||||
| A tracking status value of ! means that the origin server is unable or | ||||
| unwilling to claim that the designated resource conforms to the tracking | ||||
| protection protocol, but is providing a tracking response for the sake of | ||||
| testing and transparency. | ||||
| The ! value has been provided to ease testing and deployment on production | ||||
| systems during the initial periods of testing compliance and during | ||||
| adjustment periods due to future protocol changes or shifting regulatory | ||||
| constraints. Note that this value does not indicate that the DNT signal | ||||
| will be ignored, nor that tracking will occur as a result of accessing the | ||||
| designated resource, but rather that the site makes no claim to | ||||
| conformance at this time. | ||||
| This ! value MAY be followed by an optional testv character in order to | ||||
| communicate further information for testing, such as what tracking status | ||||
| the server intends to deploy for the designated resource at some point in | ||||
| the future, but that cannot be relied upon as an indication of | ||||
| conformance. | ||||
| Issue 161: Do we need a tracking status value for partial compliance or | ||||
| rejecting DNT? | ||||
| [PENDING REVIEW] The ! tracking status value indicates non-compliance in a | ||||
| format that conforms to the response syntax. | ||||
| 5.3 Tk Header Field for HTTP Responses | ||||
| 5.3.1 Definition | ||||
| The Tk response header field is hereby defined as an OPTIONAL means for | The Tk response header field is hereby defined as an OPTIONAL means for | |||
| indicating the tracking status that applied to the corresponding request | indicating the tracking status that applied to the corresponding request | |||
| and as a REQUIRED means for indicating that a state-changing request has | and as a REQUIRED means for indicating that a state-changing request has | |||
| resulted in an interactive change to the tracking status. | resulted in an interactive change to the tracking status. | |||
| Tk-field-name = "Tk" ; case-insensitive | Tk-field-name = "Tk" | |||
| Tk-field-value = tracking-v [tracking-q] [ ";" status-id ] | Tk-field-value = TSV [ ";" status-id ] | |||
| The Tk field-value begins with a tracking status value (section 5.2 | The Tk field-value begins with a tracking status value (section 5.2 | |||
| Tracking Status Value), optionally followed by one or more tracking | Tracking Status Value), optionally followed by a semicolon and a status-id | |||
| qualifiers (section 5.3 Tracking Status Qualifier Values), and then | that refers to a request-specific tracking status resource (section 5.3.2 | |||
| optionally a semicolon and a status-id that refers to a request-specific | Referring to a Request-specific Tracking Status Resource). | |||
| tracking status resource (section 5.4.2 Referring to a Request-specific | ||||
| Tracking Status Resource). | ||||
| For example, a Tk header field for a resource that claims not to be | For example, a Tk header field for a resource that claims not to be | |||
| tracking would look like: | tracking would look like: | |||
| Example 2 | Example 2 | |||
| Tk: N | Tk: N | |||
| whereas a Tk header field for a resource that might perform tracking | 5.3.2 Referring to a Request-specific Tracking Status Resource | |||
| (though not necessarily for every request) and conforms to the third-party | ||||
| requirements of [TRACKING-COMPLIANCE], while claiming the audit exception, | ||||
| would look like: | ||||
| Example 3 | ||||
| Tk: 3a | ||||
| 5.4.2 Referring to a Request-specific Tracking Status Resource | ||||
| If an origin server has multiple, request-specific tracking policies, such | If an origin server has multiple, request-specific tracking policies, such | |||
| that the tracking status might differ depending on some aspect of the | that the tracking status might differ depending on some aspect of the | |||
| request (e.g., method, target URI, header fields, data, etc.), the origin | request (e.g., method, target URI, header fields, data, etc.), the origin | |||
| server MAY provide an additional subtree of well-known resources | server MAY provide an additional subtree of well-known resources | |||
| corresponding to each of those distinct tracking statuses. The OPTIONAL | corresponding to each of those distinct tracking statuses. The OPTIONAL | |||
| status-id portion of the Tk field-value indicates which specific tracking | status-id portion of the Tk field-value indicates which specific tracking | |||
| status resource applies to the current request. | status resource applies to the current request. | |||
| status-id = 1*id-char ; case-sensitive | status-id = 1*id-char | |||
| id-char = ALPHA / DIGIT / "_" / "-" / "+" / "=" / "/" | id-char = ALPHA / DIGIT / "_" / "-" / "+" / "=" / "/" | |||
| For example, a response containing | For example, a response containing | |||
| Example 4 | Example 3 | |||
| Tk: 1;fRx42 | Tk: 1;fRx42 | |||
| indicates that the target resource claims to conform to the first-party | indicates that the target resource claims to conform to the first-party | |||
| requirements of [TRACKING-COMPLIANCE] and that an applicable tracking | requirements of [TRACKING-COMPLIANCE] and that an applicable tracking | |||
| status representation can be obtained by performing a retrieval request on | status representation can be obtained by performing a retrieval request on | |||
| /.well-known/dnt/fRx42 | /.well-known/dnt/fRx42 | |||
| If a Tk field-value has a tracking status value of X (dynamic), then a | If a Tk field-value has a tracking status value of X (dynamic), then a | |||
| status-id MUST be included in the field-value. | status-id MUST be included in the field-value. The status-id is | |||
| case-sensitive. | ||||
| 5.4.3 Indicating an Interactive Status Change | 5.3.3 Indicating an Interactive Status Change | |||
| We anticipate that interactive mechanisms might be used, beyond the scope | We anticipate that interactive mechanisms might be used, beyond the scope | |||
| of this specification, that have the effect of asking for and obtaining | of this specification, that have the effect of asking for and obtaining | |||
| prior consent for tracking, or for modifying prior indications of consent. | prior consent for tracking, or for modifying prior indications of consent. | |||
| For example, the tracking status resource's status-object defines a | For example, the tracking status resource's status-object defines an edit | |||
| control member that can refer to such a mechanism. Although such | member that can refer to such a mechanism. Although such out-of-band | |||
| out-of-band mechanisms are not defined by this specification, their | mechanisms are not defined by this specification, their presence might | |||
| presence might influence the tracking status object's response value. | influence the tracking status object's response value. | |||
| When an origin server provides a mechanism via HTTP for establishing or | When an origin server provides a mechanism via HTTP for establishing or | |||
| modifying out-of-band tracking preferences, the origin server MUST | modifying out-of-band tracking preferences, the origin server MUST | |||
| indicate within the mechanism's response when a state-changing request has | indicate within the mechanism's response when a state-changing request has | |||
| resulted in a change to the tracking status for that server. This | resulted in a change to the tracking status for that server. This | |||
| indication of an interactive status change is accomplished by sending a Tk | indication of an interactive status change is accomplished by sending a Tk | |||
| header field in the response with a tracking status value of U (updated). | header field in the response with a tracking status value of U (updated). | |||
| Example 5 | Example 4 | |||
| Tk: U | Tk: U | |||
| 5.5 Tracking Status Resource | 5.4 Tracking Status Resource | |||
| 5.5.1 Site-wide Tracking Status | 5.4.1 Site-wide Tracking Status | |||
| An origin server MUST provide a site-wide tracking status resource at the | An origin server MUST provide a site-wide tracking status resource at the | |||
| well-known identifier [RFC5785] | well-known identifier [RFC5785] | |||
| /.well-known/dnt | /.well-known/dnt/ | |||
| (relative to the URI of that origin server) for obtaining information | (relative to the URI of that origin server) for obtaining information | |||
| about the potential tracking behavior of resources provided by that origin | about the potential tracking behavior of resources provided by that origin | |||
| server. A tracking status resource MAY be used for verification of DNT | server. A tracking status resource can be used for verification of DNT | |||
| support, as described in section 5.7 Using the Tracking Status. | support, as described in section 5.6 Using the Tracking Status. | |||
| A valid retrieval request (e.g., a GET in HTTP) on the well-known URI MUST | A valid retrieval request (e.g., a GET in HTTP) on the well-known URI MUST | |||
| result in either a successful response containing a machine-readable | result in either a successful response containing a machine-readable | |||
| representation of the site-wide tracking status, as defined below, or a | representation of the site-wide tracking status, as defined below, or a | |||
| sequence of redirects that leads to such a representation. A user agent | sequence of redirects that leads to such a representation. A user agent | |||
| MAY consider failure to provide access to such a representation equivalent | MAY consider failure to provide access to such a representation equivalent | |||
| to the origin server not implementing this protocol. The representation | to the origin server not implementing this protocol. The representation | |||
| MAY be cached, as described in section 5.5.5 Caching. | can be cached, as described in section 5.4.5 Caching. | |||
| 5.5.2 Request-specific Tracking Status | 5.4.2 Request-specific Tracking Status | |||
| If an origin server has multiple, request-specific tracking policies, such | If an origin server has multiple, request-specific tracking policies, such | |||
| that the tracking status might differ depending on some aspect of the | that the tracking status might differ depending on some aspect of the | |||
| request (e.g., method, target URI, header fields, data, etc.), the origin | request (e.g., method, target URI, header fields, data, etc.), the origin | |||
| server MAY provide an additional subtree of well-known resources | server MAY provide an additional subtree of well-known resources | |||
| corresponding to each of those distinct tracking statuses. The Tk response | corresponding to each of those distinct tracking statuses. The Tk response | |||
| header field (section 5.4 Tk Header Field for HTTP Responses) can include | header field (section 5.3 Tk Header Field for HTTP Responses) can include | |||
| a status-id to indicate which specific tracking status resource applies to | a status-id to indicate which specific tracking status resource applies to | |||
| the current request. | the current request. | |||
| The tracking status resource space is defined by the following URI | The tracking status resource space is defined by the following URI | |||
| Template [URI-TEMPLATE]: | Template [URI-TEMPLATE]: | |||
| /.well-known/dnt{/status-id} | /.well-known/dnt/{+status-id} | |||
| where the value of status-id is a string of URI-safe characters provided | where the value of status-id is a string of URI-safe characters provided | |||
| by a Tk field-value in response to a prior request. For example, a prior | by a Tk field-value in response to a prior request. For example, a prior | |||
| response containing | response containing | |||
| Example 6 | Example 5 | |||
| Tk: 1;ahoy | Tk: 1;ahoy | |||
| refers to the specific tracking status resource | refers to the specific tracking status resource | |||
| /.well-known/dnt/ahoy | /.well-known/dnt/ahoy | |||
| Resources within the request-specific tracking status resource space are | Resources within the request-specific tracking status resource space are | |||
| represented using the same format as a site-wide tracking status resource. | represented using the same format as a site-wide tracking status resource. | |||
| 5.5.3 Representation | 5.4.3 Representation | |||
| The representation of a tracking status resource shall be provided in the | An origin server MUST provide a representation of each tracking status | |||
| "application/json" format [RFC4627] and MUST conform to the ABNF for | resource in the JSON format [RFC4627] that conforms to the ABNF for | |||
| status-object (except that the members within each member-list MAY be | status-object (except that the members within each member-list MAY be | |||
| provided in any order). | provided in any order). | |||
| The following example tracking status representation illustrates all of | The following example tracking status representation illustrates all of | |||
| the fields defined by this specification, most of which are optional. | the fields defined by this specification, most of which are optional. | |||
| Example 7 | Example 6 | |||
| { | { | |||
| "tracking": "1", | "tracking": "1", | |||
| "qualifiers": "afc", | ||||
| "controller": ["https://www.example.com/privacy"], | ||||
| "same-party": [ | "same-party": [ | |||
| "example.com", | "example.com", | |||
| "example_vids.net", | "example_vids.net", | |||
| "example_stats.com" | "example_stats.com" | |||
| ], | ], | |||
| "third-party": [ | "third-party": [ | |||
| "api.example.net" | "api.example.net" | |||
| ], | ], | |||
| "audit": [ | "audit": [ | |||
| "http://auditor.example.org/727073" | "http://auditor.example.org/727073" | |||
| ], | ], | |||
| "policy": "/tracking.html", | "policy": "/privacy.html#tracking", | |||
| "control": "http://example.com/your/data" | "edit": "http://example.com/your/data" | |||
| } | } | |||
| A tracking status representation consists of a single status-object | A tracking status representation consists of a single status-object | |||
| containing members that describe the tracking status applicable to the | containing members that describe the tracking status applicable to the | |||
| designated resource. | designated resource. | |||
| status-object = begin-object member-list end-object | status-object = begin-object member-list end-object | |||
| member-list = tracking ns tracking-v [tracking-q] | member-list = tracking ns tracking-v | |||
| [ vs qualifiers ns qualifiers-v ] | ||||
| [ vs controller ns controller-v ] | ||||
| [ vs same-party ns same-party-v ] | [ vs same-party ns same-party-v ] | |||
| [ vs third-party ns third-party-v ] | [ vs third-party ns third-party-v ] | |||
| [ vs audit ns audit-v ] | [ vs audit ns audit-v ] | |||
| [ vs policy ns policy-v ] | [ vs policy ns policy-v ] | |||
| [ vs control ns control-v ] | [ vs edit ns edit-v ] | |||
| *( vs extension ) | *( vs extension ) | |||
| A status-object MUST have a member named tracking that contains a single | A status-object always has a member named tracking with a string value | |||
| character tracking status value (section 5.2 Tracking Status Value), | that consists of the tracking status value applicable to the designated | |||
| optionally followed by one or more tracking qualifiers (section 5.3 | resource (section 5.2 Tracking Status Value). | |||
| Tracking Status Qualifier Values) . | ||||
| tracking = %x22 "tracking" %x22 | tracking = %x22 "tracking" %x22 | |||
| tracking-v = %x22 TSV %x22 | ||||
| For example, the following demonstrates a minimal tracking status | For example, the following demonstrates a minimal tracking status | |||
| representation that is applicable to any resource that does not perform | representation that is applicable to any resource that does not perform | |||
| tracking. | tracking. | |||
| Example 8 | Example 7 | |||
| {"tracking": "N"} | {"tracking": "N"} | |||
| An origin server MAY send a status-object member named qualifiers with a | ||||
| string value containing a sequence of case sensitive characters | ||||
| corresponding to each of the permitted uses (as defined in | ||||
| [TRACKING-COMPLIANCE]) that might be in use for the designated resource. | ||||
| The purpose of this field is to provide additional transparency where | ||||
| desired. | ||||
| qualifier meaning | ||||
| Audit: Tracking is limited to that necessary for an external | ||||
| a audit of the service context and the data collected is minimized | ||||
| accordingly. | ||||
| c Ad frequency capping: Tracking is limited to frequency capping | ||||
| and the data collected is minimized accordingly. | ||||
| Fraud prevention: Tracking is limited to that necessary for | ||||
| f preventing or investigating fraudulent behavior and security | ||||
| violations; the data collected is minimized accordingly. | ||||
| Local constraints: Tracking is limited to what is required by | ||||
| l local law, rule, or regulation and the data collected is | ||||
| minimized accordingly. | ||||
| r Referrals: Tracking is limited to collecting referral | ||||
| information and the data collected is minimized accordingly. | ||||
| Multiple qualifiers mean that multiple permitted uses of tracking might be | ||||
| present and that each such use conforms to the associated requirements. | ||||
| All qualifiers imply some form of tracking might be used and thus MUST NOT | ||||
| be provided with a tracking status value of N (not tracking). | ||||
| qualifiers = %x22 "qualifiers" %x22 | ||||
| qualifiers-v = %x22 0*5qualifier %x22 | ||||
| qualifier = %x61 ; "a" - audit | ||||
| / %x63 ; "c" - capping | ||||
| / %x66 ; "f" - fraud | ||||
| / %x6C ; "l" - local | ||||
| / %x72 ; "r" - referral | ||||
| Issue 136: Resolve dependencies of the TPE on the compliance specification | ||||
| [OPEN] The list of qualifiers is intended to match one to one to the | ||||
| permitted uses identified by [TRACKING-COMPLIANCE], using references to | ||||
| the definitions there. The list will then be updated accordingly. | ||||
| An origin server MAY send a member named controller with an array value | ||||
| containing a list of URI references indirectly identifying the party or | ||||
| set of parties that claims to be the responsible data controller for | ||||
| personal data collected via the designated resource. An origin server MUST | ||||
| send a controller member if the responsible data controller does not own | ||||
| the designated resource's domain name. | ||||
| An origin server that does not send controller is implying that its domain | ||||
| owner is the sole data controller; information about the data controller | ||||
| ought to be found on the designated resource's site root page, or by way | ||||
| of a clearly indicated link from that page (i.e., no controller member is | ||||
| considered equivalent to: "controller":["/"]). | ||||
| If the designated resource has joint data controllers (i.e., multiple | ||||
| parties have independent control over the collected data), the origin | ||||
| server MUST send a controller member that contains a reference for each | ||||
| data controller. | ||||
| Each URI reference provided in controller MUST refer to a resource that, | ||||
| if a retrieval action is performed on that URI, would provide the user | ||||
| with information regarding (at a minimum) the identity of the | ||||
| corresponding party and its data collection practices. | ||||
| controller = %x22 "controller" %x22 | ||||
| controller-v = array-of-strings | ||||
| An OPTIONAL member named same-party MAY be provided with an array value | An OPTIONAL member named same-party MAY be provided with an array value | |||
| containing a list of domain names that the origin server claims are the | containing a list of domain names that the origin server claims are the | |||
| same party, to the extent they are referenced by the designated resource, | same party, to the extent they are referenced by the designated resource, | |||
| since all data collected via those references share the same data | since all data collected via those references share the same data | |||
| controller. | controller as the designated resource. | |||
| same-party = %x22 "same-party" %x22 | same-party = %x22 "same-party" %x22 | |||
| same-party-v = array-of-strings | same-party-v = array-of-strings | |||
| An OPTIONAL member named third-party MAY be provided with an array value | An OPTIONAL member named third-party MAY be provided with an array value | |||
| containing a list of domain names for third-party services that might be | containing a list of domain names for third-party services that might be | |||
| invoked while using the designated resource but do not share the same data | invoked while using the designated resource but do not share the same data | |||
| controller as the designated resource. | controller as the designated resource. | |||
| third-party = %x22 "third-party" %x22 | third-party = %x22 "third-party" %x22 | |||
| third-party-v = array-of-strings | third-party-v = array-of-strings | |||
| An OPTIONAL member named audit MAY be provided with an array value | An OPTIONAL member named audit MAY be provided with an array value | |||
| containing a list of URI references to external audits of the designated | containing a list of URI references to external audits of the designated | |||
| resource's tracking policy and tracking behavior in compliance with this | resource's privacy policy and tracking behavior in compliance with this | |||
| protocol. Preferably, the audit references are to resources that describe | protocol. Preferably, the audit references are to resources that describe | |||
| the auditor and the results of that audit; however, if such a resource is | the auditor and the results of that audit; however, if such a resource is | |||
| not available, a reference to the auditor is sufficient. | not available, a reference to the auditor is sufficient. | |||
| audit = %x22 "audit" %x22 | audit = %x22 "audit" %x22 | |||
| audit-v = array-of-strings | audit-v = array-of-strings | |||
| An OPTIONAL member named policy MAY be provided with a string value | An OPTIONAL member named policy MAY be provided with a string value | |||
| containing a URI-reference to a human-readable document that describes the | containing a URI-reference to a human-readable document that describes the | |||
| tracking policy for the designated resource. The content of such a policy | relevant privacy policy for the designated resource. The content of such a | |||
| document is beyond the scope of this protocol and only supplemental to | policy document is beyond the scope of this protocol and only supplemental | |||
| what is described by this machine-readable tracking status representation. | to what is described in the machine-readable tracking status | |||
| representation. If no policy member is provided, this information might be | ||||
| obtained via the links provided in controller. | ||||
| policy = %x22 "policy" %x22 | policy = %x22 "policy" %x22 | |||
| policy-v = string ; URI-reference | policy-v = string ; URI-reference | |||
| If the tracking status value is 1 and the designated resource is being | An OPTIONAL member named edit MAY be provided with a string value | |||
| operated by an outsourced service provider on behalf of a first party, the | ||||
| origin server MUST identify the responsible first party via the domain of | ||||
| the policy URI, if present, or by the domain owner of the origin server. | ||||
| If no policy URI is provided and the origin server domain is owned by the | ||||
| service provider, then the service provider is the first party. | ||||
| An OPTIONAL member named control MAY be provided with a string value | ||||
| containing a URI-reference to a resource for giving the user control over | containing a URI-reference to a resource for giving the user control over | |||
| personal data collected by the designated resource (and possibly other | personal data collected by the designated resource (and possibly other | |||
| resources); a control member SHOULD be provided if the tracking status | resources); an edit member SHOULD be provided if the tracking status value | |||
| value indicates prior consent (C). Such a control resource might include | indicates prior consent (C). If no edit member is provided, this | |||
| the ability to review past data collected, delete some or all of the data, | information might be obtained via the links provided in controller or | |||
| provide additional data (if desired), or opt-in, opt-out, or otherwise | policy. | |||
| modify an out-of-band consent status regarding data collection. The design | ||||
| of such a resource, the extent to which it can provide access to that | ||||
| data, and how one might implement an out-of-band consent mechanism is | ||||
| beyond the scope of this protocol. | ||||
| control = %x22 "control" %x22 | An edit resource might include the ability to review past data collected, | |||
| control-v = string ; URI-reference | delete some or all of the data, provide additional data (if desired), or | |||
| opt-in, opt-out, or otherwise modify an out-of-band consent status | ||||
| regarding data collection. The design of such a resource, the extent to | ||||
| which it can provide access to that data, and how one might implement an | ||||
| out-of-band consent mechanism is beyond the scope of this protocol. | ||||
| edit = %x22 "edit" %x22 | ||||
| edit-v = string ; URI-reference | ||||
| Additional extension members MAY be provided in the status-object to | Additional extension members MAY be provided in the status-object to | |||
| support future enhancements to this protocol. A user agent SHOULD ignore | support future enhancements to this protocol. A user agent SHOULD ignore | |||
| extension members that it does not recognize. | extension members that it does not recognize. | |||
| extension = object | extension = object | |||
| array-of-strings = begin-array | array-of-strings = begin-array | |||
| [ string *( vs string ) ] | [ string *( vs string ) ] | |||
| skipping to change at line 918 | skipping to change at line 1053 | |||
| string = <string, as defined in [[!RFC4627]]> | string = <string, as defined in [[!RFC4627]]> | |||
| true = <true, as defined in [[!RFC4627]]> | true = <true, as defined in [[!RFC4627]]> | |||
| false = <false, as defined in [[!RFC4627]]> | false = <false, as defined in [[!RFC4627]]> | |||
| null = <null, as defined in [[!RFC4627]]> | null = <null, as defined in [[!RFC4627]]> | |||
| Note that the tracking status resource space applies equally to both | Note that the tracking status resource space applies equally to both | |||
| first-party and third-party services. An example of a third-party tracking | first-party and third-party services. An example of a third-party tracking | |||
| status is | status is | |||
| Example 9 | Example 8 | |||
| { | { | |||
| "tracking": "3", | "tracking": "3", | |||
| "policy": "/privacy.html", | "policy": "/privacy.html", | |||
| "control": "/your/data", | "edit": "/your/data", | |||
| } | } | |||
| 5.5.4 Status Checks are Not Tracked | Issue 164: To what extent should the same-party attribute of tracking | |||
| status resource be required? | ||||
| [OPEN] 3 Alternatives - text is needed: | ||||
| (A) Current draft: Resource is optional | ||||
| (B) Alternative proposal 1: If multiple domains on a page belong to the | ||||
| same party, then this fact SHOULD be declared using the same-party | ||||
| attribute | ||||
| (C) Alternative proposal 2: State that user agents MAY assume that | ||||
| additional elements that are hosted under a different URL and occur on a | ||||
| page and declare "intended for 1st party use" are malicious unless this | ||||
| URL is listed in the "same-party" attribute | ||||
| 5.4.4 Status Checks are Not Tracked | ||||
| When sending a request for the tracking status, a user agent SHOULD | When sending a request for the tracking status, a user agent SHOULD | |||
| include any cookie data [COOKIES] (set prior to the request) that would be | include any cookie data [COOKIES] (set prior to the request) that would be | |||
| sent in a normal request to that origin server, since that data might be | sent in a normal request to that origin server, since that data might be | |||
| needed by the server to determine the current tracking status. For | needed by the server to determine the current tracking status. For | |||
| example, the cookie data might indicate a prior out-of-band decision by | example, the cookie data might indicate a prior out-of-band decision by | |||
| the user to opt-out or consent to tracking by that origin server. | the user to opt-out or consent to tracking by that origin server. | |||
| All requests on the tracking status resource space, including the | All requests on the tracking status resource space, including the | |||
| site-wide tracking status resource, MUST NOT be tracked, irrespective of | site-wide tracking status resource, MUST NOT be tracked, irrespective of | |||
| the presence, value, or absence of a DNT header field, cookies, or any | the presence, value, or absence of a DNT header field, cookies, or any | |||
| other information in the request. In addition, all responses to those | other information in the request. In addition, all responses to those | |||
| requests, including the responses to redirected tracking status requests, | requests, including the responses to redirected tracking status requests, | |||
| MUST NOT have Set-Cookie or Set-Cookie2 header fields and MUST NOT have | MUST NOT have Set-Cookie or Set-Cookie2 header fields and MUST NOT have | |||
| content that initiates tracking beyond what was already present in the | content that initiates tracking beyond what was already present in the | |||
| request. A user agent SHOULD ignore, or treat as an error, any Set-Cookie | request. A user agent SHOULD ignore, or treat as an error, any Set-Cookie | |||
| or Set-Cookie2 header field received in such a response. | or Set-Cookie2 header field received in such a response. | |||
| 5.5.5 Caching | 5.4.5 Caching | |||
| If the tracking status is applicable to all users, regardless of the | If the tracking status is applicable to all users, regardless of the | |||
| received DNT-field-value or other data received via the request, then the | received DNT-field-value or other data received via the request, then the | |||
| response SHOULD be marked as cacheable and assigned a time-to-live | response SHOULD be marked as cacheable and assigned a time-to-live | |||
| (expiration or max-use) that is sufficient to enable shared caching but | (expiration or max-use) that is sufficient to enable shared caching but | |||
| not greater than the earliest point at which the service's tracking | not greater than the earliest point at which the service's tracking | |||
| behavior might increase. For example, if the tracking status response is | behavior might increase. For example, if the tracking status response is | |||
| set to expire in seven days, then the earliest point in time that the | set to expire in seven days, then the earliest point in time that the | |||
| service's tracking behavior can be increased is seven days after the | service's tracking behavior can be increased is seven days after the | |||
| policy has been updated to reflect the new behavior, since old copies | tracking status representation has been updated to reflect the new | |||
| might persist in caches until the expiration is triggered. A service's | behavior, since old copies might persist in caches until the expiration is | |||
| tracking behavior can be reduced at any time, with or without a | triggered. A service's tracking behavior can be reduced at any time, with | |||
| corresponding change to the tracking status resource. | or without a corresponding change to the tracking status resource. | |||
| If the tracking status is only applicable to all users that have the same | If the tracking status is only applicable to all users that have the same | |||
| DNT-field-value, then the response MUST either be marked with a Vary | DNT-field-value, then the response MUST either be marked with a Vary | |||
| header field that includes "DNT" in its field-value or marked as not | header field that includes "DNT" in its field-value or marked as not | |||
| reusable by a shared cache without revalidation with a Cache-Control | reusable by a shared cache without revalidation with a Cache-Control | |||
| header field containing one of the following directives: "private", | header field containing one of the following directives: "private", | |||
| "no-cache", "no-store", or "max-age=0". | "no-cache", "no-store", or "max-age=0". | |||
| If the tracking status is only applicable to the specific user that | If the tracking status is only applicable to the specific user that | |||
| requested it, then the response MUST include a Cache-Control header field | requested it, then the response MUST include a Cache-Control header field | |||
| skipping to change at line 983 | skipping to change at line 1131 | |||
| will check the tracking status of a service only once per session (at | will check the tracking status of a service only once per session (at | |||
| most). A public Internet site that intends to change its tracking status | most). A public Internet site that intends to change its tracking status | |||
| to increase tracking behavior MUST update the tracking status resource in | to increase tracking behavior MUST update the tracking status resource in | |||
| accordance with that planned behavior at least twenty-four hours prior to | accordance with that planned behavior at least twenty-four hours prior to | |||
| activating that new behavior on the service. | activating that new behavior on the service. | |||
| A user agent that adjusts behavior based on active verification of | A user agent that adjusts behavior based on active verification of | |||
| tracking status, relying on cached tracking status responses to do so, | tracking status, relying on cached tracking status responses to do so, | |||
| SHOULD check responses to its state-changing requests (e.g., POST, PUT, | SHOULD check responses to its state-changing requests (e.g., POST, PUT, | |||
| DELETE, etc.) for a Tk header field with the U tracking status value, as | DELETE, etc.) for a Tk header field with the U tracking status value, as | |||
| described in section 5.4.3 Indicating an Interactive Status Change. | described in section 5.3.3 Indicating an Interactive Status Change. | |||
| 5.6 Status Code for Tracking Required | 5.5 Status Code for Tracking Required | |||
| If an origin server receives a request with DNT:1, does not have | If an origin server receives a request with DNT:1, does not have | |||
| out-of-band consent for tracking this user, and wishes to deny access to | out-of-band consent for tracking this user, and wishes to deny access to | |||
| the requested resource until the user provides some form of user-granted | the requested resource until the user provides some form of user-granted | |||
| exception or consent for tracking, then the origin server SHOULD send an | exception or consent for tracking, then the origin server SHOULD send an | |||
| HTTP error response with a status code of 409 (Conflict) and a message | HTTP error response with a status code of 409 (Conflict) and a message | |||
| body that describes why the request has been refused and how one might | body that describes why the request has been refused and how one might | |||
| supply the required consent or exception to avoid this conflict [HTTP11]. | supply the required consent or exception to avoid this conflict [HTTP11]. | |||
| The 409 response SHOULD include a user authentication mechanism in the | The 409 response SHOULD include a user authentication mechanism in the | |||
| header fields and/or message body if user login is one of the ways through | header fields and/or message body if user login is one of the ways through | |||
| which access is granted. | which access is granted. | |||
| 5.7 Using the Tracking Status | 5.6 Using the Tracking Status | |||
| Note | Note | |||
| This section is for collecting use cases that describe questions a user | This section is for collecting use cases that describe questions a user | |||
| agent might have about tracking status and how the protocol can be used to | agent might have about tracking status and how the protocol can be used to | |||
| answer such questions. More cases are needed. | answer such questions. More cases are needed. | |||
| 5.7.1 Discovering Deployment | 5.6.1 Discovering Deployment | |||
| The presence of a site-wide tracking status representation is a claim that | Deployment of this protocol for a given service can be discovered by | |||
| the service conforms to this protocol for a given user agent. Hence, | ||||
| deployment of this protocol for a given service can be discovered by | ||||
| making a retrieval request on the site-wide tracking resource | making a retrieval request on the site-wide tracking resource | |||
| /.well-known/dnt relative to the service URI. | /.well-known/dnt/ relative to the service URI. | |||
| If the response is an error, then the service does not implement this | If the response is an error, then the service does not implement this | |||
| standard. If the response is a redirect, then follow the redirect to | standard. If the response is a redirect, then follow the redirect to | |||
| obtain the tracking status (up to some reasonable maximum of redirects to | obtain the tracking status (up to some reasonable maximum of redirects to | |||
| avoid misconfigured infinite request loops). If the response is | avoid misconfigured infinite request loops). If the response is | |||
| successful, obtain the tracking status representation from the message | successful, obtain the tracking status representation from the message | |||
| payload, if possible, or consider it an error. | payload, if possible, or consider it an error. | |||
| 5.7.2 Preflight Checks | 5.6.2 Preflight Checks | |||
| A key advantage of providing the tracking status at a resource separate | A key advantage of providing the tracking status at a resource separate | |||
| from the site's normal services is that the status can be accessed and | from the site's normal services is that the status can be accessed and | |||
| reviewed prior to making use of those services and prior to making | reviewed prior to making use of those services and prior to making | |||
| requests on third-party resources referenced by those services. | requests on third-party resources referenced by those services. | |||
| A user agent MAY check the tracking status for a designated resource by | A user agent MAY check the tracking status for a designated resource by | |||
| first making a retrieval request for the site-wide tracking status | first making a retrieval request for the site-wide tracking status | |||
| representation, as described above, and then parsing the representation as | representation, as described above, and then parsing the representation as | |||
| JSON to extract the Javascript status-object. If retrieval is unsuccessful | JSON to extract the status-object. If retrieval is unsuccessful or parsing | |||
| or parsing results in a syntax error, the user agent SHOULD consider the | results in a syntax error, the user agent SHOULD consider the site to be | |||
| site to be non-conformant with this protocol. | non-conformant with this protocol. | |||
| The status-object is supposed to have a member named tracking containing | The status-object is supposed to have a member named tracking containing | |||
| the tracking status value. The meaning of each tracking status value is | the tracking status value. The meaning of each tracking status value is | |||
| defined in section 5.2 Tracking Status Value. | defined in section 5.2 Tracking Status Value. | |||
| If the tracking status value is N, then the origin server claims that no | If the tracking status value is N, then the origin server claims that no | |||
| tracking is performed for the designated resource for at least the next 24 | tracking is performed for the designated resource for at least the next 24 | |||
| hours or until the Cache-Control information indicates that this response | hours or until the Cache-Control information indicates that this response | |||
| expires. | expires. | |||
| skipping to change at line 1057 | skipping to change at line 1203 | |||
| least the next 24 hours or until the Cache-Control information indicates | least the next 24 hours or until the Cache-Control information indicates | |||
| that this response expires. | that this response expires. | |||
| 6. User-Granted Exceptions | 6. User-Granted Exceptions | |||
| 6.1 Overview | 6.1 Overview | |||
| This section is non-normative. | This section is non-normative. | |||
| User-granted exceptions to Do Not Track, including site-specific | User-granted exceptions to Do Not Track, including site-specific | |||
| exceptions, are managed by the user agent. A resource should rely on the | exceptions, are agreed between the site and the user, and stored by the | |||
| DNT header it receives to determine the user's preference for tracking | user agent. A resource should rely on the DNT header it receives to | |||
| with respect to that particular request. An API is provided so that sites | determine the user's preference for tracking with respect to that | |||
| may request and check the status of exceptions for tracking. | particular request. An API is provided so that sites may request and check | |||
| the status of exceptions for tracking. | ||||
| We anticipate that many user-agents might provide a prompt to users when | ||||
| this API is used, or to store exceptions. Questions of user interface | ||||
| specifics - for granting, configuring, storing, syncing and revoking | ||||
| exceptions - are explicitly left open to implementers. | ||||
| Issue 144: What constraints on user agents should be imposed for | Note | |||
| user/granted exceptions | ||||
| [OPEN] but mostly addressed in the proposal here. | We envisage that the exceptions may also be usable as a consent mechanism. | |||
| 6.2 Motivating Principles and Use Cases | 6.2 Motivating Principles and Use Cases | |||
| This section is non-normative. | This section is non-normative. | |||
| The following principles guide the design of user-agent-managed | The following principles guide the design of user-agent-managed | |||
| exceptions. | exceptions. | |||
| * Content providers may wish to prompt visitors to their properties to | * Content providers may wish to prompt visitors to their properties to | |||
| opt back in to tracking for behavioral advertising or similar purposes | opt back in to tracking for behavioral advertising or similar purposes | |||
| skipping to change at line 1094 | skipping to change at line 1235 | |||
| managing preferences in a different way on every content provider or | managing preferences in a different way on every content provider or | |||
| tracker's privacy page. | tracker's privacy page. | |||
| * Granting an exception in one context (while browsing a news site) | * Granting an exception in one context (while browsing a news site) | |||
| should not apply that exception to other contexts (browsing a medical | should not apply that exception to other contexts (browsing a medical | |||
| site) that may not be expected. | site) that may not be expected. | |||
| * Tracking providers should not ever have to second-guess a user's | * Tracking providers should not ever have to second-guess a user's | |||
| expressed Do Not Track preference. | expressed Do Not Track preference. | |||
| * The solution should not require cross-domain communication between a | * The solution should not require cross-domain communication between a | |||
| first-party publisher and its third parties. | first-party publisher and its third parties. | |||
| When asking for a site-specific exception, the top-level domain making the | When asking for a site-specific exception, the top-level origin making the | |||
| request may be making some implicit or explicit claims as to the actions | request may be making some implicit or explicit claims as to the actions | |||
| and behavior of its third parties; for this reason, it might want to | and behavior of its third parties; for this reason, it might want to | |||
| establish exceptions for only those for which it is sure that those claims | establish exceptions for only those for which it is sure that those claims | |||
| are true. (Consider a site that has some trusted advertisers and analytics | are true. (Consider a site that has some trusted advertisers and analytics | |||
| providers, and some mashed-up content from less-trusted sites). For this | providers, and some mashed-up content from less-trusted sites). For this | |||
| reason, there is support both for explicitly named sites, as well as | reason, there is support both for explicitly named sites, as well as | |||
| support for granting an exception to all third-parties on a given site | support for granting an exception to all third-parties on a given site | |||
| (site-wide exception, using the conceptual wild-card "*"). | (site-wide exception, using the conceptual wild-card "*"). | |||
| There are some cases in which a user may desire a site to be allowed to | There are some cases in which a user may desire a site to be allowed to | |||
| track them on any top-level domain. An API is provided so that the site | track them on any top-level origin. An API is provided so that the site | |||
| and the user may establish such a web-wide exception. | and the user may establish such a web-wide exception. | |||
| 6.3 Exception model | 6.3 Exception model | |||
| 6.3.1 Introduction | 6.3.1 User Interaction | |||
| The call to store an exception MUST reflect the user's intention to grant | ||||
| an exception, at the time of the call. This intention MUST be determined | ||||
| by the site prior to each call to store an exception, at the time of the | ||||
| call. (This allows the user to change their mind, and delete a stored | ||||
| exception, which might then trigger the site to explain, and ask for, the | ||||
| exception again). It is the responsibility solely of the site making the | ||||
| call to determine that a call to record an exception reflects the user's | ||||
| informed consent at the time of the call. | ||||
| Issue 194: How should we ensure consent of users for DNT inputs? | ||||
| [OPEN] We agree that exceptions should reflect user consent and that this | ||||
| needs to be ensured before a site is permitted to register an exception. | ||||
| There is concern that the language above is insufficient to guarantee this | ||||
| desire. Potential language that is acceptable by the whole group is still | ||||
| under discussion. | ||||
| Sites MAY ask for an exception, and have it stored, even when the user's | ||||
| general preference is not enabled. (This permits recording a permission to | ||||
| allow tracking in jurisdictions where such permission cannot be assumed - | ||||
| see section 6.8 Exceptions without interactive JavaScript.) | ||||
| The user-agent MAY provide interfaces to the user: | ||||
| * To indicate that a call to store an exception has just been made; | ||||
| * To allow the user to confirm a user-granted exception prior to | ||||
| storage; | ||||
| * To indicate that one or more exceptions exist for the current | ||||
| top-level origin; | ||||
| * To indicate that one or more exceptions exist for sites incorporated | ||||
| into the current page; | ||||
| * To allow the user to see and possibly revoke stored exceptions; | ||||
| * Other aspects of the exception mechanism, as desired. | ||||
| There is no required user interface for the user agent; user agents MAY | ||||
| choose to provide no user interface regarding user-granted exceptions. | ||||
| Note | ||||
| The requirement for the site to determine the user's intention is new; | ||||
| previously the site was required to inform, but the final determination of | ||||
| intention was the responsibility of the UA. This version removes that | ||||
| split of user-determination, and leaves it solely with the site. | ||||
| 6.3.2 Processing Model | ||||
| This section describes the effect of the APIs in terms of a logical | This section describes the effect of the APIs in terms of a logical | |||
| processing model; this model describes the behavior, but should not be | processing model; this model describes the behavior, but should not be | |||
| read as mandating any specific implementation. | read as mandating any specific implementation. | |||
| This API considers exceptions which are double-keyed to two domains: the | This API considers exceptions which are double-keyed to two domains: the | |||
| site, and the target. A user might - for instance - want AnalytiCo to be | site, and the target. A user might - for instance - want AnalytiCo to be | |||
| allowed to track them on Example News, but not on Example Medical. To | allowed to track them on Example News, but not on Example Medical. To | |||
| simplify language used in this API specification, we define three terms: | simplify language used in this API specification, we define three terms: | |||
| * Top-Level Domain (TLD) is the domain name of the top-level document | * top-level origin is the domain name of the top-level document origin | |||
| origin of this DOM: essentially the fully qualified domain name in the | of this DOM: essentially the fully qualified domain name in the | |||
| address bar. | address bar. | |||
| * A target site is a domain name which is the target of an HTTP request, | * A target site is a domain name which is the target of an HTTP request, | |||
| and which may be an origin for embedded resources on the indicated | and which may be an origin for embedded resources on the indicated | |||
| top-level domain. | top-level origin. | |||
| * The document origin of a script is the domain of origin of the | * The document origin of a script is the domain of origin of the | |||
| document that caused that script to be loaded (not necessarily the | document that caused that script to be loaded (not necessarily the | |||
| same as the origin of the script itself). | same as the origin of the script itself). | |||
| For instance, if the document at | For instance, if the document at | |||
| http://web.exnews.com/news/story/2098373.html references the resources | http://web.exnews.com/news/story/2098373.html references the resources | |||
| http://exnews.analytico.net/1x1.gif and | http://exnews.analytico.net/1x1.gif and | |||
| http://widgets.exsocial.org/good-job-button.js, the top-level domain is | http://widgets.exsocial.org/good-job-button.js, the top-level origin is | |||
| web.exnews.com; exnews.analytico.net and widgets.exsocial.org are both | web.exnews.com; exnews.analytico.net and widgets.exsocial.org are both | |||
| targets. | targets. | |||
| Issue 112: How are sub-domains handled for site-specific exceptions? | Issue 112: How are sub-domains handled for site-specific exceptions? | |||
| [PENDING REVIEW] Should a request for a tracking exception apply to all | [PENDING REVIEW] In the current proposal a domain parameter allows | |||
| subdomains of the first party making the request? Or should a first party | exceptions to apply to sub-domains in the same way as cookies. | |||
| explicitly list the subdomains that it's asking for? Similarly, should | ||||
| third-party subdomains be allowed (e.g. *.tracker.com)? | ||||
| Proposal: Exceptions are requested for fully-qualified domain names. | ||||
| The domains that enter into the behavior of the APIs include: | The domains that enter into the behavior of the APIs include: | |||
| * As described above, the document origin active at the time of the | * As described above, the document origin active at the time of the | |||
| call, and; | call, and; | |||
| * Domain names passed to the API. | * Domain names passed to the API. | |||
| Domains that enter into the decision over what DNT header to be sent in a | Domains that enter into the decision over what DNT header to be sent in a | |||
| given HTTP request include: | given HTTP request include: | |||
| * The top-level domain of the current context; | * The top-level origin of the current context; | |||
| * The target of the HTTP request. | * The target of the HTTP request. | |||
| Note | Note | |||
| Note that these strict, machine-discoverable, concepts may not match the | Note that these strict, machine-discoverable, concepts may not match the | |||
| definitions of first and third party; in particular, sites themselves need | definitions of first and third party; in particular, sites themselves need | |||
| to determine (and signal) when they get 'promoted' to first party by | to determine (and signal) when they get 'promoted' to first party by | |||
| virtue of user interaction; the UA will not change the DNT header it sends | virtue of user interaction; the UA will not change the DNT header it sends | |||
| them. | them. | |||
| The calls cause the following steps to occur: | The calls cause the following steps to occur (subject to user confirmation | |||
| of the exception, if the user-agent asks for it): | ||||
| * First, the UA somehow confirms with the user that they agree to the | * The UA adds to its local database one or more site-pair duplets | |||
| grant of exception, if not already granted; | [document-origin, target]; one or other of these may be a wild-card | |||
| * If they agree, then the UA adds to its local database one or more | ("*"); | |||
| site-pair duplets [document-origin, target]; one or other of these may | * While the user is browsing a given site (top-level origin), and a DNT | |||
| be a wild-card ("*"); | ||||
| * While the user is browsing a given site (top-level domain), and a DNT | ||||
| header is to be sent to a target domain, if the duplet [top-level | header is to be sent to a target domain, if the duplet [top-level | |||
| domain, target domain] matches any duplet in the database, then a | origin, target domain] matches any duplet in the database, then a | |||
| DNT:0 header is sent, otherwise DNT:1 is sent. | DNT:0 header is sent, otherwise DNT:1 is sent. | |||
| Note | ||||
| Note that a site may record no that it has previously asked for, and been | A pair of duplets [A,B] and [X,Y] match if A matches X and B matches Y. A | |||
| denied, an exception, if it wishes to avoid repeatedly asking the user for | pair of values A and X match if and only if one of the following is true: | |||
| an exception. | ||||
| 6.3.2 Exception use by browsers | * either A or X is "*"; | |||
| * A and X are the same string; | ||||
| * A has the form '*.domain' and X is 'domain' or is of the form | ||||
| 'string.domain', where 'string' is any sequence of characters. | ||||
| If a user agrees to allow tracking by a target on the top-level domain, | In addition, responses to the JavaScript API indicated should be | |||
| this should result in two user-agent behaviors: | consistent with this user preference (see below). | |||
| Note | ||||
| The prior version of this required that the UA "somehow confirms with the | ||||
| user that they agree to the grant of exception, if not already granted" | ||||
| 1. If requests to the target for resources that are part of the DOM for | ||||
| pages on top-level domain include a DNT header, that header MUST be | ||||
| DNT:0. | ||||
| 2. Responses to the JavaScript API indicated should be consistent with | ||||
| this user preference (see below). | ||||
| Issue 159: How do we allow sites that mash-in ad-supported content to | Issue 159: How do we allow sites that mash-in ad-supported content to | |||
| maintain their own trusted third parties? | maintain their own trusted third parties? | |||
| This model does not support mashed-up content which is in turn supported | [POSTPONED] This model does not support mashed-up content which is in turn | |||
| by ads; it's not clear how to distinguish between embedded content which | supported by ads; it's not clear how to distinguish between embedded | |||
| is embedding ads (and hence the top-level domain stays the same) and | content which is embedding ads (and hence the top-level origin stays the | |||
| embedded content that should start a new context. | same) and embedded content that should start a new context. | |||
| Proposal: For this version of the specification, we don't address this | Proposal: For this version of the specification, we don't address this | |||
| corner case. | corner case. | |||
| User-agents MUST handle each API request as a 'unit', granting and | User-agents MUST handle each API request as a 'unit', granting and | |||
| maintaining it in its entirety, or not at all. That means that a | maintaining it in its entirety, or not at all. That means that a | |||
| user-agent MUST NOT indicate to a site that a request for targets {a, b, | user-agent MUST NOT indicate to a site that a request for targets {a, b, | |||
| c} has been granted, and later remove only one or two of {a, b, c} from | c} exists in the database, and later remove only one or two of {a, b, c} | |||
| its logical database of remembered grants. This assures sites that the set | from its logical database of remembered grants. This assures sites that | |||
| of sites they need for operational integrity is treated as a unit. Each | the set of sites they need for operational integrity is treated as a unit. | |||
| separate call to an API is a separate unit. | Each separate call to an API is a separate unit. | |||
| When a user-agent receives an API request for an exception that already | ||||
| exists (i.e. the grant is recorded in its database), it SHOULD bypass | ||||
| asking the user to confirm, and simply re-confirm the grant to the caller. | ||||
| Note | Note | |||
| It is left up to individual user-agent implementations how to determine | It is left up to individual user-agent implementations how to determine | |||
| and how and whether to store users' tracking preferences. | and how and whether to store users' tracking preferences. | |||
| When an explicit list of domains is provided through the API, their names | When an explicit list of domains is provided through the API, their names | |||
| might mean little to the user. The user might, for example, be told that | might mean little to the user. The user might, for example, be told that | |||
| such-and-such top-level domain is asking for an exception for a specific | there is a stored exception for a specific set of sites on such-and-such | |||
| set of sites, rather than listing them by name; or the user-agent may | top-level origin, rather than listing them by name; or the user-agent may | |||
| decide to ask the user for a site-wide exception, effectively ignoring the | decide to store, and show to the user, a site-wide exception, effectively | |||
| list of domain names, if supplied. | ignoring the list of domain names, if supplied. | |||
| Conversely, if a wild-card is used, the user may be told that the | Conversely, if a wild-card is used, the user may be told that there is a | |||
| top-level domain is asking for an exception for all third-parties that | stored exception for all third-parties that are, or will be, embedded on | |||
| are, or will be, embedded in it. | the indicated the top-level origin. | |||
| Issue 111: Different DNT values to signify existence of user-granted | Issue 151: User Agent Requirement: Be able to handle an exception request | |||
| exception | ||||
| [POSTPONED] Should the user agent send a different DNT value to a first | [OPEN] There is software that in just a few lines of code just spawn DNT;1 | |||
| party site if there exist user-granted exceptions for that first party? | or DNT;0 headers regardless of user's will. A requirement on the user | |||
| (e.g. DNT:2 implies "I have Do Not Track enabled but grant permissions to | agent that they can handle the full exception mechanism will allow to | |||
| some third parties while browsing this domain") | discard compliance statements by those agents. It will also allow also the | |||
| Proposal: A previous proposal was that it can add itself to the list (i.e. | site to test for conformance by requiring an exception. In case the UA | |||
| an exception for [site, site]) and then it will get DNT:0, but DNT:0 to a | does not react on an exception request, the server could ignore DNT | |||
| first party means something different (that it can pass data to third | signals from that UA. It would allow thus testing from the horizon of the | |||
| parties, and tracking is permitted). It would be better to have an | site without wild guessing; | |||
| indication in the DNT header that one or more site-specific exceptions | However, there is no practical difference between a UA that hard-wires | |||
| exist for the given target (i.e. that there is at least one duplet in the | 'no' to all exception requests, and a UA that does not implement the | |||
| database with target as its first host name), for example "DNT:1E" where E | calls. | |||
| means you are a first party with one or more active exceptions. | ||||
| Issue 167: Multiple site exceptions | ||||
| [PENDING REVIEW] The current assumption is that the best practice is to | ||||
| use frames. | ||||
| 6.4 JavaScript API for Site-specific Exceptions | 6.4 JavaScript API for Site-specific Exceptions | |||
| 6.4.1 API to request site-specific exceptions | 6.4.1 API to Request a Site-specific Exception | |||
| [NoInterfaceObject] | partial interface Navigator { | |||
| interface NavigatorDoNotTrack { | void storeSiteSpecificTrackingException (StoreSiteSpecificExceptionProper | |||
| void requestSiteSpecificTrackingException ( | tyBag properties); | |||
| TrackingResponseCallback callback, | ||||
| optional sequence<DOMString> arrayOfDomainStrings, | ||||
| optional optional siteName, | ||||
| optional optional explanationString, | ||||
| optional optional detailURI | ||||
| ); | ||||
| }; | }; | |||
| requestSiteSpecificTrackingException | storeSiteSpecificTrackingException | |||
| Called by a page to request or confirm a user-granted tracking | Called by a page to store a site-specific tracking exception. | |||
| exception. | ||||
| Parameter Type Nullable Optional Descripti | Parameter Type Nullable Optional Descripti | |||
| on | on | |||
| callback TrackingResponseCallback * * | properties StoreSiteSpecificExceptionPropertyBag * * | |||
| arrayOfDomainStrings sequence<DOMString> * * | ||||
| siteName optional * * | ||||
| explanationString optional * * | ||||
| detailURI optional * * | ||||
| Return type: void | Return type: void | |||
| [Callback, NoInterfaceObject] | dictionary StoreExceptionPropertyBag { | |||
| interface TrackingResponseCallback { | DOMString? domain; | |||
| void handleEvent (integer granted); | DOMString? siteName; | |||
| DOMString? explanationString; | ||||
| DOMString? detailURI; | ||||
| }; | }; | |||
| handleEvent | detailURI of type DOMString, nullable | |||
| The callback is called by the user agent to indicate the user's | A location at which further information about this request can be | |||
| response. | found. | |||
| Parameter Type Nullable Optional Description | domain of type DOMString, nullable | |||
| granted integer * * | Cookie-like domain string to which the exception applies. | |||
| Return type: void | explanationString of type DOMString, nullable | |||
| A short explanation of the request. | ||||
| The requestSiteSpecificTrackingException method takes one mandatory | siteName of type DOMString, nullable | |||
| argument: | A user-readable string for the name of the top-level origin. | |||
| * callback, a method that will be called when the request is complete. | dictionary StoreSiteSpecificExceptionPropertyBag : StoreExceptionPropertyBag | |||
| { | ||||
| sequence<DOMString> arrayOfDomainStrings; | ||||
| }; | ||||
| It also takes four optional arguments: | arrayOfDomainStrings of type sequence<DOMString> | |||
| A JavaScript array of strings. | ||||
| * arrayOfDomainStrings, a JavaScript array of strings, | The storeSiteSpecificTrackingException method takes a dictionary argument | |||
| * siteName, a user-readable string for the name of the top-level domain, | of type StoreSiteSpecificExceptionPropertyBag that allows optional | |||
| * explanationString, a short explanation of the request, and | information to be provided. | |||
| * detailURI, a location at which further information about this request | ||||
| can be found. | ||||
| If the request does not include the arrayOfDomainStrings, then this | If the request does not include the arrayOfDomainStrings, then this | |||
| request is for a site-wide exception. Otherwise each string in | request is for a site-wide exception. Otherwise each string in | |||
| arrayOfDomainStrings specifies a target. When called, | arrayOfDomainStrings specifies a target. When called, | |||
| requestSiteSpecificTrackingException MUST return immediately, then | storeSiteSpecificTrackingException MUST return immediately. | |||
| asynchronously determine whether the user grants the requested | ||||
| exception(s). | ||||
| If the list arrayOfDomainStrings is supplied, the user-agent MAY choose to | If the list arrayOfDomainStrings is supplied, the user-agent MAY choose to | |||
| ask the user to grant a site-wide exception. If it does so, and the user | store a site-wide exception. If it does so it MUST indicate this in the | |||
| agrees, it MUST indicate this in the response callback. | return value. | |||
| The execution of this API and the use of the resulting permission (if | ||||
| granted) use the 'implicit' parameter, when the API is called, the | ||||
| document origin. This forms the first part of the duplet in the logical | ||||
| model, and hence in operation will be compared with the top-level domain. | ||||
| The granted parameter passed to the callback is the user's response; The | ||||
| response | ||||
| * 0 indicates that user does not grant the exception on top-level domain | If domain is not specified or is null or empty then the execution of this | |||
| for the indicated targets. | API and the use of the resulting permission (if granted) use the | |||
| * 1 indicates that the request was for specific targets and the the user | 'implicit' parameter, when the API is called, the document origin. This | |||
| grants an exception on top-level domain for those specific targets. | forms the first part of the duplet in the logical model, and hence in | |||
| * 2 indicates the user grants a site-wide exception on top-level domain | operation will be compared with the top-level origin. | |||
| for all targets; the request may have been for specific targets or for | ||||
| a site-wide exception. | ||||
| If permission is granted for an explicit list, then the set of duplets | If permission is stored for an explicit list, then the set of duplets (one | |||
| (one per target): | per target): | |||
| [document-origin, target] | [document-origin, target] | |||
| is added to the database of remembered grants. | is added to the database of remembered grants. | |||
| If permission is granted for a site-wide exception, then the duplets: | If permission is stored for a site-wide exception, then the duplet: | |||
| [document-origin, * ] | [document-origin, * ] | |||
| is added to the database of remembered grants. | is added to the database of remembered grants. | |||
| If domain is supplied and not empty then it is treated in the same way as | ||||
| the domain parameter to cookies and allows setting for subdomains. The | ||||
| domain argument can be set to fully-qualified right-hand segment of the | ||||
| document host name, up to one level below TLD. | ||||
| Note | ||||
| For example, www.foo.bar.example.com may set the domain parameter as as | ||||
| "bar.example.com" or "example.com", but not to | ||||
| "something.else.example.com" or "com". | ||||
| If the document-origin would not be permitted to set a cookie on the | ||||
| domain following the cookie domain rules [COOKIES] (e.g. domain is not a | ||||
| right-hand match or is a TLD) then the duplet MUST not be entered into the | ||||
| database and a SYNTAX_ERR exception should be thrown. | ||||
| If permission is stored for an explicit list, then the set of duplets (one | ||||
| per target): | ||||
| [*.domain, target] | ||||
| is added to the database of remembered grants. | ||||
| If permission is stored for a site-wide exception, then the duplet: | ||||
| [*.domain, * ] | ||||
| is added to the database of remembered grants. | ||||
| A particular response to the API - like a DNT response header - is only | A particular response to the API - like a DNT response header - is only | |||
| valid immediately, and users' preferences may change. | valid immediately, and users may choose to edit the list of stored | |||
| exceptions and revoke some or all of them. | ||||
| A user agent MAY use an interactive method to ask the user about their | Note | |||
| preferences, so sites SHOULD NOT assume that the callback function will be | ||||
| called immediately. | The prior version of this call was asynchronous with a call-back; the | |||
| change to require the site to determine the user's wishes, rather than the | ||||
| UA, enabled this to become synchronous. This is simpler; the user-agent | ||||
| may still ask for the user's approval. Sites wishing to know whether an | ||||
| exception stands, or the DNT header that they would receive, should call | ||||
| the appropriate enquiry API. | ||||
| 6.4.2 API to Cancel a Site-specific Exception | 6.4.2 API to Cancel a Site-specific Exception | |||
| [NoInterfaceObject] | partial interface Navigator { | |||
| interface NavigatorDoNotTrack { | void removeSiteSpecificTrackingException (RemoveExceptionPropertyBag prop | |||
| boolean removeSiteSpecificTrackingException (); | erties); | |||
| }; | }; | |||
| removeSiteSpecificTrackingException | removeSiteSpecificTrackingException | |||
| Ensures that the database of remembered grants no longer contains | ||||
| any duplets for which the first part is the current document | If domain is not supplied or is null or empty then this ensures | |||
| origin; i.e., no duplets [document-origin, target] for any target. | that the database of remembered grants no longer contains any | |||
| duplets for which the first part is the current document origin; | ||||
| i.e., no duplets [document-origin, target] for any target. | ||||
| If domain is supplied and is not empty then this ensures that the | ||||
| database of remembered grants no longer contains any duplets for | ||||
| which the first part is the domain wildcard; i.e., no duplets | ||||
| [*.domain, target] for any target. | ||||
| There is no callback. After the call has been made, it is assured | There is no callback. After the call has been made, it is assured | |||
| that there are no site-specific or site-wide exceptions for the | that there are no site-specific or site-wide exceptions for the | |||
| given top-level-domain. | given top-level origin. | |||
| No parameters. | ||||
| Parameter Type Nullable Optional Description | ||||
| properties RemoveExceptionPropertyBag * * | ||||
| Return type: void | ||||
| dictionary RemoveExceptionPropertyBag { | ||||
| DOMString? domain; | ||||
| }; | ||||
| domain of type DOMString, nullable | ||||
| Cookie-like domain string to which the exception applies. | ||||
| When this method returns the database of grants no longer contains the | ||||
| indicated grant(s); if some kind of processing error occurred then an | ||||
| appropriate exception will be thrown. | ||||
| Note | ||||
| If there are no matching duplets in the database of remembered grants when | ||||
| the method is called then this operation does nothing (and does not throw | ||||
| an exception). | ||||
| 6.4.3 API to Confirm a Site-specific Exception | ||||
| partial interface Navigator { | ||||
| boolean confirmSiteSpecificTrackingException (ConfirmSiteSpecificExceptio | ||||
| nPropertyBag properties); | ||||
| }; | ||||
| confirmSiteSpecificTrackingException | ||||
| Called by a page to confirm a site-specific tracking exception. | ||||
| Parameter Type Nullable Optional Descripti | ||||
| on | ||||
| properties ConfirmSiteSpecificExceptionPropertyBag * * | ||||
| Return type: boolean | Return type: boolean | |||
| This returns a boolean indicating, when true, that the call has succeeded, | dictionary ConfirmExceptionPropertyBag { | |||
| and that the database of grants no longer contains, or very soon will no | DOMString? domain; | |||
| longer contain, the indicated grant(s); when false, some kind of | }; | |||
| processing error occurred. | ||||
| domain of type DOMString, nullable | ||||
| Cookie-like domain string to which the exception applies. | ||||
| dictionary ConfirmSiteSpecificExceptionPropertyBag : ConfirmExceptionProperty | ||||
| Bag { | ||||
| sequence<DOMString> arrayOfDomainStrings; | ||||
| }; | ||||
| arrayOfDomainStrings of type sequence<DOMString> | ||||
| A JavaScript array of strings. | ||||
| If the call does not include the arrayOfDomainStrings, then this call is | ||||
| to confirm a site-wide exception. Otherwise each string in | ||||
| arrayOfDomainStrings specifies a target. | ||||
| If the list arrayOfDomainStrings is supplied, and the user-agent stores | ||||
| only site-wide exceptions, then the user-agent MUST match by confirming a | ||||
| site-wide exception. | ||||
| If the domain argument is not supplied or is null or empty then the | ||||
| execution of this API uses the 'implicit' parameter, when the API is | ||||
| called, the document origin. This forms the first part of the duplet in | ||||
| the logical model. | ||||
| If the user-agent stores explicit lists, and the call includes one, the | ||||
| database is checked for the existence of all the duplets (one per target): | ||||
| [document-origin, target] | ||||
| If the user-agent stores only site-wide exceptions or the call did not | ||||
| include an explicit list, the database is checked for the single duplet: | ||||
| [document-origin, * ] | ||||
| If the user-agent stores explicit lists, and the call includes one, and | ||||
| the domain argument is provided and is not empty then the database is | ||||
| checked for the existence of all the duplets (one per target): | ||||
| [*.domain, target] | ||||
| If the user-agent stores only site-wide exceptions or the call did not | ||||
| include an explicit list, and the domain argument is provided and is not | ||||
| empty then the database is checked for the single duplet: | ||||
| [*.domain, * ] | ||||
| The returned boolean has the following possible values: | ||||
| * true all the duplets exist in the database; | ||||
| * false one or more of the duplets does not exist in the database. | ||||
| 6.5 JavaScript API for Web-wide Exceptions | 6.5 JavaScript API for Web-wide Exceptions | |||
| 6.5.1 API to Request a Web-wide Exception | 6.5.1 API to Request a Web-wide Exception | |||
| [NoInterfaceObject] | partial interface Navigator { | |||
| interface NavigatorDoNotTrack { | void storeWebWideTrackingException (StoreExceptionPropertyBag properties) | |||
| void requestWebWideTrackingException ( | ; | |||
| TrackingResponseCallback callback, | ||||
| optional siteName, | ||||
| optional optional explanationString, | ||||
| optional optional detailURI | ||||
| ); | ||||
| }; | }; | |||
| requestWebWideTrackingException | storeWebWideTrackingException | |||
| If permission is granted, then the single duplet [ * , | The single duplet [ * , document-origin] or [ * , *.domain] (based | |||
| document-origin] is added to the database of remembered grants. | on if domain is provided and is not null and not empty) is added | |||
| The parameters are as described above in the request for | to the database of remembered grants. The members of the | |||
| site-specific exceptions. | StoreExceptionPropertyBag dictionary are as described above in the | |||
| request for site-specific exceptions. | ||||
| Parameter Type Nullable Optional Descripti | Parameter Type Nullable Optional Description | |||
| on | properties StoreExceptionPropertyBag * * | |||
| callback TrackingResponseCallback * * | ||||
| siteName * * | ||||
| explanationString optional * * | ||||
| detailURI optional * * | ||||
| Return type: void | Return type: void | |||
| Users may wish to configure exceptions for a certain trusted tracker | This API requests the addition of a web-wide grant for a specific site, to | |||
| across all sites. This API requests the addition of a web-wide grant for a | the database. | |||
| specific site, to the database. | ||||
| 6.5.2 API to cancel a web-wide exception | Note | |||
| [NoInterfaceObject] | As above, this call used to be asynchronous, and the change to the UI | |||
| interface NavigatorDoNotTrack { | enabled it to be synchronous. | |||
| boolean removeWebWideTrackingException (); | ||||
| 6.5.2 API to Cancel a Web-wide Exception | ||||
| partial interface Navigator { | ||||
| void removeWebWideTrackingException (RemoveExceptionPropertyBag propertie | ||||
| s); | ||||
| }; | }; | |||
| removeWebWideTrackingException | removeWebWideTrackingException | |||
| Ensures that the database of remembered grants no longer contains | Ensures that the database of remembered grants no longer contains | |||
| the duplet [ * , document-origin]. There is no callback. After the | the duplet [ * , document-origin] or [ * , *.domain] (based on if | |||
| call has been made, the indicated pair is assured not to be in the | domain is provided and is not null and not empty). There is no | |||
| database. The same matching as is used for determining which | callback. After the call has been made, the indicated pair is | |||
| header to send is used to detect which entry (if any) to remove | assured not to be in the database. The same matching as is used | |||
| from the database. | for determining which header to send is used to detect which entry | |||
| No parameters. | (if any) to remove from the database. | |||
| Return type: boolean | ||||
| This returns a boolean indicating, when true, that the call has succeeded, | ||||
| and that the database of grants no longer contains, or very soon will no | ||||
| longer contain, the indicated grant; when false, some kind of processing | ||||
| error occurred. | ||||
| 6.6 Querying a host's exception status | Parameter Type Nullable Optional Description | |||
| properties RemoveExceptionPropertyBag * * | ||||
| Issue 160: Do we need an exception-query API? | Return type: void | |||
| [PENDING REVIEW] It might be useful, and 'complete the model', if we had a | 6.5.3 API to Confirm a Web-wide Exception | |||
| JS API that told a host what its current exception status is in a given | ||||
| context. See proposal here. | ||||
| Proposal: Specifically, an API QueryExceptionStatus() which examines the | ||||
| document origin of the script, the current top-level domain and returns an | ||||
| empty string if no DNT header would be sent to that document origin, or | ||||
| the exact DNT header (DNT:1 or DNT:0) that would be sent otherwise. | ||||
| [NoInterfaceObject] | partial interface Navigator { | |||
| interface NavigatorDoNotTrack { | boolean confirmWebWideTrackingException (ConfirmExceptionPropertyBag prop | |||
| DOMString requestDNTStatus (); | erties); | |||
| }; | }; | |||
| requestDNTStatus | confirmWebWideTrackingException | |||
| Returns the same string value that would be sent in a | ||||
| DNT-field-value (section 4.2 DNT Header Field for HTTP Requests) | ||||
| to a target that is the document-origin of the request, in the | ||||
| context of the current top-level domain. If no DNT header would be | ||||
| sent (e.g. because a tracking preference is not enabled) the | ||||
| return value is null. | ||||
| No parameters. | ||||
| Return type: DOMString | ||||
| 6.7 Transfer of an exception to another third party | Parameter Type Nullable Optional Descriptio | |||
| n | ||||
| properties ConfirmExceptionPropertyBag * * | ||||
| Return type: boolean | ||||
| This API confirms the existence of a web-wide grant for a specific site, | ||||
| in the database. | ||||
| The returned boolean indicates whether the duplet [ * , document-origin] | ||||
| or [ * , *.domain] (based on if domain is provided and is not null and not | ||||
| empty) exists in the database. | ||||
| * true indicates that the web-wide exception exists; | ||||
| * false indicates that the web-wide exception does not exist. | ||||
| 6.6 Transfer of an exception to another third party | ||||
| A site may request an exception for one or more third party services used | A site may request an exception for one or more third party services used | |||
| in conjunction with its own offer. Those third party services may wish to | in conjunction with its own offer. Those third party services may wish to | |||
| use other third parties to complete the request in a chain of | use other third parties to complete the request in a chain of | |||
| interactions. The first party will not necessarily know in advance whether | interactions. The first party will not necessarily know in advance whether | |||
| a known third party will use some other third parties. | a known third party will use some other third parties. | |||
| If a user-agent sends a tracking exception to a given combination of | If a user-agent sends a tracking exception to a given combination of | |||
| origin server and a named third party, the user agent will send DNT:0 to | origin server and a named third party, the user agent will send DNT:0 to | |||
| that named third party. By receiving the DNT:0 header, the named third | that named third party. By receiving the DNT:0 header, the named third | |||
| skipping to change at line 1501 | skipping to change at line 1778 | |||
| the use of the appropriate tracking status value and qualifier, which is | the use of the appropriate tracking status value and qualifier, which is | |||
| "XX" (such as "tl"), from its sub-sub-services. | "XX" (such as "tl"), from its sub-sub-services. | |||
| The permission acquired by the DNT mechanism does not override retention | The permission acquired by the DNT mechanism does not override retention | |||
| limitations found in the legal system the content provider or the named | limitations found in the legal system the content provider or the named | |||
| third party are operating in. | third party are operating in. | |||
| Issue 168: What is the correct way for sub-services to signal that they | Issue 168: What is the correct way for sub-services to signal that they | |||
| are taking advantage of a transferred exception? | are taking advantage of a transferred exception? | |||
| When the status values and qualifiers are fixed, the penultimate paragraph | [OPEN] When the status values and qualifiers are fixed, the penultimate | |||
| will probably need adjusting to match. The use of "tl" (which meant | paragraph will probably need adjusting to match. The use of "tl" (which | |||
| "tracking but only in accordance with local laws" when this text was | meant "tracking but only in accordance with local laws" when this text was | |||
| written) doesn't seem right, as the text talks, essentially, of the | written) doesn't seem right, as the text talks, essentially, of the | |||
| sub-sub-service acting on behalf of the site that received the DNT:0 | sub-sub-service acting on behalf of the site that received the DNT:0 | |||
| header, which might suggest something more like "CS" (service provision to | header, which might suggest something more like "CS" (service provision to | |||
| a third-party that received consent). | a third-party that received consent). | |||
| 6.8 User interface guidelines | 6.7 User interface guidelines | |||
| This section is non-normative. | This section is non-normative. | |||
| User agents are free to implement exception management user interfaces as | As described above, it is the responsibility solely of the site making the | |||
| they see fit. Some agents might provide a prompt to the user at the time | call to determine that an exception grant reflects the user's informed | |||
| of the request. Some agents might allow users to configure this preference | consent at the time of the call. | |||
| in advance. In either case, the user agent responds with the user's | ||||
| preference. | ||||
| In general, it is expected that the site will explain, in its online | ||||
| content, the need for an exception, and the consequences of granting or | ||||
| denying an exception, to the user, and guide. The call to the API and the | ||||
| resulting request for user confirmation should not be a 'surprise' to the | ||||
| user, or require much explanation on the part of the user-agent. | ||||
| A user agent that chooses to implement a prompt to present tracking | ||||
| exception requests to the user might provide an interface like the | ||||
| following: | ||||
| Example 10 | ||||
| Example News (web.exnews.com) would like to confirm | ||||
| that you permit tracking by a specific set of sites (click | ||||
| here for their names). | ||||
| Example News says: | ||||
| These sites allow Example News to see how we're | ||||
| doing, and provide useful features of the Example News | ||||
| experience. [More info] | ||||
| [Allow Tracking] [Deny Tracking Request] | It is expected that the site will explain, in its online content, the need | |||
| for an exception, and the consequences of granting or denying an | ||||
| exception, to the user. | ||||
| In this example, the domains listed are those specified in | User agents are free to implement exception management user interfaces as | |||
| arrayOfDomainStrings, the phrase Example News is from siteName, and the | they see fit. Some agents might provide a notification to the user at the | |||
| explanationString is displayed for the user with a More info link pointing | time of the request, or even not complete the storing of the exception | |||
| to detailURI. | until the user approves. Some agents might provide a user-interface to see | |||
| and edit the database of recorded exception grants. The API parameters | ||||
| siteName, explanationString, and detailURI are provided so that the | ||||
| user-agent may use them in their user interface. | ||||
| The user agent might then store that decision, and answer future requests | A user agent that chooses to highlight when tracking exceptions have been | |||
| based on this stored preference. A user agent might provide the user with | stored might provide an interface like the following. | |||
| an interface to explicitly remove (or add) user-granted exceptions. | ||||
| Users might not configure their agents to have simple values for DNT, but | * an icon in the status bar indicating that an exception has been | |||
| use different browsing modes or other contextual information to decide on | stored, which, when clicked on, gives the user more information about | |||
| a DNT value. What algorithm a user agent employs to determine DNT values | the exception and an option to revoke such an exception. | |||
| (or the lack thereof) is out of the scope of this specification. | * an infobar stating "Example News (news.example.com) has indicated to | |||
| Browser that you have consented to granting it exceptions to your | ||||
| general Do Not Track preference. If you believe this is incorrect, | ||||
| click Revoke." | ||||
| * no UI at all. | ||||
| In some user-agent implementations, decisions to grant exceptions may have | In some user-agent implementations, decisions to grant exceptions may have | |||
| been made in the past (and since forgotten) or may have been made by other | been made in the past (and since forgotten) or may have been made by other | |||
| users of the device. Thus, exceptions may not always represent the current | users of the device. Thus, exceptions may not always represent the current | |||
| preferences of the user. Some user agents might choose to provide ambient | preferences of the user. Some user agents might choose to provide ambient | |||
| notice that user-opted tracking is ongoing, or easy access to view and | notice that user-opted tracking is ongoing, or easy access to view and | |||
| control these preferences. Users may desire options to edit exceptions | control these preferences. Users may desire options to edit exceptions | |||
| either at the time of tracking or in a separate user interface. This might | either at the time of tracking or in a separate user interface. This might | |||
| allow the user to edit their preferences for a site they do not trust | allow the user to edit their preferences for a site they do not trust | |||
| without visiting that site. | without visiting that site. | |||
| Issue 140: Do we need site-specific exceptions, i.e., concrete list of | 6.8 Exceptions without interactive JavaScript | |||
| permitted third parties for a site? | ||||
| [PENDING REVIEW] In this section; yes, as some sites may have a mix of | This section is non-normative. | |||
| trusted/needed third parties, and others that either don't need to track, | ||||
| or aren't as trusted, or both. But all sites are (a) told what they got | Some third party servers that comply with this standard may wish to | |||
| granted (list, or *) and (b) are assured that requests will be treated | receive user-granted exceptions but when they are invoked as third parties | |||
| 'atomically'. | (using, for example, images, or "tracking pixels") do not have an | |||
| interactive JavaScript presence on the page. They cannot request an | ||||
| exception under these circumstances, both because a script is needed, and | ||||
| because they are required to explain to the user the need for and | ||||
| consequences of granting an exception, and get the user's consent. In | ||||
| general this process of informing, getting consent, and calling the API is | ||||
| not expected to be in the page where such trackers are invoked. | ||||
| To obtain an exception, a document (page, frame, etc.) that loads the | ||||
| Javascript is needed. The user may visit the site that desires an | ||||
| exception directly, the first party site could load a frame of the site | ||||
| desiring the exception, or that frame might be part of some other page | ||||
| containing a number of frames, which allows aggregation of requests for | ||||
| exceptions. | ||||
| In all these ways, the site is contributing to informing the user and | ||||
| getting their consent, and is also able to call the Javascript API when it | ||||
| is granted. | ||||
| Note | ||||
| Depending on the resolution of options for the User-Granted Exceptions | ||||
| section, this language might need to be updated to correspond. | ||||
| 6.9 Exceptions without a DNT header | 6.9 Exceptions without a DNT header | |||
| Sites might wish to request exceptions even when a user arrives without a | Sites might wish to request exceptions even when a user arrives without a | |||
| DNT header. Users might wish to grant affirmative permission to tracking | DNT header. Users might wish to grant affirmative permission to tracking | |||
| on or by certain sites even without expressing general tracking | on or by certain sites even without expressing general tracking | |||
| preferences. | preferences. | |||
| User agents MAY instantiate | User agents MAY instantiate navigator.storeSiteSpecificTrackingException | |||
| NavigatorDoNotTrack.requestSiteSpecificTrackingException even when | even when navigator.doNotTrack is null. Sites SHOULD test for the | |||
| navigator.doNotTrack is null. Sites SHOULD test for the existence of | existence of storeSiteSpecificTrackingException before calling the method. | |||
| requestSiteSpecificTrackingException before calling the method. If an | If an exception is granted in this context and the user-agent stores that | |||
| exception is granted in this context and the user-agent stores that | ||||
| preference, a user agent may send a DNT:0 header even if a tracking | preference, a user agent may send a DNT:0 header even if a tracking | |||
| preference isn't expressed for other requests. Persisted preferences MAY | preference isn't expressed for other requests. Persisted preferences MAY | |||
| also affect which header is transmitted if a user later chooses to express | also affect which header is transmitted if a user later chooses to express | |||
| a tracking preference. | a tracking preference. | |||
| Note | Note | |||
| Users might not configure their agents to have simple values for DNT, but | Users might not configure their agents to have simple values for DNT, but | |||
| use different browsing modes or other contextual information to decide on | use different browsing modes or other contextual information to decide on | |||
| a DNT value. What algorithm a user agent employs to determine DNT values | a DNT value. What algorithm a user agent employs to determine DNT values | |||
| (or the lack thereof) is out of the scope of this specification. | (or the lack thereof) is out of the scope of this specification. | |||
| 6.10 Fingerprinting | 6.10 Exception use by sites | |||
| This section is non-normative. | ||||
| This section is to inform the authors of sites on some considerations in | ||||
| using the exceptions APIs to best effect; sites of particular interest | ||||
| here are those that need an exception in order to allow the user to | ||||
| perform some operation or to have some access. | ||||
| The 'Store' calls do not have a return value, and return immediately. If | ||||
| there is a problem with the calling parameters, then a Javascript | ||||
| exception will be raised. In addition, it may be that the user-agent does | ||||
| not immediately store the exception, possibly because it is allowing the | ||||
| user to confirm. Even though the site has acquired the user's informed | ||||
| consent before calling the 'Store' API, it is possible that the user will | ||||
| change their mind, and allow the store to proceed but then later ask it be | ||||
| removed, or even by denying the storage in the first place. | ||||
| Note | ||||
| The use of the word 'exception' both to describe the user granting | ||||
| something, and for a problem in Javascript, is an unfortunate clash here. | ||||
| Sites can call the 'Confirm' APIs to enquire whether a specific exception | ||||
| has been granted and stands in the user-agent. This is the call to make to | ||||
| determine whether the exception exists, and hence to control access to the | ||||
| function or operation; if it fails (the exception has been deleted, or not | ||||
| yet granted), then the user is ideally again offered the information | ||||
| needed to give their informed consent, and again offered the opportunity | ||||
| to indicate that they grant it. As stated in the normative text, the site | ||||
| needs to explain and acquire consent immediately prior to calling the | ||||
| Store API, and not remember some past consent; this allows the user to | ||||
| change their mind. | ||||
| If they do grant it (using some positive interaction such as a button), | ||||
| the site can return to checking the 'Confirm' API. | ||||
| In this way the site: | ||||
| * does not assume that the storage is instantaneous, and mistakenly | ||||
| grant access when the exception does not (yet) stand; | ||||
| * does not call the Confirm API repeatedly without a user-interaction | ||||
| between each call, in a loop; | ||||
| * permits the user the opportunity to delete a previously granted | ||||
| exception. | ||||
| 6.11 Fingerprinting | ||||
| By storing a client-side configurable state and providing functionality to | By storing a client-side configurable state and providing functionality to | |||
| learn about it later, this API might facilitate user fingerprinting and | learn about it later, this API might facilitate user fingerprinting and | |||
| tracking. User agent developers ought to consider the possibility of | tracking. User agent developers ought to consider the possibility of | |||
| fingerprinting during implementation and might consider rate-limiting | fingerprinting during implementation and might consider rate-limiting | |||
| requests or using other heuristics to mitigate fingerprinting risk. User | requests or using other heuristics to mitigate fingerprinting risk. User | |||
| agents SHOULD clear stored user-granted exceptions when the user chooses | agents SHOULD clear stored user-granted exceptions when the user chooses | |||
| to clear cookies or other client-side state. | to clear cookies or other client-side state. | |||
| A. Acknowledgements | A. Acknowledgements | |||
| skipping to change at line 1631 | skipping to change at line 1959 | |||
| Jonathan Mayer (Stanford), Arvind Narayanan (Stanford), and Sid Stamm | Jonathan Mayer (Stanford), Arvind Narayanan (Stanford), and Sid Stamm | |||
| (Mozilla). The DOM API for NavigatorDoNotTrack is based on the Web | (Mozilla). The DOM API for NavigatorDoNotTrack is based on the Web | |||
| Tracking Protection submission by Andy Zeigler, Adrian Bateman, and | Tracking Protection submission by Andy Zeigler, Adrian Bateman, and | |||
| Eliot Graff (Microsoft). Many thanks to Robin Berjon for ReSpec.js. | Eliot Graff (Microsoft). Many thanks to Robin Berjon for ReSpec.js. | |||
| B. References | B. References | |||
| B.1 Normative references | B.1 Normative references | |||
| [ABNF] | [ABNF] | |||
| D. Crocker and P. Overell. Augmented BNF for Syntax | D. Crocker; P. Overell. Augmented BNF for Syntax Specifications: | |||
| Specifications: ABNF. January 2008. Internet RFC 5234. URL: | ABNF. January 2008. Internet RFC 5234. URL: | |||
| http://www.ietf.org/rfc/rfc5234.txt | http://www.ietf.org/rfc/rfc5234.txt | |||
| [HTTP11] | [COOKIES] | |||
| R. Fielding; et al. Hypertext Transfer Protocol - HTTP/1.1. June | Adam Barth. HTTP State Management Mechanism. April 2011. Internet | |||
| 1999. Internet RFC 2616. URL: http://www.ietf.org/rfc/rfc2616.txt | Proposed Standard RFC 6265. URL: | |||
| http://www.rfc-editor.org/rfc/rfc6265.txt | ||||
| [NAVIGATOR] | [HTTP11] | |||
| Robin Berjon; Travis Leithead; Silvia Pfeiffer; Erika Doyle | R. Fielding et al. Hypertext Transfer Protocol - HTTP/1.1. June | |||
| Navara; Edward O'Connor; Ian Hickson. The Navigator object - | 1999. RFC 2616. URL: http://www.ietf.org/rfc/rfc2616.txt | |||
| System state and capabilities - HTML5. 28 September 2012. Editors' | ||||
| draft. (Work in progress.) URL: | ||||
| http://dev.w3.org/html5/spec/system-state-and-capabilities.html#the | ||||
| -navigator-object | ||||
| [RFC2119] | [RFC2119] | |||
| S. Bradner. Key words for use in RFCs to Indicate Requirement | S. Bradner. Key words for use in RFCs to Indicate Requirement | |||
| Levels. March 1997. Internet RFC 2119. URL: | Levels. March 1997. Internet RFC 2119. URL: | |||
| http://www.ietf.org/rfc/rfc2119.txt | http://www.ietf.org/rfc/rfc2119.txt | |||
| [RFC4627] | [RFC4627] | |||
| D. Crockford. The application/json Media Type for JavaScript | D. Crockford. The application/json Media Type for JavaScript | |||
| Object Notation (JSON) July 2006. Internet RFC 4627. URL: | Object Notation (JSON) (RFC 4627). July 2006. RFC. URL: | |||
| http://www.ietf.org/rfc/rfc4627.txt | http://www.ietf.org/rfc/rfc4627.txt | |||
| [TRACKING-COMPLIANCE] | [TRACKING-COMPLIANCE] | |||
| Justin Brookman; Sean Harvey; Erica Newland; Heather West. | Justin Brookman; Sean Harvey; Erica Newland; Heather West. | |||
| Tracking Compliance and Scope. 2 October 2012. W3C Working Draft. | Tracking Compliance and Scope. 02 October 2012. W3C Working Draft. | |||
| (Work in progress.) URL: | URL: http://www.w3.org/TR/tracking-compliance/ | |||
| http://www.w3.org/TR/2012/WD-tracking-compliance-20121002/ | ||||
| [WEBIDL] | [WEBIDL] | |||
| Cameron McCormack. Web IDL. 27 September 2011. W3C Working Draft. | Cameron McCormack. Web IDL. 19 April 2012. W3C Candidate | |||
| (Work in progress.) URL: | Recommendation. URL: http://www.w3.org/TR/2012/CR-WebIDL-20120419/ | |||
| http://www.w3.org/TR/2011/WD-WebIDL-20110927/ | ||||
| B.2 Informative references | B.2 Informative references | |||
| [COOKIES] | ||||
| Adam Barth. HTTP State Management Mechanism. April 2011. Internet | ||||
| Proposed Standard RFC 6265. URL: | ||||
| http://www.rfc-editor.org/rfc/rfc6265.txt | ||||
| [KnowPrivacy] | [KnowPrivacy] | |||
| Joshua Gomez; Travis Pinnick; Ashkan Soltani. KnowPrivacy. 1 June | Joshua Gomez; Travis Pinnick; Ashkan Soltani. KnowPrivacy. 1 June | |||
| 2009. URL: | 2009. URL: | |||
| http://www.knowprivacy.org/report/KnowPrivacy_Final_Report.pdf | http://www.knowprivacy.org/report/KnowPrivacy_Final_Report.pdf | |||
| [RFC5785] | [RFC5785] | |||
| Mark Nottingham; Eran Hammer-Lahav. Defining Well-Known Uniform | Mark Nottingham; Eran Hammer-Lahav. Defining Well-Known Uniform | |||
| Resource Identifiers (URIs). April 2010. Internet Proposed | Resource Identifiers (URIs) (RFC 5785). April 2010. RFC. URL: | |||
| Standard RFC 5785. URL: http://www.rfc-editor.org/rfc/rfc5785.txt | http://www.rfc-editor.org/rfc/rfc5785.txt | |||
| [URI-TEMPLATE] | [URI-TEMPLATE] | |||
| Joe Gregorio; Roy T. Fielding; Marc Hadley; Mark Nottingham; David | Joe Gregorio; Roy T. Fielding; Marc Hadley; Mark Nottingham; David | |||
| Orchard. URI Template. March 2012. Internet RFC 6570. URL: | Orchard. URI Template. March 2012. RFC 6570. URL: | |||
| http://www.rfc-editor.org/rfc/rfc6570.txt | http://www.rfc-editor.org/rfc/rfc6570.txt | |||
| End of changes. 182 change blocks. | ||||
| 599 lines changed or deleted | 928 lines changed or added | |||
This html diff was produced by rfcdiff 1.40. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ | ||||