어트리뷰션 레벨 1

W3C 작업 초안,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-attribution-20260708/
최신 공개 버전:
https://www.w3.org/TR/attribution/
편집자 초안:
https://w3c.github.io/attribution/
이전 버전:
이력:
https://www.w3.org/standards/history/attribution/
피드백:
public-patwg@w3.org 에 제목 줄 “[attribution] … 메시지 주제 …”로 보냄 (아카이브)
GitHub
편집자:
(Google)
(Mozilla)
(Meta)
(Meta)
(Google)
(Mozilla)

개요

이 명세는 광고 성과를 측정하기 위한 브라우저 API를 지정한다. 목표는 개별 웹 사용자의 프라이버시에 위험을 만들지 않으면서, 광고가 어떻게 전환으로 이어지는지에 대한 집계 통계를 산출하는 것이다. 이 API는 여러 웹 출처에서 사람들에 대한 정보를 취합하며, 이는 그들의 프라이버시에 상당한 위험이 될 수 있다. 이러한 위험을 관리하기 위해, 수집되는 정보는 사용자 에이전트가 엄격한 제한 내에서 집계를 수행한다고 신뢰하는 집계 서비스를 사용하여 집계된다. 차등 프라이버시를 제공하기 위해 이 서비스가 생성한 집계에는 노이즈가 추가된다. 웹사이트는 사용자 에이전트가 제공하는 승인된 집계 서비스 목록에서 집계 서비스를 선택할 수 있다.

이 문서의 상태

이 절은 이 문서가 공개된 시점의 상태를 설명한다. 현재 W3C 공개 문서와 이 기술 보고서의 최신 개정판 목록은 W3C 기술 보고서 색인에서 찾을 수 있다.

이 명세에 대한 피드백과 의견을 환영한다. 이 명세에 대한 논의에는 GitHub Issues가 권장된다. 또는 PAT Working Group의 메일링 리스트인 public-patwg@w3.org (아카이브)로 의견을 보낼 수 있다. 이 초안은 작업 그룹에서 아직 논의되어야 할 일부 보류 중인 쟁점을 강조한다. 이러한 쟁점의 결과에 대해서는, 해당 쟁점이 유효한지 여부를 포함하여 어떠한 결정도 내려지지 않았다.

이 문서는 Private Advertising Technology Working GroupRecommendation 트랙을 사용하여 Working Draft로 공개하였다.

Working Draft로 공개되었다는 사실이 W3C와 그 회원들의 지지를 의미하지는 않는다.

이것은 초안 문서이며, 언제든지 다른 문서로 갱신, 대체 또는 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 부적절하다.

이 문서는 언제든지 유지 관리되고 갱신된다. 이 문서의 일부는 진행 중인 작업이다.

이 문서는 W3C Patent Policy에 따라 운영되는 그룹이 작성하였다. W3C는 이 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지한다. 해당 페이지에는 특허 공개 방법에 대한 지침도 포함되어 있다. 개인이 자신이 알고 있는 특허가 Essential Claim(s)를 포함한다고 실제로 알고 있는 경우, 그 개인은 W3C Patent Policy의 6절에 따라 해당 정보를 공개해야 한다.

이 문서는 2025년 8월 18일 W3C Process Document의 적용을 받는다.

1. 소개

이 문서는 브라우저가 집계되고 차등 프라이버시가 적용된 메트릭을 수집할 수 있게 하는 API를 정의한다.

이 API의 목표는 광고 기여도 측정을 가능하게 하는 것이다.

1.1. 어트리뷰션

광고에서, 어트리뷰션은 관심 있는 결과보다 앞서 발생한 동작을 식별하고, 그 동작에 가치를 할당하는 과정이다.

광고주가 관심을 가지는 동작은 주로 광고를 표시하는 것 (또한 노출이라고도 한다)이다. 다른 동작에는 광고 클릭(또는 다른 상호작용)과 사용되지 않은 광고 표시 기회가 포함된다.

광고에서 원하는 결과는 더 다양하다. 광고 표시를 통해 광고주가 개선하려는 모든 결과를 포함하기 때문이다. 바람직한 결과는 전환이라고도 할 수 있으며, 이는 잠재 고객을 고객으로 “전환”하는 것을 의미한다. 전환으로 간주되는 것은 판매, 구독, 페이지 방문 및 문의를 포함할 수 있다.

이 API에서, 동작결과는 모두 이벤트, 즉 한 번 발생하는 일이다. 광고를 위한 어트리뷰션의 고유한 점은 이러한 이벤트가 같은 사이트에서 발생하지 않을 수도 있다는 것이다. 광고는 광고주의 사이트가 아닌 다른 사이트에서 가장 자주 표시된다.

어트리뷰션의 주요 과제는 프라이버시를 유지하는 데 있다. 어트리뷰션은 서로 다른 사이트의 활동을 연결하는 일을 포함한다. 어트리뷰션의 목표는 전환이 발생하기 전에 같은 사람에게 표시된 노출을 찾는 것이다.

어트리뷰션 정보가 직접 공개된다면, 원치 않는 교차 컨텍스트 인식을 가능하게 하여, 그 결과 추적을 가능하게 할 것이다.

이 문서는 어트리뷰션 정보가 집계 서비스를 사용하여 집계되도록 보장함으로써 교차 컨텍스트 인식을 피한다. 집계 서비스는 각 사람이 해당 집계에 기여하는 값을 드러내지 않고 집계를 계산한다고 신뢰된다.

각 브라우저 인스턴스가 주어진 사이트의 집계에 기여하는 정보의 양에는 엄격한 제한이 적용된다. 각 기여에 추가적인 프라이버시 보호를 제공하기 위해 차등 프라이버시가 사용된다.

집계 서비스 동작의 세부사항은 § 6 집계에 포함되어 있다. 사용된 차등 프라이버시 설계는 § 7 차등 프라이버시에서 개괄한다.

1.2. 배경

웹의 초기부터, 광고는 사이트 제작을 재정적으로 지원하기 위해 널리 사용되어 왔다.

웹을 다른 광고 매체와 구별하게 한 한 가지 특징은 광고 캠페인의 효과에 대한 정보를 얻을 수 있다는 점이었다.

웹 광고주는 도달률(광고를 본 사람 수), 빈도(각 사람이 광고를 본 횟수), 및 전환(광고를 본 뒤 나중에 그 광고가 유도하려던 동작을 수행한 사람 수)과 같은 주요 메트릭을 측정할 수 있었다. 이에 비해, 이러한 측정은 다른 어떤 매체보다도 훨씬 더 시의적절하고 정확했다.

측정 성능의 비용은 프라이버시였다. 정확하고 포괄적인 정보를 생성하기 위해, 광고 비즈니스는 모든 웹 사용자의 활동을 광범위하게 추적했다. 각 브라우저에는 추적 식별자가 부여되었으며, 흔히 교차 사이트 콘텐츠가 기록하는 쿠키를 사용했다. 관심 있는 모든 동작은 이 식별자에 대해 기록되어, 한 사람의 온라인 활동에 대한 포괄적인 기록을 형성했다.

한 사람의 동작에 대한 상세한 기록을 보유하면 광고주가 사람들에 대한 특성을 추론할 수 있었다. 이러한 특성은 광고에 적합한 대상을 선택하기 쉽게 하여, 그 효과를 크게 향상시켰다. 이는 더 많은 정보를 수집하려는 강한 유인을 만들었다.

온라인 광고는 매우 경쟁적이다. 광고를 표시하는 사이트는 각 광고 게재에서 최대한 많은 수익을 얻으려 한다. 광고주는 비용 대비 가장 큰 효과가 있을 곳에 광고를 게재하려 한다. 이러한 주체들—​및 그들을 대신하여 운영하는 중개자들—​이 얻는 모든 경쟁 우위는 잠재적 대상에 대한 더 포괄적인 정보를 보유하는 데 달려 있다.

시간이 지나면서, 관심 있는 동작은 온라인 활동의 거의 모든 측면을 포함하도록 확장되었다. 그 정보를 웹 밖의 활동과 연관시키는 방법이 고안되었다. 다양한 목적을 위해 거래되는 개인 정보의 여러 판매자가 참여하는 활발한 거래가 형성되었다.

1.3. 목표

이 문서의 목표는 추적을 가능하게 하지 않는 방식으로 광고를 위한 어트리뷰션을 수행하는 수단을 정의하는 것이다.

1.4. 최종 사용자 이점

광고 성과의 측정은 새로운 교차 사이트 정보 흐름을 만든다. 그 정보 흐름은 교차 컨텍스트 인식이라는 프라이버시 위험 또는 비용을 만들며, 이는 최종 사용자에게 주는 이점의 관점에서 정당화되어야 한다.

어트리뷰션 사용을 통해 최종 사용자가 얻는 모든 이점은 간접적이다.

웹사이트를 방문하는 최종 사용자는 사이트가 보여주는 광고에 대한 자신의 주의를 통해 주로 “무료” 콘텐츠나 서비스의 비용을 지불한다. 이 “가치”는 광고주에게 발생하며, 광고주는 다시 사이트에 비용을 지불한다. 사이트는 이 돈을 콘텐츠나 서비스 제공을 지원하는 데 사용할 것으로 기대된다.

| Advertiser | | | Attention | | +-------------+ +-----+------+ ^ | | Content and | Money | Services | | v .----+------. +------------+ | Content | | | | Production | Investment | | Profit, | / |<-----------+ Website +-------> | Service | | | Expenses, | Improvement | | | etc... '-----------' +------------+ ]]> 사용자 광고주 주의 콘텐츠 및 서비스 콘텐츠 제작 투자 이익, / 웹사이트 서비스 비용, 개선 기타...
광고 지원 콘텐츠 및 서비스를 위한 가치 교환

어트리뷰션 측정 시스템에 참여하는 것은 웹 사용자에게 2차 비용을 구성할 것이다.

어트리뷰션 지원은 더 효과적인 광고를 가능하게 하며, 대체로 어떤 광고가 어떤 상황에서 가장 잘 작동하는지에 대해 광고주에게 알려줌으로써 이루어진다. 그러한 상황에는 광고가 표시되는 시간과 장소, 광고가 제시되는 사람, 그리고 광고 자체의 세부사항이 포함될 수 있다.

그 정보를 결과에 연결하면 광고주는 자신이 가장 가치 있게 여기는 결과로 가장 자주 이어지는 상황을 알 수 있다. 이를 통해 광고주는 효과적인 광고에는 더 많이 지출하고 효과적이지 않은 광고에는 덜 지출할 수 있다. 이는 얻은 가치에 비해 광고의 전체 비용을 낮춘다. [ONLINE-ADVERTISING]

콘텐츠 게시자와 서비스 제공자처럼 광고 인벤토리를 제공하는 사이트는 더 효율적인 광고에서 간접적인 이익을 얻는다. 광고주가 원하는 결과로 이어지는 광고를 더 잘 보여줄 수 있는 광고 매체는 광고 게재에 더 많은 비용을 청구할 수 있다.

광고 게재를 통해 지원을 얻는 사이트는 양질의 콘텐츠나 서비스를 더 잘 제공할 수 있다. 중요한 점은, 그 지원이 사용자층에서 고르게 도출되지 않는다는 것이다. 이는 다른 형태의 재정 지원보다 더 공평할 수 있다. 광고 상품에 지출할 경향이나 능력이 더 낮은 사람도 지불할 여력이 있는 사람과 동일한 광고 지원 콘텐츠와 서비스를 이용할 수 있다. [EU-AD][COPPACALYPSE]

광고로 지원되는 “무료” 서비스를 제공할 수 있는 능력은 그 서비스의 가치에서 비롯되는 측정 가능한 경제적 이익을 가진다. [FREE-GDP]

1.5. 집단적 프라이버시 효과

집계를 사용하면—​올바르게 구현된 경우—​사이트에 제공되는 정보가 개인이 아니라 그룹에 관한 것이 되도록 보장한다.

따라서 이 메커니즘의 도입은 집단적 프라이버시라는 개념에 맞는 집단적 의사결정을 나타낸다.

어트리뷰션 측정 참여는 참여하는 그룹이 더 클수록 더 낮은 프라이버시 비용을 가진다. 이는 사이트가 집계에서 개인에 대한 정보를 추출할 수 있는 능력에 집계가 미치는 영향 때문이다. 이는 특히 중앙 차등 프라이버시에서 그렇다. 이것이 이 명세에서 사용되는 프라이버시 설계의 수학적 기반이다.

더 큰 참여자 집단은 측정되는 광고에 대한 더 대표성 있고—​따라서 더 유용한—​통계도 생성한다.

어트리뷰션이 정당화된다면, 이 두 요소는 모든 사용자에 대해 어트리뷰션을 활성화하도록 동기를 부여한다.

사용자 에이전트가 어트리뷰션 측정을 활성화하도록 하는 조치는 일부 사람들에게 긍정적으로 받아들여지지 않을 것이다. 사람마다 광고와 관계를 맺음으로써 발생하는 비용과 이점을 다르게 인식한다. 제안된 설계는 사이트에 그 선택을 드러내지 않으면서도 사람들이 어트리뷰션에 참여하는 것처럼 보일 수 있는 선택권을 허용한다. § 9.2 Attribution API 비활성화 참조.

1.6. 히스토그램을 사용한 어트리뷰션

어트리뷰션은 하나 이상의 광고 게재(노출)와 광고주가 원하는 결과 사이의 상관관계를 측정하려고 시도한다.

집계로 고려될 때, 개인에 대한 정보는 유용하지 않다. 동작과 결과는 그룹화되어야 한다.

가장 단순한 형태의 어트리뷰션은 광고의 속성에 따라 노출을 여러 그룹으로 나누고 전환의 수를 센다. 그룹화는 광고가 표시된 위치, 표시된 내용(“크리에이티브”), 광고가 표시된 시점, 또는 누구에게 표시되었는지 같은 속성에서 형성될 수 있다.

이러한 그룹화와 각 그룹에 귀속된 전환의 집계는 히스토그램을 형성한다. 히스토그램의 각 버킷은 광고 그룹에 대한 전환을 센다.

example.com news.example classified.example search.example
노출이 표시된 사이트별로 그룹화한 전환 수의 샘플 히스토그램

서로 다른 목적에는 서로 다른 그룹화가 사용될 수 있다. 예를 들어, 크리에이티브(광고의 내용)별 그룹화는 어떤 크리에이티브가 가장 잘 작동하는지 알아내는 데 사용될 수 있다.

각 전환에서 1보다 큰 값을 추가하면 단순한 카운트 이상의 것이 가능해진다. 히스토그램은 값도 집계할 수 있으며, 이는 서로 다른 결과를 구분하는 데 사용될 수 있다. 노출에 할당되는 값은 전환 값이라고 한다. 더 높은 전환 값은 더 큰 구매나 더 높게 평가되는 모든 결과에 사용될 수 있다. 전환 값은 또한 여러 노출 사이에서 크레딧을 나누기 위해 분할될 수도 있다.

2. 동작 개요

Attribution API는 두 종류의 이벤트, 즉 노출전환 사이의 연관성에 대한 집계 정보를 제공한다.

노출은 광고주가 어떤 웹사이트에서든 수행하는 모든 동작이다. 이 API는 무엇이 노출로 기록될 수 있는지를 제한하지 않는다. 광고주가 측정하려 할 수 있는 일반적인 동작에는 다음이 포함된다.

이 API에서 전환은 측정 대상인 결과이다. 이 API는 무엇이 결과로 간주될 수 있는지를 제한하지 않는다. 광고주가 측정하려 할 수 있는 일반적인 결과에는 다음이 포함된다.

이 절의 나머지는 Attribution API가 집계 서비스와 함께 어떻게 동작하여 집계된 어트리뷰션 측정을 생성하는지를 설명한다. 그 동작은 다음 그림에 설명되어 있다.

| | | Advertiser | | Aggregation | | Server | | Service | | |<-----------+ | +--------------+ Histogram +-------------+ ^ ^ ^ Conversion | | | Reports | | '-----------. | '-----------. | | | | +-------------+-+-+ +---------+----+ | | | | | | | | Other Users | Publisher | | | | Advertiser | | Site(s) | | | | Site | | | | | | | +------+------+-+-+ +-----+--------+ | | ^ saveImpression | measureConversion | | Conversion | | | Report v v | +-------------------------------------+---------+ | | | Private Attribution APIs | | | +-----------------------------------------------+ ^ | v .-----------. | | | Impression | | Store | | | '-----------' ]]> 전환 보고서 광고주 집계 서버 서비스 히스토그램 전환 보고서 다른 사용자 게시자 광고주 사이트 사이트 saveImpression measureConversion 전환 보고서 Private Attribution APIs 노출 저장소
어트리뷰션 동작 개요

2.1. 노출 기록

노출이 발생하면, saveImpression() 메서드를 사용하여 브라우저가 정보를 저장하도록 요청할 수 있다. 여기에는 노출에 대한 식별자와 노출에 관한 몇 가지 추가 정보가 포함된다. 예를 들어 광고주는 추가 정보를 사용하여 해당 노출이 광고 조회였는지 광고 클릭이었는지를 기록할 수 있다.

2.2. 전환 또는 노출 질의

전환 시점에는 전환 보고서가 생성된다. 전환 보고서는 브라우저가 이전에 저장한 노출의 정보를 포함하는 암호화된 히스토그램 기여값이다.

measureConversion() 메서드는 브라우저에 전환 보고서를 구성하는 방법을 알려 주는 데 사용되는 제한된 쿼리를 받는다. 여기에는 브라우저가 저장한 노출 중에서 선택하는 값, 선택된 노출에 할당되는 전환 값, 그리고 전환 보고서를 구성하는 데 필요한 기타 정보가 포함된다.

전환 보고서가 생성하는 히스토그램은 다음과 같이 구성된다.

브라우저는 보고된 전환을 반영하도록 프라이버시 예산 저장소를 갱신한다.

결과 히스토그램은 선택된 집계 서비스의 요구사항에 따라 집계를 위해 준비되고 사이트에 반환된다. 이는 최소한 히스토그램의 암호화를 포함한다.

이 API를 호출하는 사이트는 항상 유효한 전환 보고서를 받는다. 그 결과, 사이트는 이 상호작용으로부터 다른 사이트에서 어떤 일이 일어났는지 전혀 알 수 없다.

2.3. 집계

사이트는 이 API 호출에서 수신한 암호화된 히스토그램을 수집하여 집계 서비스에 제출할 수 있다.

사이트로부터 암호화된 히스토그램 집합을 수신하면, 집계 서비스는 다음을 수행한다.

  1. 제공된 입력으로부터 집계를 이전에 계산한 적이 없으며 충분한 전환 보고서가 있음을 확인하고,

  2. 충분한 노이즈를 포함하여 히스토그램을 더해 차등 프라이버시 집계 히스토그램을 생성하고,

  3. 그 집계를 사이트에 반환한다.

집계 서비스의 최종 출력을 기여 결과라고 부른다.

브라우저 구현은 위 기능을 신뢰할 수 있게 수행하도록 신뢰되는 집계 서비스 집합을 가져야 한다. 제공되는 서비스 집합 중에서, 전환 사이트는 집계를 수행할 서비스 선택에 대해 합의에 도달해야 한다.

브라우저는 집계 서비스를 등록하기 위한 프로그램을 수립할 수도 있으며, 이는 브라우저가 Web PKI 인증서를 검증할 때 사용하는 인증 기관을 승인하기 위해 사용되는 루트 저장소 프로그램과 성격상 유사하다. 그러한 프로그램의 수립은 이 문서의 범위를 벗어난다.

3. API 사용

Attribution API를 사용하는 사이트는 일반적으로 노출 또는 전환 중 하나를 등록하지만, 경우에 따라 같은 사이트가 둘 다 수행할 수도 있다.

노출을 등록하려면, 사이트는 saveImpression()를 호출한다. 매개변수 값을 수집하는 것 외에는 이 API를 사용하기 위한 준비가 필요하지 않지만, Attribution API를 사용할지 결정할 때 지원되는 aggregationServices를 살펴보는 것이 유용할 수 있다.

사용자 에이전트에 리소스를 제공할 때 HTTP 응답에 `Save-Impression` 헤더를 포함하여 노출을 등록하는 것도 가능하다.

전환 보고서를 요청하려면, 사이트는 measureConversion()를 호출한다. 이 API를 호출하기 전에, 사이트는 지원되는 집계 서비스를 선택해야 한다. 페이지는 aggregationServices에서 발견되는 지원 서비스 중 아무 것이나 선택할 수 있다. 선택한 서비스의 이름은 measureConversion() 메서드를 호출할 때 AttributionConversionOptions 사전의 aggregationService 멤버로 제공해야 한다.

3.1. 사이트 식별자

이 API는 자신이 동작하는 기본 범위로 사이트에 대한 HTML 정의에 의존한다. 세 가지 유형의 사이트가 인식된다.

이 API는 출처가 아니라 사이트를 사용한다. 이는 프라이버시 결과를 가질 수 있는 모든 활동을 단일 엔티티와 연결하는 것에 의존하기 때문이다. 쿠키와 같은 기능은 프라이버시 관련 정보가 same site 출처들 사이에서 자유롭게 교환되도록 허용하며, 그렇지 않으면 이를 사용하여 프라이버시 예산을 초과할 수 있다.

이 API의 모든 기능은 navigator.attribution 속성에 연결된다.

partial interface Navigator {
  [SecureContext, SameObject] readonly attribute Attribution attribution;
};

이는 세 가지 핵심 기능을 제공한다.

3.3. 지원되는 집계 서비스 찾기

aggregationServices 속성은 사용자 에이전트가 지원하는 집계 서비스의 집합을 포함한다. 페이지는 measureConversion() 메서드를 호출할 때 이 서비스 중 하나를 선택하고 지정해야 한다. 노출을 등록하기 전에 지원되는 서비스를 질의하는 것도 유용할 수 있지만, 필수는 아니며, 노출은 단일 집계 서비스로 범위가 지정되지 않는다.

사이트는 사용하는 집계 서비스에 대해 선호 순서를 가질 수 있다. 다음 코드는 선호 목록을 반복하고 사용자 에이전트가 지원하는 항목을 찾는다.

const preferredServices = [
  "https://aggregator.example/tee",
  "https://aggregator.example/dap",
  "https://example.com/aggregator",
];
const supportedServices = navigator.attribution?.aggregationServices;
const serviceUrl = preferredServices.find(url => supportedServices?.has(url));

사용자 에이전트가 URL을 지원하고 그것이 선호 서비스 중 하나를 포함한다면, 첫 번째 선호 서비스가 serviceUrl이라는 변수에 저장된다. 그렇지 않으면 serviceUrlundefined로 남는다.

enum AttributionAggregationProtocol { "dap-18-histogram" };

dictionary AttributionAggregationService {
  required AttributionAggregationProtocol protocol;
};

[SecureContext, Exposed=Window]
interface AttributionAggregationServices {
  readonly maplike<USVString, AttributionAggregationService>;
};

[SecureContext, Exposed=Window]
interface Attribution {
  readonly attribute AttributionAggregationServices aggregationServices;
};

aggregationServices 속성은 집계 서비스를 식별하는 URL에서 그 서비스에 대한 메타데이터로의 매핑이다.

protocol, 타입은 AttributionAggregationProtocol
집계 서비스가 사용하는 protocol. 같은 프로토콜의 서로 다른 버전은 서로 다른 값을 사용한다. 하나의 서비스 제공자가 여러 프로토콜을 지원하더라도, 각각은 서로 다른 URL을 사용해야 한다. 이는 프로토콜의 선택을 함께 지정하지 않고도 각각을 URL로 고유하게 식별할 수 있게 보장한다.

URL은 식별된 집계 서비스를 선택하기 위해 measureConversion()aggregationService 매개변수로 전달된다.

The AttributionAggregationProtocol는 서로 다른 집계 서비스에서 사용하는 제출 프로토콜을 설명한다. 이 문서는 하나의 프로토콜을 정의한다:

dap-18-histogram
[DAP]에 기반한 프로토콜로, MPC를 사용한다. § 6.1 다자간 계산 집계를 참조하라.

3.4. 노출 저장

saveImpression() 메서드는 사용자 에이전트노출노출 저장소에 기록하도록 요청한다.

광고주를 위한 광고를 표시하는 사이트는 노출을 저장할 수 있다.

이 경우, 사이트는 노출을 직접 저장하며, 광고주(advertiser.example)를 식별하고 광고주가 협의한 정보를 포함한다. 다음 예제에서는, 여기에는 광고주가 나중에 이 광고를 선택하는 데 사용할 수 있는 matchValue 값(2), 귀속된 값을 포함할 히스토그램의 인덱스(histogramIndex = 3), 그리고 광고주가 요구하는 기간 이상인 보존 기간(lifetimeDays = 7)이 포함된다.

navigator.attribution.saveImpression({
  histogramIndex: 3,
  matchValue: 2,
  conversionSites: ["advertiser.example"],
  lifetimeDays: 7,
});

또는 공급 측 플랫폼(SSP)이나 수요 측 플랫폼(DSP)과 같은 중개자가 iframe에서 동일한 API를 호출할 수도 있다. 프레임에서 동일한 API 호출을 하면 중개자 사이트 식별자가 노출과 함께 저장된다.

dictionary AttributionImpressionOptions {
  required unsigned long histogramIndex;
  unsigned long matchValue = 0;
  sequence<USVString> conversionSites = [];
  sequence<USVString> conversionCallers = [];
  unsigned long lifetimeDays = 30;
  long priority = 0;
};

dictionary AttributionImpressionResult {
};

[SecureContext, Exposed=Window]
partial interface Attribution {
  Promise<AttributionImpressionResult> saveImpression(AttributionImpressionOptions options);
};

saveImpression()의 인수는 다음과 같다.

histogramIndex, of type unsigned long
measureConversion()이 이 노출을 이후의 전환과 일치시키면, 전환 값은 이 인덱스로 식별되는 히스토그램 버킷에 추가된다.
matchValue, of type unsigned long, defaulting to 0
노출과 연관된 선택적 메타데이터 조각이다. 이 값은 전환으로부터 기여를 받을 수 있는 노출을 식별하는 데 사용될 수 있다.
conversionSites, of type sequence<USVString>, defaulting to []
이 노출에 대한 전환이 발생할 수 있는 최상위 전환 사이트이며, 그 도메인 이름으로 식별된다. measureConversion() 메서드는 표시된 사이트 중 하나에서 호출된 경우에만 이 노출에 기여를 귀속시킨다. 비어 있으면, 모든 전환 사이트가 일치한다.
conversionCallers, of type sequence<USVString>, defaulting to []
이 노출을 전환에 대해 선택할 수 있는 중개자 사이트 또는 전환 사이트이며, 그 도메인 이름으로 식별된다. measureConversion() 메서드는 표시된 사이트 중 하나에서 호출된 경우에만 이 노출에 기여를 귀속시킨다. 이 옵션에는 전환 사이트중개자 사이트가 모두 포함된다. 비어 있으면, API를 호출하는 모든 사이트가 일치한다.
lifetimeDays, of type unsigned long, defaulting to 30
양의 "존속 시간"(일 단위)이며, 이 시간이 지나면 노출은 더 이상 기여를 받을 수 없다. 사용자 에이전트는 수명에 상한을 부과해야 하며, 여기에 지정된 값이 그 한도를 초과하면 조용히 줄여야 한다.
priority, of type long, defaulting to 0
기여 중에 노출을 정렬하는 데 사용되는 정수이다.

3.5. 전환에 대한 어트리뷰션 요청

measureConversion() 메서드는 사용자 에이전트전환에 대해 어트리뷰션을 수행하고, 전환 보고서를 반환하도록 요청한다.

measureConversion() 메서드는 매칭되는 노출이 발견되는지 여부와 관계없이 항상 전환 보고서를 반환한다. 매칭이 없거나 차등 프라이버시가 어트리뷰션 보고를 허용하지 않는 경우, 반환된 전환 보고서는 히스토그램에 기여하지 않는다. 즉, 균일하게 0이 된다.

전환을 관찰한 사이트는 서로 다른 저장된 노출의 효과 측정을 요청하도록 선택할 수 있다.

암호화된 측정의 생성을 요청하기 위해, 사이트는 measureConversion() 메서드를 호출한다.

이 함수는 네 가지 서로 다른 유형의 입력을 받는다.

  1. URL을 사용하여 식별되는 선택된 집계 서비스. 집계 서비스를 선택하는 예제 과정은 브라우저가 지원하는 서비스를 선택하는 방법을 보여준다.

    const serviceDetails = {
      aggregationService: serviceUrl,
    };
    
  2. 집계된 측정의 세부사항. 이러한 값은 여러 브라우저에 걸친 API의 모든 호출에서 일관된다. 여기에는 히스토그램의 크기와 지출되었을 수 있는 프라이버시 예산의 양이 포함된다.

    const aggregatedMeasurementDetails = {
      histogramSize: 20,
      epsilon: 1,
    };
    
  3. 고려할 노출을 선택하는 속성 집합. 모두 선택 사항이다. 여기에는 노출이 얼마나 오래될 수 있는지 (lookbackDays), 노출을 저장했을 수 있는 노출 사이트 (impressionSites), 노출을 저장했을 수 있는 중개자 사이트 (impressionCallers), 그리고 matchValues의 선택이 포함된다.

    const selectionDetails = {
      lookbackDays: 14,
      impressionSites: ["publisher.example", "other.example"],
      impressionCallers: ["ad-tech.example"],
      matchValues: [2],
    };
    
  4. 어트리뷰션 로직 매개변수.

    const attributionDetails = {
      // top impression's histogram index gets 50% of value, the next two 25% each
      credit: [.5, .25, .25],
      value: 3,
      maxValue: 7,
    };
    

이 값들이 결정되면, 사이트는 암호화된 전환 보고서를 얻기 위해 API를 호출한다.

const measurement = await navigator.attribution.measureConversion({
  ...serviceDetails,
  ...aggregatedMeasurementDetails,
  ...selectionDetails,
  ...attributionDetails,
});
sendReportToServer(measurement.report);

보고서는 이 브라우저와 다른 브라우저의 다른 보고서와 함께 수집될 수 있다. 그런 다음 수집된 보고서는 모두 집계 서비스에 제출되어 집계 히스토그램을 얻을 수 있다.

dictionary AttributionConversionOptions {
  required USVString aggregationService;
  double epsilon = 1.0;

  required unsigned long histogramSize;

  unsigned long lookbackDays;
  sequence<unsigned long> matchValues = [];
  sequence<USVString> impressionSites = [];
  sequence<USVString> impressionCallers = [];

  sequence<double> credit;
  unsigned long value = 1;
  unsigned long maxValue = 1;
};

dictionary AttributionConversionResult {
  required Uint8Array report;
};

[SecureContext, Exposed=Window]
partial interface Attribution {
  Promise<AttributionConversionResult> measureConversion(AttributionConversionOptions options);
};

measureConversion()의 인수는 다음과 같다.

aggregationService, 형식은 USVString
집계 서비스 중에서 선택한 항목이며, aggregationServices에서 찾을 수 있다.
epsilon, 형식은 double, 기본값은 1.0
전환 보고서에 지출할 프라이버시 예산의 양.
histogramSize, 형식은 unsigned long
전환 보고서에서 사용할 히스토그램 버킷 수.
lookbackDays, 형식은 unsigned long
양의 정수 일수. 지난 lookbackDays일 이내에 발생한 노출만 이 전환과 일치할 수 있다. 생략된 경우, 최대 룩백과 동등하다.
matchValues, 형식은 sequence<unsigned long>, 기본값은 []
집합이며, 노출을 선택하는 데 사용할 수 있는 match 값들이다.
impressionSites, 형식은 sequence<USVString>, 기본값은 []
노출 사이트의 집합. 노출 사이트가 이 집합 안에 있는 곳에서 기록된 노출만 이 전환과 일치할 자격이 있다. 비어 있으면, 모든 사이트가 일치한다.
impressionCallers, 형식은 sequence<USVString>, 기본값은 []
saveImpression() API를 호출했을 수 있는 사이트의 집합이며, 노출 사이트중개자 사이트를 모두 포함한다. 비어 있지 않으면, 나열된 사이트 중 하나가 기록한 노출만 이 전환과 일치할 자격이 있다.
value, 형식은 unsigned long, 기본값은 1
전환 값. 기여가 이루어지고 프라이버시 제한이 만족되면, 이 값은 전환 보고서에 인코딩된다.
maxValue, 형식은 unsigned long, 기본값은 1
집계에 포함된 모든 기여에 걸친 최대 전환 값. epsilon과 함께, 결과에 추가될 랜덤 노이즈의 분포를 보정하는 데 사용된다. 또한 이 전환 보고서에 지출할 프라이버시 예산의 양을 결정하는 데에도 사용된다.
credit, 형식은 sequence<double>
전환 값이 여러 노출에 걸쳐 어떻게 할당되는지를 설명하는 유한한 양수들의 목록. 이 값은 선택된 노출 목록에 걸쳐 지정된 순서대로 목록의 값에 비례하여 분할된다. 선택된 노출 수가 이 목록의 값 수보다 적으면, 이 목록의 추가 항목은 무시된다. 없으면, 전환 값은 단일 노출에 할당된다.

3.6. 중개자의 역할

이 API는 최상위 사이트를 대신하여 중개자가 동작하는 것을 지원한다. 광고는 게재, 입찰, 측정을 책임지는 독립 운영자에게 자주 위임된다.

중개자가 저장한 노출중개자 사이트의 식별자를 기록한다. 전환 측정을 위해 노출을 선택할 때, 중개자 사이트 식별자를 사용하여 노출을 선택할 수 있다.

3.7. 히스토그램 구성

개념적으로, 저장된 각 노출은 단일 히스토그램 정의를 가진다. 각 노출은 단일 Histogram Index 속성을 가지며, 이는 해당 노출에 할당된 결과 히스토그램에서 어디에 나타나는지를 결정한다.

따라서 measureConversion()의 각 호출은 동일한 히스토그램 정의를 가진 노출을 선택해야 한다. 이는 API의 모든 사용에 적용되지만, 히스토그램의 일관된 정의는 노출이 여러 중개자에 의해 저장되고 측정될 때 특히 중요하다.

measureConversion()을 호출할 때 선택될 수 있는 모든 노출은 동일한 히스토그램 정의를 사용해야 한다. API는 올바른 노출만 선택되도록 보장하기 위한 여러 도구를 제공한다.

저장된 노출의 경우:

전환 시점의 공통 매칭 로직의 일부로:

이러한 옵션은 어트리뷰션이 히스토그램을 선택하는 방식에 대해 사이트에 유연성을 제공한다. 이는 전환 사이트가 서로 다른 히스토그램을 사용하는 것을 배제하지 않는다. measureConversion() 호출이 서로 다른 히스토그램 정의를 가진 노출을 절대 선택하지 않는다면, 여러 노출은 서로 다른 히스토그램 정의로 저장될 수 있다. 이는 measureConversion()을 여러 번 호출함으로써 전환이 여러 히스토그램에 귀속될 수 있도록 보장한다.

3.8. Permissions Policy 통합

중개자에게 위임할 수 있는 기능은 Permission Policy에 의해 제어된다.

이 명세는 두 개의 정책 제어 기능을 정의한다.

이 두 기능 모두에 대한 기본 허용 목록*이다.

saveImpression()measureConversion()에 대해 별도의 권한을 두면, 둘 다 수행하는 페이지가 하위 리소스를 예상되는 종류의 활동으로 제한할 수 있다.

기본적으로 권한을 활성화하면 외부 서비스를 통합하는 작업이 단순해진다.

Permissions Policy는 전부 아니면 전무 방식의 제어만 제공하며, 프라이버시 예산 일부의 위임은 가능하게 하지 않는다.

4. API 내부

4.1. 노출 저장소

노출 저장소measureConversion() 메서드가 일치하는 노출을 찾는 데 사용한다.

이 API는 사이트에 의한 데이터 저장을 가능하게 하지만, 노출 저장소storage key를 사용하지 않는다.

4.1.1. 내용

노출 저장소집합노출들이다.

매치 값: saveImpression()에 전달된 matchValue.
노출 사이트: saveImpression()이 호출된 노출 사이트.
중개자 사이트: saveImpression()을 호출한 중개자 사이트, 또는 API가 노출 사이트에 의해 호출된 경우 undefined.
전환 사이트: saveImpression()에 전달된 전환 사이트집합.
전환 호출자: measureConversion()을 호출할 때 이 노출을 선택할 수 있는 사이트의 집합으로, 전환 사이트 또는 중개자 사이트이다.
타임스탬프: saveImpression()이 호출된 시각.
수명: 노출이 어트리뷰션 자격을 유지하는 기간으로, saveImpression() 호출에서 오거나, 사용자 에이전트가 정의한 한계에서 온다.
히스토그램 인덱스: saveImpression()에 전달된 히스토그램 인덱스.
우선순위: 어트리뷰션 중에 노출을 정렬하는 데 사용되는 정수.

4.1.2. 유지 관리

사용자 에이전트는 주기적으로 타임스탬프수명 값을 사용하여, 만료된 노출노출 저장소에서 식별하고 삭제해야 한다.

measureConversion()이 만료된 노출어트리뷰션에서 제외하는 한, 만료 즉시 노출을 제거할 필요는 없다. 그러나 사용자 에이전트는 만료된 노출을 무기한 보관해서는 안 된다.

4.1.3. Clear-Site-Data 통합

`Clear-Site-Data` 필드 [CLEAR-SITE-DATA]는 사이트가 사용자 에이전트가 유지하는 상태를 제거할 수 있게 한다. `"impressions"` 타입은 인식되는 타입 목록에 추가되며, Clear Site Data § 3.1 The Clear-Site-Data HTTP Response Header Field에서 정의된다.

응답에 대한 사이트 데이터 삭제 알고리즘이 호출될 때, 타입 목록이 `"impressions"`를 포함하면, 사이트에 대한 노출 삭제가 호출되며, origin을 전달한다.

출처 origin이 주어졌을 때, 사이트에 대한 노출을 삭제하려면, 다음 단계를 실행한다.
  1. origin튜플 출처가 아니면, 반환한다.

  2. siteoriginhost 부분을 전달하여 등록 가능한 도메인 얻기를 호출한 결과로 한다.

  3. 각각에 대해, 노출 저장소의 노출 저장소에 있는 impression에 대해:

    1. impression중개자 사이트undefined이고 그 노출 사이트site와 같으면, 제거 impression노출 저장소에서 제거하고 계속한다.

    2. impressionsite와 같은 중개자 사이트를 가지면, 제거 impression노출 저장소에서 제거하고 계속한다.

    3. impression전환 사이트site포함하면:

      1. siteimpression전환 사이트에서 제거한다.

      2. impression전환 사이트비어 있으면, 제거 impression노출 저장소에서 제거하고 계속한다.

    4. impression전환 호출자site포함하면:

      1. siteimpression전환 호출자에서 제거한다.

      2. impression전환 호출자비어 있으면, 제거 impression노출 저장소에서 제거하고 계속한다.

이 과정은 빈 집합전환 사이트와 함께 저장된 노출은 제거하지 않는다.

4.1.4. 사이트 이름

노출 저장소는 세 가지 유형의 사이트에 대한 정보를 저장한다. 노출 사이트, 선택적 중개자 사이트, 그리고 전환 사이트집합이다.

사이트들은 모두 "https" 스킴을 가진 scheme-and-host 형식이어야 MUST 한다. 이는 호스트의 단순 문자열 직렬화가 사이트를 식별하기에 충분하다는 뜻이다. 따라서 API는 단순한 문자열을 사용하여 사이트를 나타낼 수 있다.

구현이 내부적으로 튜플의 host 부분만 사용하여 사이트를 표현하는 것도 가능하다.

문자열 input이 주어졌을 때, site 또는 failure를 반환하는 사이트를 파싱하려면, 다음 단계를 실행한다.
  1. hostinput을 전달하여 host parser를 호출해 반환된 값으로 둔다.

  2. host가 failure이면 failure를 반환한다.

  3. sitehost를 전달하여 obtain a registrable domain이 반환한 값으로 둔다.

  4. site가 null이면 failure를 반환한다.

  5. site가 "localhost"이거나 site가 ".localhost"로 끝나면, failure를 반환한다.

  6. ("https", site)의 scheme-and-host 튜플을 반환한다.

이 알고리즘은 registrable domain보다 더 많은 domain label을 포함하는 문자열에서도 site를 성공적으로 생성한다. 예를 들어, "extra.example.com"은 "example.com"으로 파싱된다.

이 알고리즘은 localhost 도메인 [RFC6761]을 허용하지 않으므로, site 이름 추출에 의존하는 모든 알고리즘은 localhost 도메인이 언급되거나 현재 site(최상위 또는 프레임)가 localhost 도메인일 때 실패하게 된다. 이는 테스트 및 개발을 위해 로컬 서버를 사용하는 것을 어렵게 만들 수 있다. 구현은 테스트 및 개발을 돕기 위해 localhost 검사를 비활성화하는 구성을 제공할 수 있다.

4.2. 프라이버시 예산 관리를 위한 상태

사용자 에이전트프라이버시 예산의 지출을 관리하는 데 사용되는 여러 상태 조각을 유지한다.

프라이버시 예산 저장소, 전역 프라이버시 예산 저장소, 및 노출 사이트 할당량 저장소프라이버시 및 안전 예산 차감에 의해 갱신된다.

노출 저장소와 마찬가지로, 프라이버시 예산 저장소와 관련 저장소는 storage key를 사용하지 않는다. 이러한 저장소에는 정보가 삭제되는 방식에 대한 몇 가지 추가 제약이 있다. 자세한 내용은 § 9.7 API 상태 삭제를 참조한다.

어트리뷰션 예산 잠금을 불리언 플래그로 정의하는 선택은 명세 작성의 편의를 위한 것이다. 구현에는 대체 구성물이 더 적합할 수 있다. 구현은 이 값을, 예를 들어 에포크별로 분할하여, 경합 범위를 줄일 수 있을지도 모른다.

4.2.1. 프라이버시 예산 저장소

프라이버시 예산 키는 다음 항목들로 구성된 튜플이다.

에포크 인덱스

에포크 인덱스

사이트

사이트

프라이버시 예산 저장소는 키가 프라이버시 예산 키이고 값이 32비트 부호 없는 정수이다. 이러한 정수마이크로엡실론 단위로 값을 저장한다. 마이크로엡실론은 차등 프라이버시에서 사용되는 단위 엡실론 값의 백만분의 일이다 [DP].

32비트 정수를 선택하면 epsilon 설정이 4294라는 최대 epsilon 이하로 제한된다. 이는 구현에 충분하고도 남아야 should 한다.

전역 프라이버시 예산 저장소는 키가 에포크 인덱스이고 값이 32비트 부호 없는 정수이며, 마이크로엡실론 단위이다.

전역 프라이버시 예산 저장소는 모든 사이트에 걸쳐 적용되고 각 에포크마다 새로고침되는 단일 프라이버시 예산의 지출을 추적한다. 이는 같은 사람에 대한 활동을 여러 사이트에 걸쳐 상관시킬 수 있는 적대자에 대한 안전 한계를 제공한다.

사이트프라이버시 예산 저장소와 달리, 전역 프라이버시 예산 저장소사이트가 아니라 에포크 인덱스로만 키 지정된다.

노출 사이트 할당량 저장소는 키가 프라이버시 예산 키이고 값이 32비트 부호 없는 정수이며, 마이크로엡실론 단위이다.

노출 사이트 할당량 저장소는 하나의 에포크에서 어떤 단일 노출 사이트가 기여할 수 있는 “stock” (노출과 관련된 프라이버시 예산)의 양을 제한한다. 이는 단일 노출 사이트가 악의적으로 유발될 수 있는 전역 한계에서 과도한 양을 소비하는 것을 방지한다.

프라이버시 및 안전 예산을 차감하려면, 프라이버시 예산 키 key, 집합노출 impressions, double epsilon, 정수 value, 정수 maxValue, 불리언 isSingleEpoch, 정수 l1Norm, 집합프라이버시 예산 키 deductedImpressionQuotas집합에포크 인덱스 deductedGlobalBudgets가 주어졌을 때:
  1. l1NormSensitivityisSingleEpoch이면 l1Norm, 그렇지 않으면 2 * value로 둔다.

  2. valueSensitivity를 2 * value로 둔다.

  3. noiseScale을 2 * maxValue / epsilon으로 둔다.

  4. l1NormDeductionFpl1NormSensitivity / noiseScale로 둔다.

  5. valueDeductionFpvalueSensitivity / noiseScale로 둔다.

    단일 에포크 어트리뷰션은 에포크 전반에 걸친 연쇄 효과를 일으키지 않는다. 여러 에포크를 수반하는 어트리뷰션은 하나의 변경이 에포크 전반의 어트리뷰션에 영향을 미칠 가능성이 있으므로 두 배의 예산을 소비한다. 이 차감량을 두 배로 하는 것은 maxValue / epsilon에 비례하는 Laplace 노이즈가 집계된 히스토그램에 추가된다고 가정한다.

  6. l1NormDeductionl1NormDeductionFp * 1000000을 양의 무한대 방향으로 올림한 값으로 둔다.

  7. valueDeductionvalueDeductionFp * 1000000을 양의 무한대 방향으로 올림한 값으로 둔다.

  8. 어트리뷰션 예산 잠금이 true이면, 그 값이 false가 될 때까지 기다린 다음, 그 값을 true로 설정한다.

  9. deductionisSingleEpoch가 true이면 l1NormDeduction, 그렇지 않으면 valueDeduction으로 둔다.

  10. key, deduction, valueDeductionimpressions사용 가능한 프라이버시 예산 확인을 호출한 결과가 false이면, 다음 단계를 수행한다:

    1. 어트리뷰션 예산 잠금을 false로 설정한다.

    2. false를 반환한다.

  11. 모든 예산 확인을 통과했으므로, 다음 차감을 수행한다:

    1. currentValue값을 가져오기key의 값을 프라이버시 예산 저장소에서 가져온 결과로 두되, 기본값은 사이트별 프라이버시 예산으로 한다.

    2. 설정을 수행하여 프라이버시 예산 저장소key 값을 currentValuededuction으로 설정한다.

    3. epochkey에포크 인덱스 구성요소로 둔다.

    4. deductedGlobalBudgetsepoch포함하지 않으면, deductedGlobalBudgetsepoch추가하고, 전역 프라이버시 예산 저장소[epoch]를 valueDeduction만큼 감소시킨다.

    5. impressions의 각 impression에 대해 반복한다:

      1. impressionSiteimpression노출 사이트로 둔다.

      2. impressionQuotaKey를 그 항목이 epochimpressionSite프라이버시 예산 키로 둔다.

        아래는 해당 사이트에 대해 여러 노출이 있을 때 동일한 노출 사이트 할당량에서 예산을 두 번 이상 차감하지 않도록 보장한다.

      3. deductedImpressionQuotasimpressionQuotaKey포함하지 않으면:

        1. 추가를 수행하여 deductedImpressionQuotasimpressionQuotaKey를 추가한다.

        2. currentImpressionQuotaValue값을 가져오기impressionQuotaKey의 값을 에포크별 노출 사이트 할당량에서 가져온 결과로 두되, 기본값은 에포크별 노출 사이트 할당량으로 한다.

        3. 설정을 수행하여 에포크별 노출 사이트 할당량[impressionQuotaKey\]의 값을 currentImpressionQuotaValuevalueDeduction으로 설정한다.

  12. 어트리뷰션 예산 잠금을 false로 설정한다.

  13. true를 반환한다.

사용 가능한 프라이버시 예산을 확인하려면, 프라이버시 예산 키 key, 정수 deduction, 정수 valueDeduction, 및 집합노출 impressions가 주어졌을 때:
  1. currentValue값을 가져오기key의 값을 프라이버시 예산 저장소에서 가져온 값으로 설정하되, 기본값은 사이트별 프라이버시 예산으로 한다.

  2. deductioncurrentValue보다 크면, false를 반환한다.

  3. epochkey에포크 인덱스 구성요소로 둔다.

  4. currentGlobalValueepoch의 값을 값을 가져오기전역 프라이버시 예산 저장소에서 가져온 값으로 설정하되, 기본값은 에포크별 전역 프라이버시 예산으로 한다.

  5. valueDeductioncurrentGlobalValue보다 크면, false를 반환한다.

  6. impressions의 각 impression에 대해 반복한다:

    1. impressionSiteimpression노출 사이트로 둔다.

    2. impressionQuotaKey를 그 항목이 epochimpressionSite프라이버시 예산 키로 둔다.

    3. currentImpressionQuotaValue값을 가져오기impressionQuotaKey의 값을 노출 사이트 할당량 저장소에서 가져온 값으로 설정하되, 기본값은 에포크별 노출 사이트 할당량으로 한다.

    4. valueDeductioncurrentImpressionQuotaValue보다 크면, false를 반환한다.

  7. true를 반환한다.

4.2.2. Attribution API 활성화

Attribution API는 대략 일시적 활성화 소비 API를 본뜬 것으로, 여기서 사용자 활성화는 일시적으로 API를 사용할 수 있게 한다. 이 설계는 일시적 활성화 소비 API와 구별되는 여러 차이점이 있다:

이는 효과 면에서 일시적 활성화와 대체로 유사하다. 그러나 attribution 활성화는 일시적 활성화와 별도의 상태를 사용하며, 그 상태는 다르게 추적된다. Attribution 활성화 상태는 영향을 받는 Window들이 아니라, 최상위 traversable에서 추적된다. 그 결과, attribution 활성화는 탐색을 거쳐서도 유지되어, 활성화가 탐색으로 이어지는 경우 새 페이지를 로드한 후 짧은 기간 동안 API를 사용할 수 있게 한다.

별도의 상태를 두면 attribution 활성화가 일시적 활성화 소비 API와 상호작용하지 않도록 보장한다. 활성화를 소비하는 API는 Attribution API를 사용할 수 없게 만들지 않으며, 마찬가지로 Attribution API를 사용해도 일시적 활성화 소비 API를 사용할 수 없게 만들지 않는다.

별도의 상태 추적은 사용자 활성화를 소비하는 사용자 동작을 Attribution API로 독립적으로 측정할 수 있게 보장한다.

탐색을 넘어 활성화를 유지하면 광고에서 흔히 쓰이는 패턴이 가능해진다. Site는 상호작용이 발생한 site에서 또는 이후의 site에서 Attribution API를 사용하여 동작을 검사할 수 있다.

이를 구현하기 위해, 각 최상위 traversable은 Attribution API에 대해 두 가지 상태를 추적한다:

  1. attribution enabled flag는 API가 활성화되어 있는지를 추적하는 boolean 값이다. 이 값은 false로 초기화된다.

  2. attribution activation timestamp는 마지막 사용자 활성화를 추적하는 moment이다. 이 값은 unix epoch로 초기화된다.

구현은 또한 attribution activation duration구현 정의 duration으로 구성한다. 이는 transient activation duration보다 짧아서는 안 되며, 다만 탐색으로 인한 지연 때문에 Attribution API에 접근할 수 없게 되는 일이 없도록 더 큰 값이 바람직할 수 있다.

구현은 탐색 중 페이지 콘텐츠를 로드하는 데 수반되는 지연을 고려하기 위해 허용 시간을 연장하도록 선택할 수 있다. 고정된 값은 기기 또는 네트워크의 성능 차이를 고려하지 못할 수 있다. 구현은 성능 특성에 대한 이해를 바탕으로 어트리뷰션 활성화 기간의 값을 연장할 수 있다. 또는 구현은 페이지 로드 중에 모든 타이머를 일시 중단할 수도 있다.

사용자 상호작용으로 인해 Document document에서 activation triggering input event가 발생하면, 사용자 에이전트는 이벤트를 dispatch하기 전에 activation notification 단계에 더하여 아래 단계를 must 수행해야 한다. 이 경우 navigable navigable을 null로 설정한다.

또는 탐색이 시작되고, 사용자 탐색 관여"browser UI"인 경우, navigable을 영향을 받는 navigable로 설정하고 document를 null로 설정하여 아래 단계를 수행한다.

단계는 다음과 같다:

  1. navigable이 null이 아니라면, nnavigable로 둔다.

  2. 그렇지 않으면 ndocumentnode navigable을 가져온 결과로 둔다.

  3. topn최상위 traversable을 가져온 결과로 둔다.

  4. topattribution activation timestampcurrent high resolution time으로 설정한다.

최상위 traversable top탐색될 때, navigate 알고리즘의 일부로, document state documentState가 확정되고, responseoriginresponseOrigin을 알게 된 후, 다음 단계를 수행한다:
  1. documentStateinitiator originresponseOriginsame site라면 반환한다.

  2. topattribution enabled flag를 false로 설정한다.

Document document가 주어졌을 때, 실패 시 "NotAllowedError" DOMException을 throw하면서 check attribution API activation하려면:
  1. ndocument노드 navigable을 가져온 결과로 둔다.

  2. topn최상위 traversable을 가져온 결과로 둔다.

  3. top어트리뷰션 활성화 플래그가 true이면 반환한다.

  4. lastActivationtop어트리뷰션 활성화 타임스탬프로 둔다.

  5. lastActivation어트리뷰션 활성화 기간을 더한 값이 현재 고해상도 시간보다 작으면, "NotAllowedError" DOMException을 throw한다.

  6. 어트리뷰션 활성화 타임스탬프유닉스 epoch로 설정한다.

  7. top어트리뷰션 활성화 플래그를 true로 설정한다.

4.2.3. 에포크 시작 시각

privacy budget epoch는 (또는 epoch는) 일정 기간을 식별한다. epoch의 길이는 1주 또는 7 로 고정되며, 여기서 은 86400 초로 정의된다.

epoch start timewall clockmoment이다. epoch는 각 사용자 에이전트에 대해 무작위로 선택된 한 주의 시간에 시작된다. 이는 privacy budget이 0에 도달함으로써 발생하는 집계의 편향이 모든 사용자의 모든 기여에 걸쳐 평균화되도록 보장한다.

같은 기기에서는 모든 privacy budget 및 quota가 epoch start time에 따라 같은 시간에 갱신된다.

시작 시간은 epoch가 처음 필요해질 때 사용자 에이전트에 의해 무작위로 선택된다—​이는 현재 epoch를 얻는 알고리즘을 호출하는 부수 효과이다.

epoch index는 주어진 epoch를 참조하는 정수이다. epoch indeximpressionepoch start time에 접근하는 데 사용된다.

moment가 다른 moment에 대한 상대적인 duration으로만 표현될 수 있는 추상 개념인 것과 마찬가지로, epoch도 추상적이다.

Epoch index는 정해진 기준점을 기준으로 하는 정수로 저장된다. 이 명세의 epoch indexepoch start time을 기준점으로 사용한다. 사용자 에이전트는 "0" 또는 기준 epoch를 나타내기 위해 다른 moment를 사용하도록 선택할 수도 있다.

이 명세의 알고리즘은 모두 더 추상적인 epoch가 아니라 구체적인 epoch index를 사용한다. 시간상의 지점현재 epoch를 얻는 알고리즘을 사용하여 해당 epochepoch index로 변환된다.

moment t가 주어졌을 때, epoch index를 반환하면서 현재 epoch를 얻으려면:
  1. period를 하나의 epochduration이라고 하자.

  2. epoch start time이 설정되어 있지 않으면, 이를 다음과 같이 지난 epoch 안에서 무작위로 선택된 시간으로 설정한다:

    1. randt에서 0(포함)과 period(제외) 사이에서 무작위로 선택된 duration을 뺀 값이라고 하자.

    2. msUnix epoch부터 rand까지의 duration from 안의 밀리초 수라고 하자.

    3. hourms를 3600000 (밀리초 단위의 한 시간)으로 나눈 뒤 0 쪽으로 반올림하고 다시 3600000을 곱한 값이라고 하자.

    4. epoch start timeUnix epochduration으로서 hour를 더한 값으로 설정한다.

  3. startepoch start time이라고 하자.

  4. elapsed를 (tstart) / period라고 하자.

  5. elapsed를 음의 무한대 쪽으로 반올림한 정수로 반환한다.

4.2.4. 마지막 브라우징 이력 삭제 시각

last browsing history clearwall clock을 사용하는 moment이며, browsing history가 마지막으로 삭제된 때를 추적한다. last browsing history clear 값은 현재 coarse된 wall time으로 갱신된다. 이는 사용자의 요청으로 어떤 site 수준 상태가 삭제될 때 이루어진다. 이 값은 처음에는 설정되어 있지 않다.

선택적 최적화로서, 다음 모두가 true이면 last browsing history clear를 갱신하는 것을 건너뛸 수 있다:

세 조건이 모두 true이면, last browsing history clear는 갱신될 필요가 없다. 대신, 영향을 받은 모든 siteepoch로부터 형성될 수 있는 모든 privacy budget key 조합에 대해 값 0을 설정하여 privacy budget store를 갱신해야 한다 (해당 epoch index 사용).

이 최적화는 사용자 에이전트가 영향을 받은 site들과의 상호작용에 관한 정보를 영향을 받은 epoch에서 유지하고 있는 것에 의존한다. 이는 유지된 상호작용 중 어느 것이든 budget을 소진시키는 결과를 낳았을 수 있기 때문에만 작동한다. budget을 재설정하는 것은 browsing history의 공백에 관한 정보가 노출되지 않도록 보장하기 위해 필요하다.

moment now가 주어졌을 때, epoch index를 반환하면서 attribution을 위한 시작 epoch를 얻으려면:
  1. earliestEpochIndexnowmaximum lookback 과 함께 현재 epoch를 얻은 결과라고 하자.

    이는 가능한 모든 impression을 질의할 수 있도록 보장한다.

  2. startEpochearliestEpochIndex라고 하자.

  3. last browsing history clear가 설정되어 있으면, 다음 단계를 수행한다:

    1. clearEpochlast browsing history clear의 값과 함께 현재 epoch를 얻은 결과라고 하자.

      현재 epoch를 얻는 사용은 음수 값을 반환할 수 있다. 이는 epoch start time이 history가 마지막으로 삭제된 뒤의 시간으로 설정될 가능성이 높기 때문이다.

    2. clearEpochclearEpoch + 1로 설정한다.

      1을 더하는 것은 attribution을 위한 epoch 범위가 browsing history가 삭제되기 전의 epoch와 겹치지 않도록 하기 위해 필요하다.

    3. clearEpochstartEpoch보다 크면, clearEpoch를 반환한다.

  4. startEpoch를 반환한다.

setsite들의 sites, boolean forgetVisits, 그리고 moment now가 주어졌을 때, attribution을 위한 browsing history를 삭제하려면:
  1. forgetVisits가 false이면:

    1. Assert: sites비어 있지 않다.

    2. sites 안의 각 site에 대해 반복한다:

      1. startingEpochnow가 주어졌을 때 attribution을 위한 시작 epoch를 얻는 것을 호출한 결과라고 하자.

      2. currentEpochnow가 주어졌을 때 현재 epoch를 얻는 것을 호출한 결과라고 하자.

      3. startingEpoch부터 currentEpoch까지의 포함 범위 안의 각 epoch에 대해 반복한다:

        1. keysiteepoch로부터 형성된 privacy budget key라고 하자.

        2. privacy budget store[key]를 0으로 설정한다.

    3. 반환한다.

  2. sites비어 있으면:

    1. impression store비운다.

    2. privacy budget store비운다.

    3. impression site quota store비운다.

    4. global privacy budget store비운다.

  3. sites비어 있지 않으면:

    1. impression store 안의 각 impression에 대해 반복하여, sitesimpressionimpression site포함하면, impressionimpression store에서 제거한다.

    2. privacy budget storekey 안의 각 key에 대해 반복하여, siteskeysite 구성요소를 포함하면, privacy budget store[key]를 제거한다.

    3. impression site quota storekey 안의 각 key에 대해 반복하여, siteskeysite 구성요소를 포함하면, impression site quota store[key]를 제거한다.

      이 과정은 global privacy budget store를 건드리지 않는다. 주로 이는 일단 소진된 privacy budget이 잊혀지지 않도록 보장하기 위한 것이다.

  4. last browsing history clearnow로 설정한다.

    last browsing history clear를 설정하면서 일부 site에 대해서만 상태를 삭제하면 (즉, sites비어 있지 않은 경우), 그 set에 존재하지 않는 site에 대해 일부 impression이 도달 불가능해진다. 구현은 그 결과 사용할 수 없게 된 사용 불가능한 impression 및 (예: global privacy budget store 안의 것 같은) budget record도 제거할 수 있다.

4.3. 노출 저장 알고리즘

saveImpression(options) 메서드 단계는 다음과 같다.
  1. implicitInputsthis에서 암시적 API 입력 얻기의 결과로 한다.

  2. Assert: implicitInputs는 null이 아니다.

  3. optionsimplicitInputs노출 저장을 실행한 결과를 반환한다.

AttributionImpressionOptions optionsimplicit API inputs implicitInputs가 주어졌을 때 impression을 저장하려면:
  1. documentimplicitInputsassociated document라고 하자.

  2. realmdocument관련 realm이라고 하자.

  3. document가 "save-impression"라는 이름의 정책 제어 기능사용하도록 허용되어 있지 않으면, realm에서 "NotAllowedError" DOMException으로 rejected된 promise를 반환한다.

  4. document가 주어졌을 때 attribution API 활성화를 검사하고, throw된 이유가 있으면 그것으로 rejected된 promise를 반환한다.

  5. 페이지가 제공한 API 입력을 검증한다:

    1. options.histogramIndex구현 정의 maximum histogram size보다 크거나 같으면, realm에서 RangeErrorrejected된 promise를 반환한다.

    2. options.lifetimeDays가 0이면, realm에서 RangeErrorrejected된 promise를 반환한다.

    3. options.lifetimeDaysmaximum lookback으로 clamp한다.

    4. options.conversionSitessize구현 정의 impression당 maximum number of conversion sites보다 크면, realm에서 RangeErrorrejected된 promise를 반환한다.

    5. conversionSitesoptions.conversionSites 안의 각 값에 대해 site를 파싱한 결과인 set이라고 하자.

    6. conversionSites 안의 어떤 결과라도 failure이면, realm에서 "SyntaxError" DOMException으로 rejected된 promise를 반환한다.

    7. options.conversionCallerssize구현 정의 impression당 maximum number of conversion callers보다 크면, realm에서 RangeErrorrejected된 promise를 반환한다.

    8. conversionCallersoptions.conversionCallers 안의 각 값에 대해 site를 파싱한 결과인 set이라고 하자.

    9. conversionCallers 안의 어떤 결과라도 failure이면, realm에서 "SyntaxError" DOMException으로 rejected된 promise를 반환한다.

  6. 다음 단계를 병렬로 실행한다:

    1. impression을 다음으로 구성된 저장된 impression으로 구성한다:

      Match Value

      options.matchValue

      Impression Site

      implicitInputstop-level site

      Intermediary Site

      implicitInputsintermediary site

      Conversion Sites

      conversionSites

      Conversion Callers

      conversionCallers

      Timestamp

      implicitInputstimestamp

      Lifetime

      options.lifetimeDays

      Histogram Index

      options.histogramIndex

      Priority

      options.priority

    2. Attribution API가 활성화되어 있으면, impressionimpression store에 저장한다.

  7. result를 새 AttributionImpressionResult라고 하자.

  8. realm에서 resultresolved된 promise를 반환한다.

saveImpression()은 impression이 기록되었는지를 나타내는 상태를 반환하지 않는다. 이는 Attribution API가 비활성화되어 있는 때를 탐지하는 능력을 최소화한다.

구현은 API 상태를 드러낼 수 있는 side channel을 완화하려고 반드시 시도해야 한다. 예를 들어, 반환된 promise의 resolution은 impressionimpression store에 저장하는 것에 의존하지 않는다. 이는 resolve되는 데 걸리는 시간이 기존 impression의 수나 API가 활성화되어 있는지 여부에 의존하지 않도록 보장하기 위한 것이다.

implicit API inputs는 다음 필드를 가진 struct이다:

Top-Level Site: site.
Intermediary Site: site 또는 undefined.
Timestamp: moment.
Associated Document: Document.
선택적 origin(기본값 null)과 함께 realm realm에서 implicit API inputs를 얻으려면:
  1. windowrealm전역 객체라고 하자.

  2. windowWindow가 아니면, null을 반환한다.

  3. settingsrealmsettings object라고 하자.

  4. timestampsettingscurrent wall time이라고 하자.

  5. topLevelOriginsettingstop-level origin이라고 하자.

  6. origin이 null이면, originsettingsorigin으로 설정한다.

  7. topLevelSitetopLevelOrigin에서 site를 얻은 결과라고 하자.

  8. intermediarySite를 다음으로 하자:

    1. origintopLevelOriginsame site이면 undefined 값,

    2. 그렇지 않으면, origin에서 site를 얻은 결과.

  9. 다음 필드를 가진 implicit API inputs를 반환한다:

    top-level site

    topLevelSite

    intermediary site

    intermediarySite

    timestamp

    timestamp

    associated document:

    windowassociated document

4.4. 전환 측정 알고리즘

measureConversion() 메서드는 비동기적으로 완료되며, Attribution task source에 작업을 queue한다.

measureConversion(options) 메서드 단계는 다음과 같다:
  1. implicitInputsthis에서 implicit API inputs를 얻은 결과라고 하자.

  2. Assert: implicitInputs는 null이 아니다.

  3. optionsimplicitInputs와 함께 conversion을 측정한 결과를 반환한다.

AttributionConversionOptions optionsimplicit API inputs implicitInputs가 주어졌을 때 conversion을 측정하려면:
  1. documentimplicitInputsassociated document라고 하자.

  2. realmdocument관련 realm이라고 하자.

  3. document가 "measure-conversion"라는 이름의 정책 제어 기능사용하도록 허용되어 있지 않으면, realm에서 "NotAllowedError" DOMException으로 rejected된 promise를 반환한다.

  4. 어트리뷰션 API 활성화 확인document가 주어지면, 던져진 모든 이유와 함께 거부된 promise를 반환한다.

  5. validatedOptionsoptions검증한 결과라고 하며, throw된 이유가 있으면 그것으로 rejected된 promise를 반환한다.

  6. promiserealm 안의 새 promise라고 하자.

  7. 다음 단계를 병렬로 실행한다:

    1. reportvalidatedOptionshistogram size와 함께 all-zero histogram을 생성한 결과라고 하자.

    2. Attribution API가 활성화되어 있으면, reportvalidatedOptions, implicitInputstop-level site, implicitInputsintermediary site, 그리고 implicitInputstimestamp와 함께 attribution을 수행하고 histogram을 채운 결과로 설정한다.

    3. aggregationServicevalidatedOptionsaggregation service라고 하자.

    4. aggregationService.protocol의 값에 대해 switch한다:

      dap-18-histogram

      다음 단계를 수행한다:

      1. encryptedReportvalidatedOptions, implicitInputs최상위 site, implicitInputs중개 site, implicitInputstimestampreport가 주어졌을 때, DAP report 구성을 호출한 결과로 둔다.

    5. result를 다음 항목을 가진 AttributionConversionResult라고 하자:

      report

      encryptedReport

    6. promiseresultresolve하도록, Attribution task sourcetask를 queue한다.

  8. promise를 반환한다.

구현은 API 상태를 드러낼 수 있는 side channel을 완화하려고 반드시 시도해야 한다. 예를 들어, 이상적으로는 반환된 promise가 resolve되는 데 걸리는 시간이 저장되었거나 match된 impression의 수 또는 API가 활성화되어 있는지 여부에 의존하지 않아야 한다.

Validated conversion options는 다음 필드를 가진 struct이다:

Aggregation Service: AttributionAggregationService의 인스턴스.
Epsilon: 유한한 양수.
Histogram Size: 32-bit unsigned integer.
Lookback: 양의 duration.
Match Values: set of 32-bit unsigned integers.
Impression Sites: set of site.
Impression Callers: set of site.
Credit: 숫자들의 list.
Value: 32-bit unsigned integer.
Max Value: 32-bit unsigned integer.
optionsAttributionConversionOptions검증하려면:
  1. aggregationServicesoptions.aggregationServicekey를 가진 entry포함하지 않으면, ReferenceError를 throw한다.

  2. aggregationServiceoptions.aggregationService가 주어졌을 때, AttributionAggregationServices에서 값을 얻은 결과라고 하자.

  3. options.epsilon이 0 이하이거나 maximum epsilon보다 크면, RangeError를 throw한다.

  4. options.histogramSize가 0이거나 구현 정의 maximum histogram size보다 크거나, options.aggregationService에 대한 maximum aggregation-service histogram size가 있다면 그보다 크면, RangeError를 throw한다.

  5. options.value가 0이면, RangeError를 throw한다.

  6. options.valueoptions.maxValue보다 크면, RangeError를 throw한다.

  7. credit을, options.credit존재하면 그것으로, 그렇지 않으면 «1»로 하자.

  8. credit비어 있으면, RangeError를 throw한다.

  9. credit항목 중 하나라도 유한하지 않거나 0 이하인 경우, RangeError를 throw한다.

  10. creditsize구현 정의 maximum number of credit values를 초과하면, RangeError를 throw한다.

  11. lookbackoptions.lookbackDays존재하면 그 수로, 그렇지 않으면 maximum lookback 로 하자.

  12. lookbackmaximum lookback 보다 크면 그 maximum으로 설정한다.

  13. lookback이 0 이면, RangeError를 throw한다.

  14. options.matchValuessize구현 정의 maximum number of match values보다 크면, RangeError를 throw한다.

  15. matchValuesoptions.matchValues와 함께 set를 생성한 결과라고 하자.

  16. options.impressionSitessize구현 정의 conversion에 대한 maximum number of impression sites보다 크면, RangeError를 throw한다.

  17. impressionSitesoptions.impressionSites 안의 각 값에 대해 site를 파싱한 결과인 set이라고 하자.

  18. impressionSites 안의 어떤 결과라도 failure이면, "SyntaxError" DOMException을 throw한다.

  19. options.impressionCallerssize구현 정의 conversion에 대한 maximum number of impression callers보다 크면, RangeError를 throw한다.

  20. impressionCallersoptions.impressionCallers 안의 각 값에 대해 site를 파싱한 결과인 set이라고 하자.

  21. impressionCallers 안의 어떤 결과라도 failure이면, "SyntaxError" DOMException을 throw한다.

  22. 다음 필드를 가진 validated conversion options를 반환한다:

    Aggregation Service

    aggregationService

    Epsilon

    options.epsilon

    Histogram Size

    options.histogramSize

    Lookback

    lookback

    Match Values

    matchValues

    Impression Sites

    impressionSites

    Impression Callers

    impressionCallers

    Credit

    credit

    Value

    options.value

    Max Value

    options.maxValue

4.4.1. 어트리뷰션 로직

어트리뷰션 로직전환 값이 히스토그램 버킷에 어떻게 할당되는지를 결정한다.

attribution을 수행하고 histogram을 채우려면, 다음이 주어졌을 때 validated conversion options options, site topLevelSite, site 또는 undefined intermediarySite, 그리고 moment now:
  1. currentEpochnow현재 에포크 얻기를 수행한 결과로 한다.

  2. startEpochnow어트리뷰션 시작 에포크 얻기를 수행한 결과로 한다.

  3. earliestEpoch를 (nowoptions룩백)을 전달하여 현재 에포크 얻기를 호출한 결과로 한다.

  4. currentEpochearliestEpoch와 같으면 isSingleEpoch를 true로, 그렇지 않으면 false로 한다.

  5. l1Norm을 0으로 한다.

  6. isSingleEpoch가 true이면:

    1. impressionsoptions, topLevelSite, intermediarySite, currentEpoch, 및 now공통 매칭 로직을 호출한 결과로 한다.

    2. impressions비어 있으면, options히스토그램 크기전부 0인 히스토그램 생성을 호출한 결과를 반환한다.

    3. histogramimpressions, options히스토그램 크기, options, 및 options크레딧으로 last-n-touch 어트리뷰션으로 히스토그램 채우기를 수행한 결과로 한다.

    4. l1Normhistogram 안의 항목의 합으로 설정한다.

    5. Assert: l1Normoptions 이하이다.

  7. deductedImpressionQuotas를 새 집합으로 한다.

  8. deductedGlobalBudgets를 새 집합으로 한다.

  9. matchedImpressions 집합으로 한다.

  10. startEpoch에서 currentEpoch까지의 각 epoch에 대해, 양 끝 포함:

    1. impressionsoptions, topLevelSite, intermediarySite, epoch, 및 now공통 매칭 로직을 호출한 결과로 한다.

      단일 에포크의 경우, 이는 matchedImpressions를 다시 계산하는 것이다. 구현은 이 작업을 두 번 수행하지 않으려 할 것이다.

    2. impressions비어 있지 않으면:

      1. key를 항목이 epochtopLevelSite프라이버시 예산 키로 한다.

      2. budgetAndSafetyOkkey, impressions, options엡실론, options, options최대 값, isSingleEpoch, l1Norm, deductedImpressionQuotas, 및 deductedGlobalBudgets프라이버시 및 안전 예산 차감을 호출한 결과로 한다.

      3. budgetAndSafetyOk가 true이면, matchedImpressionsimpressions확장한다.

  11. matchedImpressions비어 있으면, options히스토그램 크기전부 0인 히스토그램 생성을 호출한 결과를 반환한다.

  12. histogrammatchedImpressions, options히스토그램 크기, options, 및 options크레딧으로 last-n-touch 어트리뷰션으로 히스토그램 채우기를 수행한 결과로 한다.

  13. histogram을 반환한다.

정수 size가 주어졌을 때 전부 0인 히스토그램을 생성하려면:
  1. 크기 size목록을 반환하며, 그 항목은 모두 0이다.

4.4.2. 공통 노출 매칭 로직

공통 matching logic을 수행하려면, 다음이 주어졌을 때 validated conversion options options, site topLevelSite, site 또는 undefined intermediarySite, epoch index epoch, 그리고 moment now:
  1. matching 집합으로 한다.

  2. 각각에 대해, 노출 저장소 안의 impression에 대해:

    1. impressionEpochimpression타임스탬프를 전달하여 현재 에포크 얻기를 호출한 결과로 한다.

    2. impressionEpochepoch와 같지 않으면, 계속한다.

    3. nowimpression타임스탬프impression수명을 더한 시각 이후이면, 계속한다.

    4. nowimpression타임스탬프options룩백을 더한 시각 이후이면, 계속한다.

    5. impression전환 사이트비어 있지 않고 topLevelSite포함하지 않으면, 계속한다.

    6. conversionCallerintermediarySiteundefined가 아니면 그것으로, 그렇지 않으면 topLevelSite로 한다.

    7. impression전환 호출자비어 있지 않고 conversionCaller포함하지 않으면, 계속한다.

    8. options매치 값비어 있지 않고 impression매치 값포함하지 않으면, 계속한다.

    9. options노출 사이트비어 있지 않고 impression노출 사이트포함하지 않으면, 계속한다.

    10. impressionCallerimpression중개자 사이트undefined가 아니면 그것으로, 그렇지 않으면 impression노출 사이트로 한다.

    11. options노출 호출자비어 있지 않고 impressionCaller포함하지 않으면, 계속한다.

    12. impressionmatching추가한다.

  3. matching을 반환한다.

4.4.2.1. Last-N-Touch 어트리뷰션
double의 목록 credit과 정수 value가 주어졌을 때 크레딧을 공정하게 할당하려면:
  1. Assert: credit비어 있지 않다.

  2. sumCreditcredit항목의 합으로 한다.

  3. roundedCredit를 새 목록으로 한다.

  4. credit의 각 item에 대해 반복한다.

    1. normalizedCreditvalue * item / sumCredit로 한다.

    2. normalizedCreditroundedCredit추가한다.

  5. idx1을 0으로 한다.

  6. 첫 번째 항목을 제거한 roundedCredit인덱스 얻기의 각 n에 대해 반복한다.

    1. idx2n으로 한다.

    2. frac1roundedCredit[idx1] − floor(roundedCredit[idx1])로 한다.

    3. frac2roundedCredit[idx2] − floor(roundedCredit[idx2])로 한다.

    4. frac1frac2가 모두 0과 같으면, 계속한다.

    5. frac1 + frac2가 1보다 크면, incr1을 1 − frac1로 하고 incr2를 1 − frac2로 한다.

    6. 그렇지 않으면, incr1을 −frac1로 하고 incr2를 −frac2로 한다.

      incr1roundedCredit[idx1]이 정수가 되도록 증가시킬 양을 나타내며, incr2idx2에 대해서도 마찬가지다. 이 값들은 음수일 수 있음에 유의한다.

    7. p1incr2 / (incr1 + incr2)로 한다.

      p1 값은 idx1항목이 정수로 반올림될 확률을 나타낸다. 0으로 나누기는 incr1 + incr2가 0일 때 발생하며, 이는 frac1frac2가 모두 정수(둘 다 정확히 0 또는 1)인 경우에만 가능하다. 이 경우 idx2는 반올림될 필요가 없으므로 그냥 건너뛴다.

    8. r을 0 이상 1 이하의 무작위 double로 한다.

    9. rp1보다 작으면, incrincr1로 하고 idx1idx2의 값을 교환한다.

    10. 그렇지 않으면, incrincr2로 한다.

    11. roundedCredit[idx2]를 incr만큼 증가시킨다.

    12. roundedCredit[idx1]를 incr만큼 감소시킨다.

  7. integerCreditroundedCredit항목 각각을 가장 가까운 정수로 반올림하고, 정확히 절반인 경우는 0에서 멀어지는 방향으로 반올림하여 정수로 변환한 결과로 한다.

  8. integerCredit를 반환한다.

    이 최종 반올림 단계는 극히 작은 부동소수점 더하기 및 빼기 오류가 roundedCredit[idx1]의 소수 부분을 완전히 제거하지 못하는 경우에만 여기에 있다. 절반에서의 반올림 모드는 실제로 발생하지 않으며, 구현을 쉽게 하기 위해 C++ std::round 동작과 일치하도록 선택되었다.

    이 알고리즘은 1) 할당 전체에 정확히 value의 총 값을 할당하고, 2) integerCredit의 기대값이 정규화된 크레딧 (즉, 요소별 곱셈을 *로 나타낼 때 credit * value / sumCredit)과 정확히 같다는 속성을 유지하며, 3) 어떤 할당에서도 1보다 큰 오류가 발생하지 않도록 하는 것을 목표로 한다.

노출집합 matchedImpressions, 정수 histogramSize, 정수 value, 및 double의 목록 credit가 주어졌을 때, last-n-touch 어트리뷰션으로 히스토그램을 채우려면:
  1. Assert: matchedImpressions비어 있지 않다.

  2. sortedImpressionsmatchedImpressions로 하고, 우선순위와 그다음 타임스탬프에 따라 내림차순으로 정렬한다.

  3. Ncredit크기sortedImpressions크기 중 최솟값으로 한다.

  4. lastNImpressionssortedImpressions의 처음 N개 엔트리로 한다.

  5. credit의 처음 N개 엔트리를 제외한 나머지를 모두 제거한다.

  6. normalizedCreditcreditvalue크레딧을 공정하게 할당한 결과로 한다.

  7. histogramhistogramSize전부 0인 히스토그램 생성을 호출한 결과로 한다.

  8. lastNImpressions인덱스 각각의 i에 대해 반복한다.

    1. impressionlastNImpressions[i]로 한다.

    2. valuenormalizedCredit[i]로 한다.

    3. indeximpression히스토그램 인덱스로 한다.

    4. indexhistogram크기보다 작으면, histogram[index]를 value만큼 증가시킨다.

  9. histogram을 반환한다.

4.5. 구현 정의 값 설정

이 명세는 여러 구현 정의 값을 식별한다. 이 절은 구현이 이러한 값을 가장 적절하게 설정하는 방법에 관한 몇 가지 권고를 포함한다.

구현은 lifetimeDayslookbackDays에 대해 구현 정의 maximum lookback을 설정한다. Maximum lookback은 양의 정수 개수의 이다. 이 두 값 중 더 작은 값이 어떤 저장된 impression을 conversion에 사용할 수 있는지를 결정하므로, 이 값들에 대해 서로 다른 maximum 값을 두는 것은 의미가 없다.

구현은 최소 30일의 maximum lookback을 설정해야 한다. 이 기간 내에서 구현은 가능하면 impression site당 최소 1000개의 impression을 유지하려고 시도해야 한다.

구현은 가능하다면 시간 및 개수에 관한 이러한 권고 한계를 넘어 impression을 유지해야 한다. impression을 저장하는 데 사용할 수 있는 용량은 impression 데이터를 유지하는 데 필요한 storage와 conversion report를 생성하는 데 필요한 처리 시간 모두에 의존한다. 사이트가 사용 가능한 용량을 초과하여 impression 저장을 요청하거나, 사용자가 요청한 경우(§ 9.2 Disabling the Attribution API 참조), 또는 구현 정의 이유로, 구현은 이러한 한계에 도달하기 전에 impression을 폐기할 수 있다.

구현이 impression을 유지하지 않기로 선택할 수 있는 한 가지 가능한 이유는 해당 사이트가 충분한 사용자 참여를 받지 못했기 때문이다.

구현 정의 값은 saveImpression()measureConversion()에 전달되는 사이트 목록에 대해 선택된다. impression당 maximum number of conversion sitesconversionSites의 값 개수에 대한 한계이다. 구현은 이 값을 최소 5로 설정해야 한다. impression당 maximum number of conversion callersconversion에 대한 maximum number of impression callers는 각각 conversionCallersimpressionCallers의 값 개수에 대한 한계이다. 구현은 이 값들을 각각 최소 10으로 설정해야 한다. conversion에 대한 maximum number of impression sitesimpressionSites의 값 개수에 대한 한계이다. 구현은 이 값을 최소 30으로 설정해야 한다.

구현 정의 값은 maximum number of credit values에 대해 선택되며, 이는 credit의 값 개수에 대한 한계이다. 구현은 이 값을 최소 10으로 설정해야 한다. 구현 정의 값은 maximum number of match values에 대해 선택되며, 이는 matchValues의 값 개수에 대한 한계이다. 구현은 이 값을 최소 30으로 설정해야 한다.

measureConversion()이 생성하는 histogram의 size에는 구현 정의 maximum histogram sizemaximum aggregation-service histogram size 둘 다 적용된다. maximum histogram size에 대한 minimum 값은 설정되지 않는다. 집계 기술의 선택이 한계를 설정할 것으로 예상되기 때문이다. maximum aggregation-service histogram sizeaggregation service가 사용하는 기술 선택에 따라 결정되는 고정된 값이 된다. 이는 구현 정의가 아니다.

4.5.1. 프라이버시 및 안전 한계 매개변수 구성

사용자 에이전트는 다음에 대한 값을 정의하여 privacy budgetsafety limit을 구성한다:

safety limit을 per-site budget의 배수로 구성하면 API가 여러 site에 의해 어떻게 사용될 수 있는지가 결정된다. 이 배수를 설정할 때, 구현은 budget을 사용할 수 있는 site의 수가 얼마나 될 것으로 예상하는지 고려해야 하며, budget을 완전히 사용하지 않는 site를 감안해 이를 낮춰 조정할 수도 있다.

safety limit을 per-site budget의 배수로 설정하면 공유된 limit을 소진하려면 많은 site의 협력이 필요하게 되어, 이를 주요 privacy 메커니즘이 아니라 주로 남용 방지를 위한 수단으로 유용하게 만든다.

5. HTTP API

5.1. 노출 저장

`Save-Impression`은 사용자 에이전트가 saveImpression() API를 호출하도록 요청하는 response에 설정되는 Dictionary Structured Header이다.

이는 JavaScript saveImpression 예제의 HTTP 대응물이다:
Save-Impression: histogram-index=3, match-value=2, conversion-sites=("advertiser.example"), lifetime-days=7

다음 key가 정의되며, 이는 saveImpression()에 전달되는 AttributionImpressionOptions dictionary의 member에 대응한다. 생략된 선택적 key에 대한 기본값은 대응하는 AttributionImpressionOptions field와 같은 방식으로 취급된다. 알 수 없는 dictionary key는 무시되며, 알 수 없는 parameter도 마찬가지다.

conversion-sites
conversionSites의 값으로, 문자열을 포함하는 inner list이다. 각 문자열 값은 A-label만 사용하는 도메인 이름을 포함한다. 따라서 국제화 도메인 이름punycode를 사용해야 한다. 이 키는 선택 사항이다.
conversion-callers
conversionCallers의 값으로, 문자열을 포함하는 inner list이다. 각 문자열 값은 A-label만 사용하는 도메인 이름을 포함한다. 따라서 국제화 도메인 이름punycode를 사용해야 한다. 이 키는 선택 사항이다.
histogram-index
histogramIndex의 값으로, 32비트 부호 없는 정수 범위의 정수이다. 이 키는 필수이다.
priority
priority의 값으로, 32비트 부호 있는 정수 범위의 정수이다. 이 키는 선택 사항이다.
match-value
matchValue의 값으로, 32비트 부호 없는 정수 범위의 정수이다. 이 키는 선택 사항이다.
lifetime-days
lifetimeDays의 값으로, 양의 정수이다. 이 키는 선택 사항이다.
헤더 값 input이 주어졌을 때, Save-Impression 헤더를 파싱하려면 다음 단계를 실행한다.
  1. dictinput_bytesinput으로, field_type을 "dictionary"로 설정하여 structured fields 파싱을 수행한 결과로 한다.

  2. 파싱에 실패하면, 오류를 반환한다.

  3. histogramIndexdict["histogram-index"] 에서 가져오되, 기본값undefined로 한다.

  4. histogramIndex32비트 부호 없는 정수 범위의 정수가 아니면, 오류를 반환한다.

  5. opts를 다음 항목을 가진 새 AttributionImpressionOptions로 한다.

    histogramIndex

    histogramIndex

  6. dict["conversion-sites"] 가 존재하면:

    1. conversionSites를 그 으로 한다.

    2. conversionSitesinner list가 아니거나, conversionSites항목 중 하나라도 문자열이 아니면, 오류를 반환한다.

    3. opts.conversionSitesconversionSites로 설정한다.

  7. dict["conversion-callers"] 가 존재하면:

    1. conversionCallers를 그 으로 한다.

    2. conversionCallersinner list가 아니거나, conversionCallers항목 중 하나라도 문자열이 아니면, 오류를 반환한다.

    3. opts.conversionCallersconversionCallers로 설정한다.

  8. dict["match-value"] 가 존재하면:

    1. matchValue를 그 으로 한다.

    2. matchValue32비트 부호 없는 정수 범위의 정수가 아니면, 오류를 반환한다.

    3. opts.matchValuematchValue로 설정한다.

  9. dict["lifetime-days"] 가 존재하면:

    1. lifetimeDays를 그 으로 한다.

    2. lifetimeDays가 양의 정수가 아니면, 오류를 반환한다.

    3. opts.lifetimeDayslifetimeDays로 설정한다.

  10. dict["priority"] 가 존재하면:

    1. priority를 그 으로 한다.

    2. priority32비트 부호 있는 정수 범위의 정수가 아니면, 오류를 반환한다.

    3. opts.prioritypriority로 설정한다.

  11. opts를 반환한다.

5.2. 전환 측정

`Measure-Conversion`은 사용자 에이전트가 measureConversion() API를 호출하도록 요청하는 response에 설정되는 Dictionary Structured Header이다.

이는 JavaScript measureConversion 예제의 HTTP 대응물이며, 결과 report가 POSTreport-url이 추가되어 있다:
Measure-Conversion: aggregation-service="https://aggregator.example/tee", histogram-size=20, epsilon=1.0, lookback-days=14, impression-sites=("publisher.example" "other.example"), impression-callers=("ad-tech.example"), match-values=(2), credit=(0.25 0.25 0.5), value=3, max-value=7, report-url="https://report-handler.example/foo"

다음 key가 정의되며, 이는 measureConversion()에 전달되는 AttributionConversionOptions dictionary의 member에 대응한다. 생략된 선택적 key에 대한 기본값은 대응하는 AttributionConversionOptions field와 같은 방식으로 취급된다. 알 수 없는 dictionary key는 무시되며, 알 수 없는 parameter도 마찬가지다.

aggregation-service
aggregationService의 값으로, 문자열이다. 이 키는 필수이다.
epsilon
epsilon의 값으로, 양의 decimal 또는 정수이다. 이 키는 선택 사항이다.
histogram-size
histogramSize의 값으로, 양의 정수이다. 이 키는 필수이다.
lookback-days
lookbackDays의 값으로, 양의 정수이다. 이 키는 선택 사항이다.
match-values
matchValues의 값으로, 음이 아닌 정수를 포함하는 inner list이다. 이 키는 선택 사항이다.
impression-sites
impressionSites의 값으로, 문자열을 포함하는 inner list이다. 각 문자열 값은 A-label만 사용하는 도메인 이름을 포함한다. 따라서 국제화 도메인 이름punycode를 사용해야 한다. 이 키는 선택 사항이다.
impression-callers
impressionCallers의 값으로, 문자열을 포함하는 inner list이다. 각 문자열 값은 A-label만 사용하는 도메인 이름을 포함한다. 따라서 국제화 도메인 이름punycode를 사용해야 한다. 이 키는 선택 사항이다.
credit
credit의 값으로, 양의 decimal 또는 양의 정수를 포함하는 inner list이다. 이 키는 선택 사항이다.
value
value의 값으로, 양의 정수이다. 이 키는 선택 사항이다.
max-value
maxValue의 값으로, 양의 정수이다. 이 키는 선택 사항이다.
report-url
결과 보고서가 있는 경우 그것이 POST잠재적으로 신뢰할 수 있는 URL을 포함하는 문자열. URL은 응답 URL에 상대적일 수 있다. 그 스킴은 "https"이어야 한다. 이 키는 필수이다.
헤더 값 inputURL baseUrl이 주어졌을 때, Measure-Conversion 헤더를 파싱하려면 다음 단계를 실행한다.
  1. dictinput_bytesinput으로, field_type을 "dictionary"로 설정하여 structured fields 파싱을 수행한 결과로 한다.

  2. 파싱에 실패하면, 오류를 반환한다.

  3. aggregationServicedict["aggregation-service"] 에서 가져오되, 기본값undefined로 한다.

  4. aggregationService문자열이 아니면, 오류를 반환한다.

  5. histogramSizedict["histogram-size"] 에서 가져오되, 기본값undefined로 한다.

  6. histogramSize32비트 부호 없는 정수 범위의 양의 정수가 아니면, 오류를 반환한다.

  7. reportUrlStringdict["report-url"] 에서 가져오되, 기본값undefined로 한다.

  8. reportUrlString문자열이 아니면, 오류를 반환한다.

  9. reportUrlbaseUrl과 함께 reportUrlStringURL parser를 적용한 결과로 한다.

  10. reportUrl가 failure이면, 오류를 반환한다.

  11. reportUrl잠재적으로 신뢰할 수 있는 URL이 아니면, 오류를 반환한다.

  12. reportUrl스킴이 "https"가 아니면, 오류를 반환한다.

  13. opts를 다음 항목을 가진 새 AttributionConversionOptions로 한다.

    aggregationService

    aggregationService

    histogramSize

    histogramSize

  14. dict["epsilon"] 이 존재하면:

    1. epsilon을 그 으로 한다.

    2. epsilondecimal 또는 정수가 아니면, 오류를 반환한다.

    3. opts.epsilonepsilon으로 설정한다.

  15. dict["lookback-days"] 가 존재하면:

    1. lookbackDays를 그 으로 한다.

    2. lookbackDays가 양의 정수가 아니면, 오류를 반환한다.

    3. opts.lookbackDayslookbackDays로 설정한다.

  16. dict["match-values"] 가 존재하면:

    1. matchValues를 그 으로 한다.

    2. matchValuesinner list가 아니거나, matchValues항목 중 하나라도 32비트 부호 없는 정수 범위의 정수가 아니면, 오류를 반환한다.

    3. opts.matchValuesmatchValues로 설정한다.

  17. dict["impression-sites"] 가 존재하면:

    1. impressionSites를 그 으로 한다.

    2. impressionSitesinner list가 아니거나, impressionSites항목 중 하나라도 문자열이 아니면, 오류를 반환한다.

    3. opts.impressionSitesimpressionSites로 설정한다.

  18. dict["impression-callers"] 가 존재하면:

    1. impressionCallers를 그 으로 한다.

    2. impressionCallersinner list가 아니거나, impressionCallers항목 중 하나라도 문자열이 아니면, 오류를 반환한다.

    3. opts.impressionCallersimpressionCallers로 설정한다.

  19. dict["credit"] 이 존재하면:

    1. credit을 그 으로 한다.

    2. creditinner list가 아니거나, credit항목 중 하나라도 decimal 또는 정수가 아니면, 오류를 반환한다.

    3. opts.creditcredit으로 설정한다.

  20. dict["value"] 가 존재하면:

    1. value를 그 으로 한다.

    2. value32비트 부호 없는 정수 범위의 양의 정수가 아니면, 오류를 반환한다.

    3. opts.valuevalue로 설정한다.

  21. dict["max-value"] 가 존재하면:

    1. maxValue를 그 으로 한다.

    2. maxValue32비트 부호 없는 정수 범위의 양의 정수가 아니면, 오류를 반환한다.

    3. opts.maxValuemaxValue로 설정한다.

  22. (opts, reportUrl)를 반환한다.

byte sequence report, URL url, 그리고 environment settings object settings가 주어졌을 때, report를 전송하려면:
  1. Assert: urlpotentially trustworthy URL이다.

  2. Assert: urlscheme은 "https"이다.

  3. headers를 값이 "application/dap-report"인 "Content-Type"이라는 이름의 header를 포함하는 새 header list로 둔다.

    참고: AttributionAggregationProtocol이 언젠가 dap-18-histogram 이외의 값을 갖게 되면 이를 갱신해야 한다.

  4. request를 다음 속성을 갖는 새 request로 둔다:

    method

    "POST"

    URL

    url

    header list

    headers

    body

    report

    client

    settings

    mode

    "cors"

    cache mode

    "no-store"

    keepalive

    true

    credentials mode

    "omit"

    referrer

    url

  5. requestfetch하고, 오류가 발생한 경우 선택적으로 재시도한다.

5.3. Fetch 몽키 패치

request requestresponse response가 주어졌을 때, Attribution 헤더를 처리하려면 다음 단계를 실행한다.
  1. requestdestination이 다음 중 하나가 아니면, 반환한다: "", "audio", "image", "script", "track", "video".

  2. requestclientsecure context가 아니면, 반환한다.

  3. responseURL잠재적으로 신뢰할 수 있는 URL이 아니면, 반환한다.

  4. responseURL스킴이 "https"가 아니면, 반환한다.

  5. implicitInputsrequestclient에서 responseURLorigin과 함께 암시적 API 입력 얻기를 수행한 결과로 한다.

  6. implicitInputs가 null이면, 반환한다.

  7. saveImpressionHeaderresponseheader list에서 `Save-Impression`가져온 결과로 한다.

  8. saveImpressionHeader가 null이 아니면:

    1. impressionOptionssaveImpressionHeader파싱한 결과로 한다.

    2. impressionOptions가 오류가 아니면, implicitInputs와 함께 impressionOptions저장한다.

  9. measureConversionHeaderresponseheader list에서 `Measure-Conversion`가져온 결과로 한다.

  10. measureConversionHeader가 null이 아니면:

    1. parseConversionResultmeasureConversionHeader파싱한 결과로 한다.

    2. parseConversionResult가 오류가 아니면:

      1. (conversionOptions, reportUrl)를 parseConversionResult로 한다.

      2. reportPromiseconversionOptionsimplicitInputs전환 측정을 실행한 결과로 한다.

      3. 병렬로:

        1. reportPromise이행되면, result를 이행된 값으로 한다.

        2. result.report, reportUrl, 및 requestclient보고서 보내기를 수행한다.

HTTP-network fetch를 다음과 같이 수정한다:

다음 단계 뒤에

includeCredentials가 true이면, 사용자 에이전트는 requestresponse가 주어진 상태에서 응답 Set-Cookie 헤더를 파싱하고 저장하는 것이 좋다.

다음 단계를 추가한다

  1. requestresponseAttribution 헤더 처리를 수행한다.

6. 집계

집계 서비스는 여러 개의 어트리뷰션 정보를 받아 집계 지표를 생성한다.

사용자 에이전트 구현체마다 집계에 대한 요구사항은 서로 다를 것이다. 하지만 집계 과정에는 몇 가지 공통 요소가 있다.

첫째, 사용자 에이전트는 집계 서비스에 대한 정보를 설정받거나, 아니면 다른 방식으로 얻어야 한다. 여기에는 지원되는 집계 메서드와 필요한 모든 설정이 포함된다.

각 집계 메서드는 히스토그램이 어떻게 다음과 같이 처리되는지를 정의해야 한다:

또한 집계 메서드는 사이트가 집계 결과를 어떻게 얻는지도 정의해야 한다.

6.1. 다자간 계산 집계

다자간 계산 (MPC) 시스템은 여러 독립 엔티티가 관여하여 합의된 함수를 협력적으로 계산하는 시스템이다.

이 명세는 Prio [PRIO]분산 집계 프로토콜(Distributed Aggregation Protocol, DAP) [DAP]에 기반한 MPC 시스템을 사용한다. 이는 두 당사자 MPC 시스템으로, 입력의 정확성에 대해 클라이언트가 제공하는 증명에 의존한다는 특징이 있다. 이를 통해 시스템에 제출되는 데이터의 크기가 다소 증가하는 비용으로 매우 효율적인 MPC 동작이 가능하다.

MPC를 사용하는 집계 서비스는 미리 정의된 함수를 계산하기 위해 협력하는 두 개 이상의 독립 서비스로 구성된다.

MPC가 제공하는 기본 보장은 함수의 정의된 출력과 명확히 정의된 누출만이 어떤 엔티티에게도 공개된다는 것이다.

MPC 보장은 참여 엔티티의 일부가 정직한 경우에 한해서만 유지된다. Prio에서 사용되는 두 당사자 MPC의 경우, 프라이버시—​즉 입력의 기밀성—​는 어느 한 MPC 운영자가 정직하게 남아 있는 한 유지된다. 이 MPC 구성은 어느 MPC 운영자에 의한 출력 손상은 방지하지 않는다.

6.1.1. Prio 및 DAP

dap-18-histogram 집계 메서드는 Prio [PRIO] 및 분산 집계 프로토콜(DAP) [DAP]을 사용한다. 구체적으로 이 집계 메서드는 Prio3L1BoundSum [PRIO-L1] 검증 가능한 분산 집계 함수(Verifiable Distributed Aggregation Function, VDAF) [VDAF]를 사용한다.

DAP 및 Prio3L1BoundSum 인스턴스화는 보고서가 어떻게 준비되고, 암호화되며, 집계를 위해 제출되는지를 정의한다. 또한 DAP는 집계값이 어떻게 얻어지는지와 사용자 에이전트가 집계 서비스에 대해 어떤 설정 정보를 얻어야 하는지도 정의한다.

Prio3L1BoundSum을 사용할 때, 보고서에는 MPC에 참여하는 노드들이 제출된 히스토그램의 합이 설정된 값보다 작다는 것을 확인할 수 있게 해 주는 분산 영지식 증명이 포함된다. Prio3L1BoundSum은 히스토그램 합이 2의 거듭제곱보다 엄격히 작다는 것만 검증할 수 있다. 즉, 증명은 양의 정수 값 n에 대해 합이 2n보다 작다는 것을 확인한다.

보고서를 구성하기 위해, maxValue보다 큰 다음 2의 거듭제곱 값에 기반하여 증명이 생성된다. 이는 집계 서비스maxValue와 다음 2의 거듭제곱 사이의 보고서를 거부할 수 없음을 의미한다. 따라서 악의적인 사용자 에이전트는 집계 히스토그램에 maxValue 값의 최대 두 배까지 기여하는 보고서를 생성할 수 있다. 증명은 maxValue가 2n − 1과 같을 때 초과 기여의 기회가 없음을 보장한다; 그러한 공격의 상대적 효과는 다른 제약이 허용하는 범위 내에서 maxValue를 2n − 1에 최대한 가깝게 설정함으로써 줄일 수 있다.

6.1.2. DAP 확장

DAP에 대한 확장 [DAP-ATTRIBUTION]은 이 애플리케이션에 필요하다:

사용자 에이전트는 이러한 확장을 사용하여 자신이 생성하는 보고서를 구성한다.

6.1.3. DAP용 보고서 암호화

DAP 보고서를 구성하려면, 바이트 시퀀스 report를 생성하며, 검증된 전환 옵션 options, 사이트 topLevelSite, 사이트 또는 undefined intermediarySite, 시점 now, 그리고 목록정수histogram이 주어졌을 때:
  1. lengthhistogram크기로 둔다.

  2. maxValueoptions.최대값으로 둔다.

  3. chunkLength를 (Math.ceil(log2(maxValue + 1)) + 1) * length의 제곱근을 가장 가까운 정수로 반올림한 값으로 둔다.

  4. vdaf를 새로운 PrioL1BoundSum VDAF [PRIO-L1] 인스턴스로 두며, length, maxValue, chunkLength를 전달한다.

  5. microEpsilonoptions.epsilon에 1,000,000을 곱한 뒤 양의 무한대 방향으로 반올림한 값으로 둔다.

  6. callerintermediarySiteundefined가 아니면 intermediarySite로, 그렇지 않으면 topLevelSite로 둔다.

  7. taskConfig바이트 시퀀스로 두며, 이는 섹션 4.2 of [DAP]에 정의된 대로 TaskConfiguration 인스턴스를 다음 값으로 인코딩하여 생성된다:

    1. task_info.

    2. leader_aggregator_endpoint는 DAP Leader의 직렬화된 URL로 설정되며, 이는 options.Aggregation Service에 있는 선택된 집계 서비스구현 정의 정의에서 가져온다. 인코딩된 값은 구성된 URL과 false(프래그먼트 제외를 의미)를 사용하여 URL 직렬화기를 호출해 생성된다.

    3. helper_aggregator_endpoint는 DAP Helper의 직렬화된 URL로 설정되며, 이는 options.Aggregation Service에 있는 선택된 집계 서비스구현 정의 정의에서 가져오며, leader_aggregator_endpoint 값과 같은 과정으로 생성된다.

    4. time_precision 값 5.

    5. min_batch_size 값 20.

    6. batch_mode 값 TBD(Distributed Aggregation Protocol (DAP) Extensions for the Attribution API § batch-mode 참고).

    7. batch_config.

    8. vdaf_type 값 7(A Prio Instantiation for Vector Sums with an L1 Norm Bound on Contributions § dap 참고).

    9. vdaf_configuration은 PrioL1BoundSum A Prio Instantiation for Vector Sums with an L1 Norm Bound on Contributions § dap에 따라 length, maxValue, chunkLength로 인코딩된다.

    10. 작업 확장 집합 extensions, 즉 16비트 부호 없는 정수에서 바이트 시퀀스로의 매핑:

  8. taskID바이트 시퀀스로 두며, 이는 taskConfig를 전달하여 Task Binding and In-Band Provisioning for DAP § task-id에 설명된 과정으로 생성된다.

  9. ctx바이트 시퀀스로 두며, 인코딩된 문자열 dap-18taskID를 연결하여 형성되고, 섹션 4.4.2.1 of [DAP]에 정의되어 있다.

  10. reportID를 암호학적으로 안전한 무작위 소스 [RFC4086]에서 샘플링한 16바이트로 둔다.

  11. rand를 암호학적으로 안전한 무작위 소스 [RFC4086]에서 샘플링한 128바이트로 둔다.

  12. publicShare, inputSharesvdaf.shard()를 호출한 결과로 두며, 이는 섹션 4.1 of [VDAF]에 정의된 대로, ctx, histogram, reportID(VDAF "nonce" 매개변수로), 그리고 rand를 사용한다.

  13. timeUnix epoch부터 now까지의 duration from을 5초의 duration으로 나누고, 음의 무한대 방향으로 반올림하여 얻은 정수로 둔다.

  14. extensions16비트 부호 없는 정수에서 바이트 시퀀스로의 매핑으로 두며, 다음으로 구성된다:

    • 프라이버시 예산에 대한 확장 코드포인트는 microEpsilon 값에 매핑되며, UINT32, 값 microEpsilon, 그리고 false(isLittleEndian을 의미)를 사용해 NumericToRawBytes를 호출하여 인코딩된다.

  15. reportMetadatareportID, time, extensions에서 생성된 인코딩된 DAP ReportMetadata로 둔다.

  16. encryptedInputShares 목록으로 둔다.

  17. inputShares의 각 share에 대해 반복하여, 섹션 4.4.2.1에 설명된 공유 암호화 방법을 따른다:

    1. pkRoptions.Aggregation Service가 나타내는 집계 서비스에 대해 얻은 집계 서비스 HPKE 구성에서 해당 역할의 공개 키로 둔다.

      "dap-18-histogram"에 대한 URL은 DAP Leader 역할을 식별할 것으로 예상된다. 구현은 두 Aggregator 모두에 대한 HPKE 구성을 정적으로 얻어야 한다; § 9.4 구성되지 않은 브라우저를 보라. HPKE 구성은 요청 시 가져와서는 안 된다. 그렇게 하는 데 걸리는 시간이 measureConversion() 호출자에게 정보를 누설하기 때문이다.

    2. serverRole을 첫 번째 항목(Leader)에 대해서는 값 2, 두 번째 항목(Helper)에 대해서는 값 3을 갖는 바이트로 둔다.

    3. info를 다음을 연결하여 형성된 바이트 시퀀스로 둔다: 문자열 dap-18 input share인코딩된 값, 값 0x01을 갖는 바이트, 그리고 serverRole.

    4. inputShareAADtaskID, reportMetadata, publicShare, 그리고 taskConfig로부터 구성하며, InputShareAad 구조를 따른다.

    5. plaintextShare를 빈 집합(private_extensions용)과 share(payload용)로부터 구성하며, PlaintextInputShare 구조를 따른다.

    6. hpke를 동일한 HPKE 구성에 기반한 HPKE [RFC9180] 인스턴스로 둔다.

    7. encryptedSharepkR, info, inputShareAAD, 그리고 plaintextShare를 전달하여 hpke.Seal<mode_base>()를 호출한 결과로 둔다.

    8. encryptedShareencryptedInputShares추가한다.

  18. reportreportMetadata, publicShare, encryptedInputShares (두 값은 각각 leader 및 helper 암호화된 입력 공유), 그리고 DAP 집계자로부터 얻은 집계 서비스 HPKE 구성으로부터 생성된 인코딩된 DAP Report로 둔다.

  19. report를 반환한다.

이 알고리즘은 DAP 관련 명세의 일부 세부 사항을 복제한다. 이 문서와 해당 명세들 사이에 불일치가 있다면, 그것은 이 문서의 의도하지 않은 오류이다. DAP와 상호작용할 때는 항상 참조된 명세를 따른다.

6.2. 재전송 공격 방지 요구사항

브라우저가 생성한 전환 보고서는 보고서를 요청한 사이트가 소비한 프라이버시 예산의 양에 바인딩된다.

집계 서비스는 동일한 보고서를 두 번 이상 수락하지 않음을 반드시 보장해야 한다.

7. 차등 프라이버시

이 설계는 프라이버시 설계의 기반으로 차등 프라이버시 개념을 사용한다. [PPA-DP]

차등 프라이버시는 시스템이 공개하는 개인 정보의 양을 보장할 수 있는 프라이버시에 대한 수학적 정의이다. [DP] 차등 프라이버시는 이 시스템에서 프라이버시가 보호되는 유일한 수단은 아니지만, 가장 엄밀하게 정의되고 분석된 수단이다. 따라서 가장 강한 프라이버시 보장을 제공한다.

차등 프라이버시는 집계된 데이터셋에 대한 개인 데이터 기여를 숨기기 위해 무작위 노이즈를 사용한다. 노이즈의 효과는 데이터셋에 대한 개별 기여를 숨기면서도, 집계 분석의 유용성은 유지하는 것이다.

차등 프라이버시를 적용하려면, 어떤 정보가 보호되는지를 정의할 필요가 있다. 이 시스템에서 보호되는 정보는 단일 사용자 프로필의 노출이며, 단일 사용자 에이전트에서, 단일 에포크 동안, 전환을 등록하는 단일 웹사이트에 대한 것이다. § 7.1 프라이버시 단위는 이 설계의 함의를 더 자세히 설명한다.

이 어트리뷰션 설계는 개별 차등 프라이버시라고 하는 차등 프라이버시의 한 형태를 사용한다. 이 모델에서 사용자 에이전트는 각각 자신이 기여하는 정보를 제한하도록 보장할 별도의 책임을 진다.

이 API의 개별 차등 프라이버시 설계에는 세 가지 주요 구성 요소가 있다:

  1. 사용자 에이전트는 (프라이버시 예산을 사용하여) 노출에 관한 정보 중 전환 보고서를 통해 기기를 벗어나는 양을 제한한다. § 7.2 프라이버시 예산은 이를 더 깊이 살펴본다.

  2. 집계 서비스는 임의의 주어진 전환 보고서가 사용자 에이전트가 그 보고서에 대해 계산한 프라이버시 예산에 따라서만 사용되도록 보장한다. § 6.2 재전송 공격 방지 요구사항은 집계 서비스에 대한 요구사항을 더 자세히 설명한다.

  3. 노이즈는 집계 서비스가 추가한다. § 7.3 차등 프라이버시 메커니즘은 사용될 수 있는 메커니즘을 자세히 설명한다.

이러한 조치들은 함께 각 프라이버시 단위에 대해 공개되는 정보에 제한을 둔다.

7.1. 프라이버시 단위

차등 프라이버시 구현에는 무엇이 보호되는지에 대한 명확한 정의가 필요하다. 이는 프라이버시 단위로 알려져 있으며, 프라이버시 보호를 받는 엔티티를 나타낸다.

이 시스템은 세 값의 조합인 프라이버시 단위를 채택한다:

  1. 사용자 에이전트 프로필. 즉, 한 사람이 사용하는 사용자 에이전트의 인스턴스이다.

  2. 노출에 관한 정보를 요청하는 사이트 (전환 사이트).

    노출을 등록하는 사이트(노출 사이트)는 고려되지 않는다. 이러한 사이트는 이 시스템으로부터 직접 정보를 받지 않는다.

  3. 현재 에포크.

이 값들 중 하나가 변경되면 새로운 프라이버시 단위가 생성되며, 그 결과 별도의 프라이버시 예산이 생긴다. 사람이 방문하는 각 사이트는 각 에포크마다 제한된 양의 정보를 받는다.

이상적으로 프라이버시 단위는 한 사람이다. 이상적이기는 하지만, 여러 이유로 한 사람과 완벽하게 대응됨을 보장하는 유용한 시스템을 개발하는 것은 불가능하다:

7.1.1. 프라이버시 속성 및 그 한계에 대한 형식적 분석

Attribution의 프라이버시 보호는 여러 계층으로 이루어진다:

  1. 사이트별 예산은 하나의 전환 사이트가 사용자에 대해 학습할 수 있는 양을 제한한다.

  2. 전역 예산은 모든 사이트가 사용자에 대해 학습할 수 있는 양에 대한 보조 제한을 제공한다.

  3. 노출 사이트 할당량은 전환 사이트가 한 노출 사이트에서의 사용자 활동에 대해 학습할 수 있는 양을 제한한다.

  4. 각 사용자 동작 후 유지되는 카운터는 몇 개의 사이트가 API에 데이터를 저장하거나 API에서 학습할 수 있는지를 제한한다.

이 명세의 형식적 프라이버시 분석은 두 논문을 기반으로 한다. 첫 번째 [PPA-DP]는 온디바이스 개별 DP 회계를 위한 이론을 확립한다. 두 번째 [PPA-DP-2]는 사이트별 예산과 전역 예산이 제공하는 수학적 프라이버시 보장으로 분석을 확장한다.

사이트별 예산은 기본 프라이버시 보호로 보아야 한다. 사이트별 예산은 의미 있는 DP 보장을 제공하도록 설정되어야 한다. 그러나 [PPA-DP-2]의 분석은 이러한 보장을 제한하는 두 가지 가정을 식별했다:

  1. 데이터 생성에서 교차 사이트 적응성이 없음. 사이트의 질의 가능한 데이터 스트림(노출 및 전환)은 다른 사이트의 과거 DP 어트리뷰션 결과와 독립적으로 생성되어야 한다.

  2. 교차 사이트 공유 제한을 통한 누출이 없음. 한 사이트의 질의는 다른 사이트에 어떤 보고서가 방출되는지에 영향을 주어서는 안 된다.

요컨대, 두 가정 모두 실제로는 성립할 수 없다.

교차 사이트 적응성이 없다는 가정이 필요한 이유는 시스템이 시간이 지남에 따라 같은 사용자와 상호작용할 수 있는 여러 사이트를 포함하기 때문이다. 사이트들은 서로의 DP 측정값을 기반으로 사용자에게 보여 주는 광고를 바꿀 것이다. 예를 들어, 한 광고주가 어트리뷰션 결과로부터 더 나은 광고를 만드는 방법을 학습하면, 일부 사용자는 경쟁사의 사이트가 아니라 그들의 사이트에서 전환할 수 있다. 이 경우, 한 사이트가 학습한 것 -- 오직 자신의 사이트별 예산에 대해서만 계산된 것 -- 이 경쟁자에게 보이는 데이터(또는 데이터의 부재)를 바꾸지만, 이는 그 경쟁자의 사이트별 예산에는 계산되지 않는다.

지속적인 측정을 제공하는 모든 시스템은 이러한 속성을 가지므로, 유일한 결론은 이 한계를 받아들이는 것일 수밖에 없다. 이 한계는 전역 DP 예산과 공유 할당량을 두는 것을 정당화하는 요인 중 하나이며, 이는 두 번째 가정으로 이어진다.

여러 사이트에 걸친 공유 제한이 있을 때, 교차 사이트 누출이 없다는 가정이 필요하다. 그러한 공유 제한의 예로는 전역 DP 보장을 제공하려는 전역 안전성 제한이 있다. 일부 사이트의 measureConversion() 요청으로 공유 제한에 도달하면, 다른 사이트에 대한 보고서가 필터링될 수 있다. 예를 들어, 자신에게 노출이 있음을 아는 사이트는 공유 제한에 도달했는지 여부에 대해 무언가를 알게 된다. 이 정보는 집계되고 노이즈가 있기는 하지만, 예산을 소진한 사이트에 관한 정보이며, 해당 사이트의 사이트별 예산을 초과하는 정보이다.

공유 제한을 통한 누출은 그러한 제한을 남용을 제한하는 수단으로만 사용하도록 동기를 부여한다. 공유 제한을 사이트별 예산의 큰 배수로 설정하면, 공유 제한을 악용하려는 시도에는 적어도 그만큼 많은 사이트의 조정이 필요해진다. 배수가 클수록 공유 제한은 프라이버시 보호 수단으로는 덜 유용하고, 서비스 거부 또는 유사한 형태의 남용을 방지하는 수단으로 더 적합해진다.

반대로, 분석은 전역 예산이 이러한 한계 없이 건전한 전역 개별 DP 보장을 제공하도록 구현될 수 있음을 보여준다. 그러나 많은 사이트의 API 사용을 지원하려면, 전역 예산은 사이트별 예산의 상당한 배수로 설정되어야 한다. 이는 그것이 제공하는 DP 보장이 어떠한 가정과도 독립적이더라도, 단독으로는 의미 있는 DP 보호를 제공할 수 없음을 의미한다. 따라서 사이트별 예산이 기본 DP 보장을 제공한다. 전역 예산은 악의적인 사이트들의 공조 공격에 대비한 fallback으로 볼 수 있다.

전역 DP 예산은 또한 여러 사이트에 걸쳐 사용자 신원을 연결하여 사이트별 예산을 결합할 수 있는 사이트에 대한 보호 장치가 된다. 사이트별 모델은 이러한 가능성을 고려하지 않지만, 일부 사이트가 이런 능력을 가지는 것은 흔하다. 특히 여기에는 신원 제공자, 사용자 식별자(예: 이메일 주소 또는 전화번호)를 받는 사이트, 탐색 추적을 성공적으로 사용하는 사이트 [NAV-TRACKING-MITIGATIONS], 그리고 어떤 이유로든 교차 사이트 쿠키를 사용할 수 있는 사이트 [WEB-WITHOUT-3P-COOKIES]가 포함된다. 여러 사이트에서 Attribution을 사용하는 것은 그러한 사이트들에게 조정상의 어려움을 제시할 수 있지만, 사이트가 활동을 한 사람에게 연결할 수 있는 능력을 가질 가능성은 시스템의 프라이버시에 대한 전체적 분석에서 무시될 수 없다.

7.1.2. 브라우저 인스턴스

각 브라우저 인스턴스는 별도의 프라이버시 예산을 관리한다.

브라우저 인스턴스 간 조정은 가능할 수 있지만, 기대되지는 않는다. 그러한 조정은 공개되는 정보의 총량을 줄임으로써 프라이버시를 개선할 수 있다. 또한 한 브라우저 인스턴스의 노출이 다른 인스턴스에서 전환되도록 허용함으로써 어트리뷰션의 유용성을 개선할 수도 있다.

서로 다른 구현 간의 조정은 현재 이 작업의 범위를 벗어난다. 구현은 같은 사람을 위한 것으로 알려진 인스턴스 간에 일부 조정을 수행할 수 있지만, 이는 필수는 아니다.

7.1.3. 사이트별 제한

웹사이트에 공개되는 정보는 사이트를 기준으로 이루어진다. 이는 다른 프라이버시 관련 기능에서 사용되는 동일한 경계와 일치한다.

출처와 같은 더 세분화된 프라이버시 단위는 추가 정보를 얻는 것을 사소하게 만들 것이다. 같은 사람에 관한 정보가 여러 출처에서 수집될 수 있다. 그런 다음 그 정보는 쿠키 [COOKIES] 또는 유사한 것을 사용하여 사이트 내 정보의 자유로운 흐름을 악용함으로써 결합될 수 있다.

§ 7.2.2 안전성 제한은 이 제한을 악용하는 공격과 그러한 공격으로부터 보호하기 위해 사용자 에이전트가 구현할 수 있는 일부 추가 안전성 제한을 논의한다.

7.1.4. 프라이버시 예산 에포크

사이트는 각 프라이버시 예산 에포크 (또는 에포크)에 기록된 노출을 질의하는 데 사용되는 별도의 차등 프라이버시 예산을 받는다.

이 예산은 사용자 에이전트에 등록되고 나중에 질의되는 노출에 적용되며, 전환에는 적용되지 않는다.

분석 [PPA-DP]의 관점에서 노출의 각 에포크는 별도의 데이터베이스를 형성한다. 유한한 프라이버시 예산이 각 데이터베이스에 대해 이루어지는 모든 질의에 걸쳐 적용된다.

여러 에포크에 걸친 노출에서 생성된 전환 보고서를 가지는 것은 프라이버시상 결과를 가진다. 웹사이트를 한 번 방문하는 것만으로도 그 사이트는 많은 에포크에 걸친 활동에 대한 정보를 얻을 수 있다. 이를 위해서는 해당 전체 기간 동안 전환 사이트노출의 대상으로 식별되어 있기만 하면 된다. 질의될 수 있는 에포크의 수는 사용자 에이전트가 제한한다.

목표는 가능한 한 큰 에포크를 설정하는 것이다. 더 긴 기간은 프라이버시/유용성의 균형을 더 좋게 한다. 사이트가 어느 시점에서든 더 큰 전체 예산을 할당받을 수 있으면서도, 전체 프라이버시 손실률을 낮게 유지할 수 있기 때문이다. 그러나 더 긴 간격은 프라이버시 예산을 완전히 소진하기 쉽게 만들어, 다음 갱신까지 아무 정보도 얻지 못하게 할 수 있다.

에포크 기간을 일주일로 설정하기로 한 결정은 대체로 임의적이다. 일주일은 사이트가 며칠 또는 몇 주 뒤에 발생할 수 있는 변화까지 고려해야 하는 세심한 계획 없이도 프라이버시 예산을 어떻게 사용할지 결정할 어느 정도의 유연성을 제공하기에 충분할 것으로 기대된다.

§ 7.2 프라이버시 예산은 예산 책정 절차를 더 자세히 설명한다.

7.2. 프라이버시 예산

브라우저는 프라이버시 예산을 유지하며, 이는 프라이버시 손실의 양을 제한하는 수단이다.

이 명세는 그 기반으로 개별 형태의 (ε, δ)-차등 프라이버시를 사용한다. 이 모델에서 프라이버시 손실은 ε 값을 사용하여 측정된다. δ 값은 집계에 노이즈를 추가할 때 집계 서비스가 처리한다.

각 사용자 에이전트 인스턴스는 프라이버시 예산을 관리할 책임이 있다.

요청되는 각 전환 보고서는 보고서가 소비하는 프라이버시 예산의 양을 나타내는 ε 값과 전환 보고서에서 반환될 수 있는 값의 최댓값을 지정한다.

7.2.1. 프라이버시 예산 차감

전환 보고서에 대한 노출을 검색할 때, 사용자 에이전트는 해당 노출이 저장된 프라이버시 예산 에포크의 예산에서 지정된 ε 값을 차감한다. 해당 에포크프라이버시 예산이 충분하지 않으면, 그 에포크의 노출은 사용되지 않는다.

전환 사이트measureConversion()을 호출할 때마다, 어트리뷰션 로직노출을 선택한 에포크에 대해 프라이버시 예산이 차감된다.

다음 그림에서는, 여러 서로 다른 사이트에서 노출이 기록되어 있으며, 원으로 표시되어 있다.
시간 `--. .--' `--. .--' `--. .--' `--. .--' ^ | | | | | 1주차 2주차 3주차 4주차 현재 ]]> 사이트 A 사이트 B 사이트 C 사이트 D 사이트 E 시간 1주차 2주차 3주차 4주차 현재
시간에 따른 노출 저장소의 예

전환 보고서는 "현재"로 표시된 시점에 요청될 수 있다. 그 전환 보고서는 검은 원으로 표시된 노출을 선택하며, 이는 사이트 B, C, E의 노출에 해당한다.

그 결과, 전환 사이트프라이버시 예산은 에포크 1, 3, 4, 5에서 차감된다. 에포크 2에는 노출이 기록되지 않았으므로, 해당 에포크에서 예산은 차감되지 않는다.

사용자 에이전트프라이버시 예산의 소진을 어떻게 관리하는지는 선택된 어트리뷰션 로직에 따라 달라진다.

7.2.2. 안전성 제한

기본 프라이버시 단위는 여러 사이트에 걸쳐 같은 사람의 활동을 상호 연관시킬 수 있는 공격자에게 취약하다.

사이트 그룹은 때때로 공유 소유권이나 강한 합의가 있는 경우처럼 자신의 활동을 조정할 수 있다. 어떤 특정 방문자가 동일한 사람임을—​FedCM [FEDCM] 같은 것을 포함한 어떤 수단으로든—​확신할 수 있는 사이트 그룹은 이 API에서 얻은 정보를 결합할 수 있다.

이는 어트리뷰션에서 사이트가 정보를 얻는 속도를 조정이 발생하는 사이트 수에 비례하여 증가시키는 데 사용될 수 있다. 기본 프라이버시 단위는 이러한 방식으로 공개되는 정보에 어떠한 제한도 두지 않는다.

이 효과에 대응하기 위해, 사용자 에이전트는 사이트를 고려하지 않는 추가 프라이버시 예산인 안전성 제한을 구현할 수 있다. 안전성 제한은 사이트별 예산보다 상당히 높을 수 있으므로, 대부분의 일반적인 브라우징 활동에서는 도달하지 않는다. 목표는 그것들이 집중적인 활동이나 공격을 받는 경우에만 효과적이도록 보장하는 것이다.

사이트별 프라이버시 예산과 마찬가지로, 사이트가 자신의 전환 보고서 요청이 안전성 제한을 초과하게 했는지 여부를 판별할 수 없어야 한다는 점이 매우 중요하다.

7.3. 차등 프라이버시 메커니즘

차등 프라이버시 메커니즘—​즉 노이즈가 추가되는 구체적인 방법—​은 집계 서비스가 선택할 수 있다.

라플라스 노이즈를 추가하는 것은 노이즈의 전체 크기와 구현 및 분석의 단순성 사이에서 균형을 맞추어 좋은 결과를 낼 것으로 기대된다. 현재 설계는 L1 노름에 기반한 DP 민감도를 사용하며, 이는 집계에서 추가되는 라플라스 노이즈를 지원한다. 다른 노이즈 메커니즘을 지원하려면 민감도가 계산되고 전달되는 방식에 추가 변경이 필요할 수 있다.

이러한 집계 서비스에 대해 정의된 것처럼, 중앙 위치에서 노이즈를 추가하면 총 보고서 수가 증가해도 총 노이즈 양이 증가하지 않는다. 이는 보고서가 생성되는 지점에서 노이즈를 적용하는 차등 프라이버시 설계 (즉 로컬 차등 프라이버시 모델)에 비해 유용성 측면의 이점을 제공한다. 그런 설계에서는 노이즈가 총 보고서 수에 비례하여 증가한다.

8. 보안 고려사항

8.1. 노출 저장소

Attribution API가 사용하는 노출 저장소는 브라우징 활동과 관련된 정보를 보유하고 브라우징 세션 간에 지속된다. 노출 저장소를 통한 정보 흐름은 엄격하게 제어되지만, 일부 정보는 출처 간에 운반된다.

다음 조치들은 노출 저장소를 통한 유해한 정보 흐름의 가능성을 제한한다:

8.2. 구현에서의 사이드 채널 위험

Attribution API는 필요한 보안 및 프라이버시 속성을 유지하기 위해 신중하게 구현되어야 한다. API를 호출하는 사이트는 다음을 알 수 없어야 한다:

명시적인 반환 값이나 throw된 예외만이 사이트가 Attribution API로부터 학습할 수 있는 유일한 방법은 아니라는 점에 유의하라. 다음과 같은 사이드 채널에서 민감한 정보를 추론하는 것이 가능할 수 있다:

API 함수들의 실행 시간 변동은 보장을 유지하기 위한 주요 고려사항이다. 실행 시간과 관련하여 특히 우려되는 두 가지 요인이 있다:

전역 프라이버시 예산 저장소, 노출 사이트 할당량 저장소, 그리고 에포크 시작 시간의 공유 전역 상태는, 이러한 값들이 알고리즘 실행 시간에 직접 영향을 주지 않으므로 위험이 더 작다. 구현은 여전히 어떤 전역 상태도 fingerprint 또는 다른 정보 누출에 기여하지 않도록 보장해야 한다.

모든 사이드 채널을 완전히 제거하는 것은 비현실적이지만, 구현은 attribution API에서 민감한 정보가 누출되는 것을 방지하기 위해 합리적인 노력을 해야 한다. 누출을 방지하기 위한 전략에는 다음이 포함된다:

8.3. 집계 서비스

집계 서비스는 웹 플랫폼의 일부는 아니지만, 그 보안은 Attribution 메커니즘의 전체 보안에 매우 중요하다. measureConversion()이 생성하는 전환 보고서는 집계 서비스의 암호화 키를 사용하여 암호화된다. 따라서 이러한 보고서에 포함된 정보가 공개될 가능성의 상당 부분은 집계 서비스의 세부 사항에 달려 있다.

사용자 에이전트 개발자는 집계 서비스를 Attribution API의 지원 서비스로 추가하기 전에 집계 서비스의 설계와 집계 서비스 운영자의 신뢰성을 신중히 고려해야 한다. 이러한 문제에 대한 추가 논의는 § 6 집계§ 9 프라이버시 고려사항에서 찾을 수 있다.

8.4. 여러 사이트의 보고서 결합

Attribution API의 프라이버시 메커니즘은 주로 사이트의 단위로 작동한다. 악의적인 운영자는 여러 사이트에 대해 노출을 등록하려고 시도하여, 어트리뷰션을 통해 그렇지 않았다면 공개되었을 정보의 양을 초과하게 할 수 있다. § 7.2.2 안전성 제한은 이러한 가능성을 완화하기 위한 추가 교차 사이트 프라이버시 예산 설정을 논의한다.

8.5. 교차 사이트 참여 제어

집계 히스토그램을 생성하려면, 여러 사이트가 협력해야 한다. 모든 노출 사이트는 자신이 저장하는 노출에 대해 일관된 값을 생성해야 한다. 전환 사이트는 노출 사이트가 올바른 값을 기록한다고 신뢰해야 한다.

API는 집계를 오염시킬 수 있는 원치 않는 노출의 위험을 사이트가 관리할 수 있도록 여러 필터링 옵션을 제공한다.

필터링 옵션은 어떤 사이트가 어트리뷰션에 참여할 수 있는지를 제한하는 데 유용하며, 이는 집계 결과를 오염시킬 수 있는 엔티티 집합을 줄인다. 이러한 옵션을 효과적으로 사용하는 것은 원치 않는 노출이 실수로 포함되는 일을 방지하는 데 특히 유용하다.

이러한 필터링 옵션은 결과를 오염시키려는 악의적 시도에 대해서는 효과가 제한적이다. 신뢰는 이러한 제어가 기대하는 것만큼 엄격하게 이분법적인 경우가 드물다. 목록에 포함된 노출 사이트는 전환 사이트의 관점에서 진짜인 노출과 위조되거나 오류가 있는 노출을 섞을 수 있다. 오류가 있는 노출은 InValid Traffic(IVT)으로 간주되는 것을 나타내며, 그중 일부는 사기로 간주될 수 있다.

8.5.1. 광고 사기

웹 광고는 다양한 종류의 사기의 대상이 되어 왔다. 사이트는 자신들에게 게재된 광고에 가치가 잘못 귀속된 것처럼 보이도록 하기 위해 이 API를 사용하여 노출 사기를 시도할 수 있다.

노출의 사기적 등록은 이 API에서 특히 우려되는 부분이다. 노출이 기기에만 저장되기 때문이다. 사기성 노출을 식별하고 그것을 어트리뷰션에서 제외하기 위해 서버 측 인텔리전스를 적용할 수 없다.

악의적인 노출에 대한 유일한 직접적 완화책은 사이트 수준 필터링 옵션이다. 이는 완전히 신뢰되지 않는 사이트의 노출이 의도된 후보 노출 집합에 대한 어트리뷰션을 방해하지 못하게 한다.

반대로, 전환 보고서가 암호화되어 있더라도, 보고서가 전환 사이트로 전송되기 때문에, 전환 사이트는 전환이 사기일 가능성이 있다고 판단하고 이를 집계에서 제외할 수 있다.

9. 프라이버시 고려사항

이 API의 주된 프라이버시 목표는 사이트에 어트리뷰션을 수행할 수 있는 능력을 제공하는 것이 그들의 교차 사이트 인식 수행 능력을 향상시키지 않도록 보장하는 것이다.

이 절은 이 목표를 달성하기 위해 필요한 보호에 대해 더 많은 정보를 제공한다. 추가 논의는 동일 사이트 인식 방지와 같은 부차적인 프라이버시 목표를 다룬다.

9.1. Attribution API에 의해 노출되는 정보

노출 저장소프라이버시 예산 저장소에는 브라우징 활동의 단면에 관한 정보가 포함된다. API 사용이 증가함에 따라, 이 정보의 범위도 증가한다. 그러나 이러한 저장소에 쓰이는 대부분의 정보는 결코 공개되지 않는다. 어트리뷰션은 기기에서 수행되기 때문에 (온디바이스 어트리뷰션), 귀속된 전환에 관한 정보만 Attribution API에 의해 노출된다. 이는 노출과 전환에 관한 정보가 모두 집계 서비스로 전송되는 오프디바이스 어트리뷰션 방식과 대조된다. 후자의 방식에서는 집계 서비스의 손상 (또는 집계 서비스와의 통신 손상)으로 인해 공개될 수 있는 정보의 양이 훨씬 더 크다.

Attribution API가 어트리뷰션을 수행할 때, 그 어트리뷰션에 관한 정보는 차등 프라이버시 제한이 허용하는 범위 내에서만 기기에서 공개된다.

Attribution API는 제한된 관련 노출 후보 집합과 비교적 드문 전환 이벤트의 연관성을 측정하기 위한 것이지만, 더 큰 규모의 데이터 수집에 API가 어떻게 오용될 수 있는지를 고려하는 것이 중요하다. 노출이 가능한 전환 사이트를 열거해야 한다는 요구사항 (그리고 그 반대도 마찬가지)는 API가 대량 데이터 수집에 오용되는 것을 방지하고, 그러한 오용 시도를 더 잘 보이게 하는 데 중요한 역할을 한다.

9.2. Attribution API 비활성화

사용자 에이전트는 사용자가 Attribution API를 비활성화할 수 있는 제어를 제공해야 한다.

Attribution API는 집계 정보만 공개하도록 설계되어 있다. 차등 프라이버시의 사용은 특정 사용자가 집계 출력에 기여했는지 여부를 판단할 가능성을 제한한다. 그러나 일부 사용자는 여전히 어트리뷰션 측정에 참여하지 않기를 선호할 수 있다.

구현은 Attribution API 전용 제어를 사용하거나, 여러 기능에 적용되는 통합 프라이버시 제어를 통해 사용자에게 opt out 선택지를 제공할 수 있다.

사용자 에이전트 개발자는 다른 프라이버시 모드와 Attribution API의 상호작용을 고려해야 한다. 예를 들어, private browsing 모드에서 어트리뷰션이 비활성화될 수 있거나, 사용자가 진단 데이터 수집에서 opt out한 경우 비활성화될 수 있다.

설계상, 사용자가 opt out했는지 여부는 웹사이트가 감지할 수 없다.

fingerprinting의 위험을 최소화하고, Attribution API를 비활성화하기로 선택한 사용자에 대한 차별을 방지하기 위해, 사이트는 API가 비활성화되어 있음을 감지할 수 있어서는 안 된다. 구체적으로, Attribution API에 대한 모든 호출은 그 밖의 조건에서 유효하다면 API가 비활성화되어 있더라도 성공적으로 완료된다. 동작상의 유일한 차이는 API가 비활성화되어 있을 때 반환되는 전환 보고서가 어떠한 전환 값도 보고하지 않는다는 것이다. 보고서가 암호화되어 있으므로, 이 차이는 전환 보고서를 수신하는 사이트가 감지할 수 없다.

9.3. 가시성

구현은 사용자에게 노출 저장소의 상태를 보고 과거 보고서 제출을 검토할 수 있는 방법을 제공하는 것이 좋다.

이러한 인터페이스는 사이트별 Attribution API의 집계 사용을 보여 주는 요약 정보로 제한될 수 있다. 노출과 제출된 보고서의 세부 정보를 검사하는 인터페이스는 사용자와 웹 개발자 모두가 API의 동작을 진단할 수 있게 할 수 있다.

9.4. 구성되지 않은 브라우저

이 API는 사용자 에이전트 인스턴스가 measureConversion() 요청에 응답하는 데 필요한 모든 구성을 가지고 있다고 가정한다.

measureConversion()을 호출하는 데 필요한 집계 서비스 구성이 없거나 오래된 경우, 그것은 사이트가 관찰할 수 있을 수 있다.

구성 검색이 measureConversion() 호출의 해결을 지연시킬 수 있다면, 이는 타이밍 사이드 채널을 만든다. 대신 가짜 응답이 생성된다면, 제대로 구성된 사용자 에이전트의 응답과 가짜 응답 사이의 차이가 관찰될 수 있다. 이는 키 식별자 또는 기타 암호화되지 않은 메타데이터의 사용일 수 있다. 암호문 길이의 차이 또한 무엇이 암호화되는지의 변경이나 알고리즘 선택의 변경을 드러낼 수 있다.

오래되었거나 없는 구성을 감지하는 것은 fingerprint를 통해 사용자 에이전트를 식별하는 데 사용될 수 있다.

따라서 사용자 에이전트는 사이트가 관찰할 수 없는 방식으로 집계 서비스 구성을 획득하는 것을 우선시하는 것이 좋다. 이는 콘텐츠 로드를 시작하기 전에 시작 시 구성을 가져옴으로써 달성될 수 있다.

필요한 구성을 얻을 수 없거나, 명백히 오래된 경우, 구현은 measureConversion()이 호출될 때 즉시 거부하도록 선택할 수 있다. 이는 정보를 누출하지만, 가짜 값을 생성하려고 시도하는 것보다 덜 누출할 수 있다.

9.5. 저장된 노출에 식별 정보 포함하기

사이트는 matchValue 또는 다른 필드를 사용하여, 노출에 일정량의 데이터를 인코딩할 수 있다. API는 사이트가 이러한 필드에 사용자 식별자를 인코딩하는 것을 막지 않는다. 어트리뷰션 과정은 전환 보고서를 구성할 때 이 데이터를 사용할 수 있으며, 이는 해당 식별 정보가 그 보고서를 수신하는 사이트에 제공될 수 있다는 위험을 내포한다. 다음 조치들이 이 위험을 완화한다:

9.6. 서드 파티 컨텍스트에서의 사용

Attribution API는 서드 파티 컨텍스트에서도 사용할 수 있다. 특히, 서드 파티 iframe은 saveImpression()을 호출할 수 있다. 그러나 노출은 iframe의 출처가 아니라 최상위 탐색 컨텍스트의 사이트로 기록된다는 점에 유의하라.

서드 파티 컨텍스트에서 API를 사용할 수 있다는 것은 프라이버시 위험을 어느 정도 증가시키지만, iframe이 광고를 표시하는 데 흔히 사용되기 때문에 이러한 지원은 필요하다고 간주된다.

9.7. API 상태 지우기

사용자 에이전트는 저장소를 지우는 옵션을 제공할 수 있다. 이는 두 가지 이유로 존재한다:

프라이버시 예산 소비를 추적하는 상태를 지우는 것은 사이트에 대한 프라이버시에 부정적인 영향을 준다. 그러면 사이트는 어트리뷰션으로부터 더 많은 정보를 얻을 수 있게 된다.

사용자 에이전트는 API가 비활성화될 때 프라이버시 예산 저장소에포크 시작 시간에서 데이터를 지울 수 있다. 그 경우 API가 다시 활성화되면, API가 비활성화되기 전에 어떤 예산이 소비되었는지 판단할 방법이 없다. 그 경우 사용자 에이전트last browsing history clear 값을 갱신하여 프라이버시 예산이 의도치 않게 초과되지 않도록 보장할 수 있다.

9.7.1. 사이트 데이터 지우기

사용자의 요청으로 사이트 데이터를 지우지만 브라우징 기록은 유지할 때, 사용자 에이전트는 영향을 받는 사이트집합, false(forgetVisits에 대해), 그리고 해당 동작이 수행된 시간을 인수로 하여 clear browsing history for attribution를 호출한다. 이는 해당 사이트의 프라이버시 예산을 0으로 설정하여, 그 사이트에서 전환 측정을 사용할 수 없게 한다. 이는 노출 저장소에서 저장된 노출을 제거하지 않는다; 논리적으로 노출은 저장되는 시점에 전환 사이트로 이전된다.

사이트의 요청으로 사이트 데이터를 지울 때, 즉 `Clear-Site-Data` 헤더를 사용하는 경우, 사용자 에이전트프라이버시 예산 저장소에포크 시작 시간 중 어느 것도 변경하지 않고, 노출만 제거한다.

9.7.2. 브라우징 기록 지우기

브라우징 기록을 지울 때 프라이버시 예산 저장소를 갱신하는 것만으로는 충분하지 않다. 사이트에 대한 프라이버시 손실을 방지하는 데 필요한 사이트별 정보를 유지하면, 컴퓨터의 다른 사용자가 발견할 수 있는 사이트 방문 정보가 남게 된다.

브라우징 기록을 지우는 사용자 에이전트는 영향을 받는 사이트집합, true(forgetVisits에 대해), 그리고 작업이 시작된 시간을 인수로 하여 clear browsing history for attribution를 호출한다.

브라우징 기록을 지울 때, 사용자 에이전트는 모든 사이트프라이버시 예산 정보를 제거해야 한다 (즉, 프라이버시 예산 저장소에서 항목을 제거한다). 또한 사용자 에이전트는 그 정보의 손실로 인해 이후의 프라이버시 예산 소비가 설정된 제한을 초과하는 프라이버시 손실을 초래하지 않도록 보장해야 한다.

이는 브라우징 기록이 폐기된 에포크 동안 어트리뷰션을 비활성화함으로써 달성할 수 있다. 그렇지 않으면 기록을 지우기 직전에 자신의 예산을 소비한 사이트가 상태 지우기가 없었을 때보다 API를 통해 더 많은 것을 알 수 있게 된다.

이는 영향을 받는 사이트에 대해 남은 에포크 동안 API를 비활성화한다. 에포크 시작 시간은 지워지지 않으므로, 에포크 타임라인은 연속적으로 유지된다.

사용자 에이전트last browsing history clear 값에 기록이 마지막으로 지워진 시점을 기억한다. 이는 사이트사용자 에이전트가 선택한 최대 허용 프라이버시 예산을 초과할 수 없다는 것이 보장될 때까지 예산 소비를 방지하는 데 사용된다.

get the starting epoch for attribution 알고리즘은 전환 사이트가 상태가 지워진 시점으로부터 한 에포크 기간 안에 시작되는 어떤 에포크노출도 질의할 수 없도록 보장한다.

9.7.3. 노출 지우기

노출 저장소를 지우는 메커니즘이 제공되어야 한다. 예를 들어, 노출 저장소는 Attribution API를 비활성화하는 제어가 활성화될 때 지워질 수 있다.

사용자 에이전트가 저장된 데이터(기록, 쿠키 등)를 지우기 위해 제공하는 모든 메커니즘은 노출 저장소까지 포함하도록 확장하는 것이 권장된다. § 9.7 API 상태 지우기는 저장된 데이터의 지우기에 대해 더 자세한 정보를 제공한다.

사용자 에이전트사이트에 대한 상태를 지울 때에는, 영향을 받는 기간 동안 저장되었고 일치하는 노출 사이트 또는 전환 사이트를 가진 모든 저장된 노출을 폐기해야 한다. 노출 사이트의 경우, 이러한 노출은 지워진 활동과 관련된다. 상태가 지워진 전환 사이트는 이러한 노출을 사용할 수 없게 된다.

노출일치하는 중개 사이트를 가지는 경우에는 유지될 수 있다.

9.8. 시계 선택

이 API는 시간의 기반으로 wall clock을 사용한다. 이는 주로 API가 지속적인 시간 개념에 의존하기 때문이다. monotonic clock사용자 에이전트의 단일 실행 동안에만 정의되므로, 사용자 에이전트가 재시작되면 일관성에 대한 보장이 없다.

wall clock은 시계 drift로 인해 누적될 수 있는 오류를 보정하도록 조정될 수 있다. 따라서 wall clock은 항상 일정한 속도로 전진한다고 보장되지 않으며, 때로는 감소할 가능성도 포함한다.

wall clock의 감소는 이 API가 제공하는 프라이버시 보장에 영향을 주지 않는다. 시계의 증가만이 프라이버시에 부정적인 영향을 줄 수 있다. 정상적인 시간 진행을 초과하는 증가는 프라이버시 예산이 의도보다 더 빨리 갱신되는 결과를 낳을 수 있다.

에포크 내에서 보정을 겪는 시계의 경우, 시계 조정은 프라이버시 효과를 가지지 않는다. 충분히 큰 단일 보정은 프라이버시 예산이 예정된 시각보다 앞서 갱신되도록 하여, 일회성 프라이버시 손실 증가를 초래할 수 있다. 지속적인 큰 보정은 프라이버시에 가장 심각한 영향을 주며, 에포크 간 각 전환이 추가 프라이버시 예산을 공개하게 된다.

전체 에포크를 건너뛰는 매우 큰 시간 증가는 추가 프라이버시 손실을 초래하지 않는다. 노출저장될 수 없는 한 프라이버시 손실은 가능하지 않다.

물론 시계에 크거나 지속적인 보정이 필요한 모든 사용자 에이전트는 자신이 보고하는 시간의 결과로 매우 식별 가능할 가능성이 높다. 그것만으로도 원치 않는 교차 사이트 인식을 가능하게 하기에 충분할 가능성이 높다.

10. 감사의 말

이 명세는 많은 사람들의 많은 작업의 결과물이다. 이 API 수준의 큰 형태는 Luke Winstrom의 아이디어에 기반한다. 프라이버시 아키텍처는 [PPA-DP]의 저자들이 제공한 것이다.

적합성

문서 규약

적합성 요구사항은 설명적 단언과 RFC 2119 용어의 조합으로 표현된다. 이 문서의 규범적 부분에서 핵심어 “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “MAY”, 그리고 “OPTIONAL”은 RFC 2119에 설명된 대로 해석되어야 한다. 그러나 가독성을 위해, 이 명세에서 이러한 단어들이 모두 대문자로 나타나지는 않는다.

이 명세의 모든 텍스트는 명시적으로 비규범으로 표시된 절, 예, 주석을 제외하고 규범적이다. [RFC2119]

이 명세의 예는 “for example”이라는 단어로 도입되거나, 규범적 텍스트와 구분되도록 class="example"로 표시된다. 예를 들면 다음과 같다:

이는 정보 제공용 예의 예이다.

정보 제공용 주석은 “Note”라는 단어로 시작하며, 규범적 텍스트와 구분되도록 class="note"로 표시된다. 예를 들면 다음과 같다:

참고, 이는 정보 제공용 주석이다.

적합한 알고리즘

알고리즘의 일부로 명령형으로 표현된 요구사항 (예: "strip any leading space characters" 또는 "return false and abort these steps")은 알고리즘을 도입할 때 사용된 핵심어 ("must", "should", "may" 등)의 의미로 해석되어야 한다.

알고리즘 또는 특정 단계로 표현된 적합성 요구사항은 최종 결과가 동등하기만 하면 어떤 방식으로든 구현될 수 있다. 특히, 이 명세에 정의된 알고리즘은 이해하기 쉽도록 의도된 것이며 성능을 의도한 것은 아니다. 구현자는 최적화할 것을 권장한다.

색인

이 명세에서 정의하는 용어

참조에서 정의하는 용어

참고문헌

규범적 참고문헌

[CLEAR-SITE-DATA]
Mike West. 사이트 데이터 지우기. 2017년 11월 30일. WD. URL: https://www.w3.org/TR/clear-site-data/
[CSS-2025]
Chris Lilley; 외. CSS 스냅샷 2025. 2025년 9월 18일. NOTE. URL: https://www.w3.org/TR/css-2025/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 값과 단위 모듈 레벨 4. 2024년 3월 12일. WD. URL: https://www.w3.org/TR/css-values-4/
[CSS2]
Bert Bos; 외. Cascading Style Sheets 레벨 2 개정 1 (CSS 2.1) 명세. 2011년 6월 7일. REC. URL: https://www.w3.org/TR/CSS2/
[DAP]
Tim Geoghegan; 외. 개인정보 보호 측정을 위한 분산 집계 프로토콜. 2024년 4월 29일. URL: https://datatracker.ietf.org/doc/html/draft-ietf-ppm-dap-16
[DAP-ATTRIBUTION]
Martin Thomson. Attribution API를 위한 분산 집계 프로토콜(DAP) 확장. 2026년 2월 18일. URL: https://datatracker.ietf.org/doc/html/draft-thomson-ppm-dap-attribution-01
[DAP-TASKPROV]
Shan Wang; Christopher Patton. DAP를 위한 작업 바인딩 및 인밴드 프로비저닝. 2025년 9월 5일. URL: https://datatracker.ietf.org/doc/html/draft-ietf-ppm-dap-taskprov-03
[DOM]
Anne van Kesteren. DOM 표준. 현행 표준. URL: https://dom.spec.whatwg.org/
[ECMASCRIPT]
ECMAScript 언어 명세. URL: https://tc39.es/ecma262/multipage/
[FETCH]
Anne van Kesteren. Fetch 표준. 현행 표준. URL: https://fetch.spec.whatwg.org/
[HR-TIME-3]
Yoav Weiss. 고해상도 시간. 2026년 3월 24일. WD. URL: https://www.w3.org/TR/hr-time-3/
[HTML]
Anne van Kesteren; 외. HTML 표준. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 표준. 현행 표준. URL: https://infra.spec.whatwg.org/
[PERMISSIONS-POLICY-1]
Ian Clelland. 권한 정책. 2026년 6월 18일. WD. URL: https://www.w3.org/TR/permissions-policy-1/
[PRIO-L1]
Martin Thomson; David Cook. 기여에 대한 L1 노름 경계를 가진 벡터 합계를 위한 Prio 인스턴스화. 2024년 10월 21일. URL: https://datatracker.ietf.org/doc/draft-thomson-ppm-l1-bound-sum/
[RFC2119]
S. Bradner. RFC에서 요구 수준을 나타내기 위해 사용하는 핵심 단어. 1997년 3월. 현재 최선 관행. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SECURE-CONTEXTS]
Mike West. 보안 컨텍스트. 2023년 11월 10일. CRD. URL: https://www.w3.org/TR/secure-contexts/
[URL]
Anne van Kesteren. URL 표준. 현행 표준. URL: https://url.spec.whatwg.org/
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL 표준. 현행 표준. URL: https://webidl.spec.whatwg.org/

비규범적 참고문헌

[COOKIES]
A. Barth. HTTP 상태 관리 메커니즘. 2011년 4월. 제안 표준. URL: https://httpwg.org/specs/rfc6265.html
[COPPACALYPSE]
Garrett Johnson; 외. COPPAcalypse? YouTube 합의가 아동 콘텐츠에 미친 영향. 2024년 3월 14일. URL: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=4430334
[DP]
Cynthia Dwork; Aaron Roth. 차등 개인정보 보호의 알고리즘적 기초. 2014년. URL: https://doi.org/10.1561/0400000042
[EU-AD]
Niklas FOURBERG; 외. 온라인 광고: 표적 광고가 광고주, 시장 접근 및 소비자 선택에 미치는 영향. 2021년 6월. URL: https://www.europarl.europa.eu/thinktank/en/document/IPOL_STU(2021)662913
[FEDCM]
Nicolas Pena Moreno. Federated Credential Management API. 2024년 8월 20일. FPWD. URL: https://www.w3.org/TR/fedcm-1/
[FREE-GDP]
Leonard Nakamura; Jon D. Samuels; Rachel Soloveichik. GDP 및 생산성 계정 내에서 "무료" 디지털 경제 측정하기. 2017년 10월. URL: https://www.bea.gov/research/papers/2017/measuring-free-digital-economy-within-gdp-and-productivity-accounts
[NAV-TRACKING-MITIGATIONS]
탐색 추적 완화. 편집자 초안. URL: https://privacycg.github.io/nav-tracking-mitigations/
[ONLINE-ADVERTISING]
Avi Goldfarb; Catherine Tucker. 온라인 광고. URL: https://doi.org/10.1016/B978-0-12-385514-5.00006-9
[PPA-DP]
Pierre Tholoniat; 외. 쿠키 몬스터: 차등 개인정보 보호 광고 측정 시스템을 위한 효율적인 온디바이스 예산 관리. URL: https://arxiv.org/abs/2405.16719
[PPA-DP-2]
Pierre Tholoniat; 외. 빅 버드: W3C의 개인정보 보호 Attribution API를 위한 개인정보 예산 관리. URL: https://arxiv.org/abs/2506.05290
[PRIO]
Henry Corrigan-Gibbs; Dan Boneh. Prio: 집계 통계의 비공개, 견고하고 확장 가능한 계산. 2017년 3월 14일. URL: https://crypto.stanford.edu/prio/paper.pdf
[RFC3492]
A. Costello. Punycode: 애플리케이션의 국제화 도메인 이름(IDNA)을 위한 Unicode의 Bootstring 인코딩. 2003년 3월. 제안 표준. URL: https://www.rfc-editor.org/info/rfc3492/
[RFC4086]
D. Eastlake 3rd; J. Schiller; S. Crocker. 보안을 위한 무작위성 요구사항. 2005년 6월. 현재 최선 관행. URL: https://www.rfc-editor.org/info/rfc4086/
[RFC5890]
J. Klensin. 애플리케이션을 위한 국제화 도메인 이름 (IDNA): 정의 및 문서 프레임워크. 2010년 8월. 제안 표준. URL: https://www.rfc-editor.org/info/rfc5890/
[RFC6761]
S. Cheshire; M. Krochmal. 특수 용도 도메인 이름. 2013년 2월. 제안 표준. URL: https://www.rfc-editor.org/info/rfc6761/
[RFC9180]
R. Barnes; 외. 하이브리드 공개 키 암호화. 2022년 2월. 정보 제공. URL: https://www.rfc-editor.org/info/rfc9180/
[STORAGE]
Anne van Kesteren. Storage 표준. 현행 표준. URL: https://storage.spec.whatwg.org/
[UNSANCTIONED-TRACKING]
Mark Nottingham. 승인되지 않은 웹 추적. 2015년 7월 17일. TAG Finding. URL: https://www.w3.org/2001/tag/doc/unsanctioned-tracking/
[VDAF]
Richard L. Barnes; 외. 검증 가능한 분산 집계 함수. 2026년 1월 30일. URL: https://datatracker.ietf.org/doc/html/draft-irtf-cfrg-vdaf-18
[WEB-WITHOUT-3P-COOKIES]
제3자 쿠키 없는 웹. URL: https://www.w3.org/2001/tag/doc/web-without-3p-cookies/

IDL 색인

partial interface Navigator {
  [SecureContext, SameObject] readonly attribute Attribution attribution;
};

enum AttributionAggregationProtocol { "dap-18-histogram" };

dictionary AttributionAggregationService {
  required AttributionAggregationProtocol protocol;
};

[SecureContext, Exposed=Window]
interface AttributionAggregationServices {
  readonly maplike<USVString, AttributionAggregationService>;
};

[SecureContext, Exposed=Window]
interface Attribution {
  readonly attribute AttributionAggregationServices aggregationServices;
};

dictionary AttributionImpressionOptions {
  required unsigned long histogramIndex;
  unsigned long matchValue = 0;
  sequence<USVString> conversionSites = [];
  sequence<USVString> conversionCallers = [];
  unsigned long lifetimeDays = 30;
  long priority = 0;
};

dictionary AttributionImpressionResult {
};

[SecureContext, Exposed=Window]
partial interface Attribution {
  Promise<AttributionImpressionResult> saveImpression(AttributionImpressionOptions options);
};

dictionary AttributionConversionOptions {
  required USVString aggregationService;
  double epsilon = 1.0;

  required unsigned long histogramSize;

  unsigned long lookbackDays;
  sequence<unsigned long> matchValues = [];
  sequence<USVString> impressionSites = [];
  sequence<USVString> impressionCallers = [];

  sequence<double> credit;
  unsigned long value = 1;
  unsigned long maxValue = 1;
};

dictionary AttributionConversionResult {
  required Uint8Array report;
};

[SecureContext, Exposed=Window]
partial interface Attribution {
  Promise<AttributionConversionResult> measureConversion(AttributionConversionOptions options);
};