diff --git a/Data Deletion Request Framework.md b/Data Deletion Request Framework.md index 61693cf..3e30a39 100644 --- a/Data Deletion Request Framework.md +++ b/Data Deletion Request Framework.md @@ -14,6 +14,11 @@
This specification employs the JSON Web Tokens (JWT) standard, which supports verifiable transmission of data through the use of cryptographic signatures, to assure deletion requests are valid and authentic. Requesters sign JWTs using their private keys to ensure provenance and authenticity, while recipients verify them using public keys hosted on the requester's domain.
Additionally, this specification leverages some of the registered public claims defined in the JWT standard to take advantage of the existing, generally accepted data value definitions and provide consistency across implementations. It also introduces custom private claims designed specifically for the deletion request use case.
-The specification delineates three distinct JWTs: an identity JWT (idJWT), a request JWT (rqJWT), and an acknowledgment JWT (acJWT). Each serves a unique purpose as described below:
+The specification delineates three distinct JWTs: an originating requester JWT (orJWT), a request JWT (rqJWT), and an acknowledgment JWT (acJWT). Each serves a unique purpose as described below:
This model ensures that all recipients can employ the shared idJWT from the request initiator to authenticate its validity. In addition, all recipients will be able to verify the rqJWTs they receive originated with the claimed requester and the acJWT provides requesters and recipients with common proof of a transaction and the success or failure of the communication.
+This model ensures all recipients are able validate and authenticate that the request originated with the claimed 1st party by verifying the orJWT signature using public keys retrieved from the originating domain. In addition, all recipients are able to verify the requests they receive originated with the claimed requester by verifying the rqJWT signature using public keys retrieved from the requester domain. Lastly, recipients are able to provide requesters with proof of the deletion request transaction and the success or failure of its communication with the acJWT signature that can be verified using public keys retrieved from the recipient domain.
For detailed information on JWT implementation, please refer to:
IETF RFC 7519 - JSON Web Tokens (JWT)
@@ -120,38 +125,28 @@
When a deletion request needs to be propagated to downstream recipients, idJWTs are included in the rqJWT to ensure integrity and authenticity of the original request. Each downstream recipient receives the idJWT and verifies its signature before processing the request based on the information within the rqJWT. When a deletion request needs to be propagated to downstream recipients, orJWTs are included in the rqJWT to ensure integrity and authenticity of the original request. Each downstream recipient receives the orJWT and verifies its signature before processing the request based on the information within the rqJWT. To maintain security and transparency throughout the propagation process, it's essential to follow these steps: This approach allows each downstream recipient to verify the authenticity of the original request and assures the integrity of the data deletion process, while adding any necessary additional information to the request before passing it on. Each request needs to be an atomic unit, which can be individually processed by the recipient. The deletion request JWTs will include the following values: A data deletion request is accomplished by sending a POST request to the data deletion request API, which returns a response in JSON format. This protocol is implemented via a standard API and request format with a defined JSON payload as a JWT.
- The following example includes a decoded idJWT to show the header & payload JSON.
+ The following example includes a decoded orJWT to show the header & payload JSON.
When processing requests successfully, servers are expected to respond with an HTTP 202 status code, indicating the request was accepted. In cases where errors occur, servers should respond with an HTTP 400 status code, indicating failure. Additionally, along with the HTTP status code, recipients include a result code in the acJWT response payload raResultCode claim to provide further details about the outcome of the request. In addition to the result code, responses may also contain a string with additional details about the error in the acJWT raResultString claim. When requests are processed successfully, recipients are expected to respond with an HTTP 202 status code indicating the request was accepted. In cases where an error is encountered, recipients should respond with an HTTP 400 status code to indicate the failure. Additionally, recipients should include the defined Result Code of the error encountered in the acJWT response payload raResultCode claim and optionally a string with additional details about the error in the acJWT raResultString claim. For guidelines on error handling, please refer to the following table: There are generally two classes of identifiers used in ad-interactions distinguished by access limitations: those which are directly accessible by 1st-parties and those which are only accessible to 3rd parties. The first class includes any identifiers available in the 1st-party context, including on web pages and 1st-party local storage. The second class includes identifiers maintained in protected 3rd-party storage, such as 3rd-party cookies. Probabilistic identifiers, which are based on constellations of data values, presumably may fall into the first, second or a combination of both classes, depending on how they are constructed. To accomplish this, this specification will use JSON Web Key Sets (JWKS). The JWKS standard (
RFC 7517
- ) establishes a way to store and manage cryptographic keys as a set of JSON objects. JWKS supports asymmetric signature with a public key and private key pair, supporting the discoverability design of the dsrdelete.json file and the signature requirements of the data deletion framework.
) establishes a way to store and manage cryptographic keys as a set of JSON objects. JWKS supports asymmetric signature with a public key and private key pair, supporting the discoverability design of the
JSON Web Token (JWT) Propagation
-
-
-
Deletion Request Data
+Deletion Request Data
idJWT: Issuer “identifier” JWT
+orJWT: Originating Requester JWT
@@ -242,14 +237,6 @@
" (issuer) claim identifies the principal that issued the JWT. It represents the eTLD+1 of the 1st party and can be used to locate their dsrdelete.json file.
required
-
-
sub
- string
- The "
- sub
- " (subject) claim identifies the principal that is the subject of the JWT. This field contains the identifier type and value of the identifier to which the deletion request applies.
- required
-
iat
NumericDate
@@ -292,9 +279,9 @@
required
-
idJWT
+ orJWT
string
- The 1st party "identifier" JWT or idJWT.
+ The 1st party "originating requester" JWT or orJWT.
required
@@ -316,12 +303,22 @@
required
-
+ sub
- string
- The "
- sub
- " (subject) claim identifies the principal that is the subject of the JWT. This field contains the identifier type and value of the identifier to which the deletion request applies. The value in this field may be the same as the value in the idJWT sub field or may be an intermediary’s alias for the original 1st party identifier.
- required
+ identifierValue
+ string
+ The value of the identifier to which the deletion request applies.
+ required
+
+
+ identifierType
+ string
+ The type of identifier provided in the identifierValue field. The value in this field must match a type specified in the intended recipients' dsrdelete.json file.
+ required
+
+
identifierFormat
+ string
+ The format of the identifier provided in the identifierValue field. The value in this field must match a format specified in the intended recipients' dsrdelete.json file.
+ required
iat
@@ -420,7 +417,7 @@
Example Request with required parameters:
Result Codes
-
-
-
+
+
-
-
-
- Result Code
-
-
-
-
- Description
-
-
-
-
- 0
- Successful: Recipient has acknowledged successful receipt of the deletion request.
-
-
- 1
- Malformed Request: The deletion request is missing required fields, leading to a malformed request.
-
-
- 2
- Invalid Signature: The signature provided in the JWT token is invalid, indicating possible issues with key or algorithm.
-
-
- 3
- Invalid JWT Token: The JWT token provided is structurally or cryptographically invalid.
-
-
- 4
- Unsupported Identifier Type: The identifier type in the deletion request isn't supported by the recipient's configuration.
-
-
- 5
- Incorrect Identifier Format: The identifier in the deletion request doesn't match the expected format.
-
-
-
- 6
- Invalid Timestamp: Indicates that the timestamp provided in the JWT is invalid or expired.
-
+
+
+
+ Result Code
+ Result String
+ Description
+
+
+ 10000
+ success
+ Successful: Recipient has acknowledged successful receipt of the deletion request.
+
+
+ 10010
+ unknown_error
+ Unknown error: An unexpected error occurred that does not correspond to any defined error condition.
+
+
+ 11101
+ or_domain_connection_failed
+ Could not connect to the domain listed in the orJWT iss claim:
+ {orJWT iss}.
+
+ 11102
+ or_dsrdelete_file_not_found
+ Could not find the dsrdelete.json file for the orJWT issuer:
+ {orJWT iss}.
+
+ 11103
+ or_jwksuri_not_found
+ Could not find jwksUri entry in the dsrdelete.json for the orJWT issuer:
+ {orJWT iss}.
+
+ 11104
+ or_jwks_keys_file_not_found
+ Could not find keys file:
+ {or dsrdelete.json jwksUri} identified in the jwksUri entry in the dsrdelete.json in the orJWT issuer: {orJWT iss}.
+
+ 11105
+ or_jwks_kid_not_found
+ Could not find the key with kid:
+ {or kid} in keys file identified: {or dsrdelete.json jwksUri} identified in the jwksUri entry in the dsrdelete.json for the orJWT issuer: {orJWT iss}.
+
+ 11201
+ rq_domain_connection_failed
+ Could not connect to the domain listed in rqJWT iss claim:
+ {rqJWT iss}.
+
+ 11202
+ rq_dsrdelete_file_not_found
+ Could not find the dsrdelete.json file for the rqJWT issuer:
+ {rqJWT iss}.
+
+ 11203
+ rq_jwksuri_not_found
+ Could not find jwksUri entry in the dsrdelete.json for the rqJWT issuer:
+ {rqJWT iss}.
+
+ 11204
+ rq_jwks_keys_file_not_found
+ Could not find keys file:
+ {rq dsrdelete.json jwksUri} identified in the jwksUri entry in the dsrdelete.json in the rqJWT issuer: {rqJWT iss}.
+
+ 11205
+ rq_jwks_kid_not_found
+ Could not find the key with kid:
+ {rq kid} in keys file identified: {rq dsrdelete.json jwksUri} identified in the jwksUri entry in the dsrdelete.json for the rqJWT issuer: {rqJWT iss}.
+
+ 12101
+ or_alg_claim_mismatch
+ Request kid:
+ {orJWT kid} alg claim: {orJWT alg} does not match the alg claim: {key file alg} in the keys file: {or dsrdelete.json jwksUri} for the kid.
+
+ 12201
+ rq_alg_claim_mismatch
+ Request kid:
+ {rqJWT kid} alg claim: {rqJWT alg} does not match the alg claim: {key file alg} in the keys file: {rq dsrdelete.json jwksUri} for the kid.
+
+ 13101
+ or_invalid_token
+ Invalid token: The orJWT could not be successfully decoded. JSON token identifier:
+ {orJWT jti}.
+
+ 13102
+ or_invalid_token_signature
+ Invalid token signature: The signature provided in the orJWT is invalid. JSON token identifier:
+ {orJWT jti}.
+
+ 13103
+ or_invalid_token_timestamp
+ Invalid token timestamp: The timestamp provided in the orJWT is invalid:
+ {orJWT timestamp}. The timestamp is a value which is not a positive integer.
+
+ 13104
+ or_invalid_token_timestamp
+ Invalid token timestamp: The timestamp provided in the orJWT is invalid:
+ {orJWT timestamp}. The timestamp is too far in the future: issued more than 5 minutes ahead of the token receipt.
+
+ 13201
+ rq_invalid_token
+ Invalid token: The rqJWT could not be successfully decoded. JSON token identifier:
+ {rqJWT jti}.
+
+ 13202
+ rq_invalid_token_signature
+ Invalid token signature: The signature provided in the rqJWT is invalid. JSON token identifier:
+ {rqJWT jti}.
+
+ 13203
+ rq_invalid_token_timestamp
+ Invalid token timestamp: The timestamp provided in the rqJWT is invalid:
+ {rqJWT timestamp}. The timestamp is a value which is not a positive integer.
+
+ 13204
+ rq_invalid_token_timestamp_future
+ Invalid token timestamp: The timestamp provided in the rqJWT is invalid:
+ {rqJWT timestamp}. The timestamp is too far in the future: issued more than 5 minutes ahead of the token receipt.
+
+ 13205
+ rq_invalid_timestamp_sequence
+ Invalid timestamp sequence: The timestamp of rqJWT:
+ {rqJWT timestamp} precedes the timestamp of orJWT: {orJWT timestamp}.
+
+ 14201
+ rq_unsupported_identifier_type
+ Unsupported identifier type: The identifier type in the rqJWT:
+ {rqJWT identifierType} isn't supported.
+
+ 14202
+ rq_unsupported_identifier_format
+ Unsupported identifier format: The identifier format in the rqJWT
+ {rqJWT identifierFormat} isn't supported.
+
+ 14203
+ rq_incorrect_identifier_format
+ Incorrect identifier format: The identifier format in the rqJWT:
+ {rqJT identifierFormat} does not match the format of the received rqJWT's identifierValue.
+
+
+14204
+ rq_invalid_identifier_value
+ Invalid identifier value: The identifier value in the rqJWT is invalid (e.g. incorrect length).
+ Identifiers
Cryptographic Keys
dsrdelete.json file and the signature requirements of the data deletion framework.
Note that while RFC 7517 lists the "alg" and the "kid" parameters as optional, they are required in the context of this framework to ensure all participants can easily locate verification keys.
Participants must support key rotation to maintain secure and reliable verification. Implementations should maintain a local cache of each participant's JWKS. Participants must refresh their cached JWKS according to the pollFrequency. When verifying a signed request, if a referenced key ID (kid) cannot be found in the cached key set, the participant must fetch a new copy of the requester's JWKS from the jwksUri location and update its cache accordingly.
For more information on JWKS format, please reference the following resources:
Participants that only support script based deletion requests, can do so by providing a property vendorScript along with a property vendorScriptRequirement in their dsrdelete.json file. A first party that wants to start the deletion process, will execute the script.
Note: Please note that supporting only script based deletion requests will limit the ability to receive deletion requests where requests are chained via endpoints.
An optional discovery method will be available via access to a directory provided by the Tech Lab. The directory would live in the Tech Lab tools portal and provide participants with the location of each dsrdelete.json resource. To create the directory entries, Tech Lab will crawl dsrdelete.json resources and automatically create entries–similar to ads.txt. The results would appear in the Tools Portal and in an API. Participants might use the directory to look up primary domains for companies that operate across multiple domains, validate a vendor has adopted the standard with the established request format, or to simplify a bulk lookup of endpoints from participants. All endpoints can be looked up, but not all endpoints need to be used.
+An optional discovery method will be available via access to a directory provided by the Tech Lab. The directory is available in the Tech Lab tools portal and provide participants with the location of each dsrdelete.json resource. To create the directory entries, Tech Lab will crawl dsrdelete.json resources and automatically create entries–similar to ads.txt. The results would appear in the Tools Portal and in an API. Participants might use the directory to look up primary domains for companies that operate across multiple domains, validate a vendor has adopted the standard with the established request format, or to simplify a bulk lookup of endpoints from participants. All endpoints can be looked up, but not all endpoints need to be used.