어트리뷰션 레벨 1

W3C 작업 초안,

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2026/WD-attribution-20260820/
최신 공개 버전:
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는 사이트가 광고의 실제 환경에서의 성과를 더 잘 이해하는 데 도움이 되는 집계 통계를 생성한다. 이 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의 목적은 광고에 대한 기여도 측정을 가능하게 하는 것이다. 이러한 집계 측정항목은 API가 적절하게 사용되는 경우 광고 성과를 더 잘 이해하는 데 기여할 수 있다.

1.1. 어트리뷰션

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

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

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

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

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

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

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

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

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

1.2. 배경

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

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

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

측정 성능의 대가는 개인정보 보호였다. 정확하고 포괄적인 정보를 생성하기 위해, 광고 사업자는 모든 웹 사용자의 활동을 광범위하게 추적했다. 각 브라우저에는 추적 식별자가 부여되었으며, 흔히 사이트 간 리소스와 연결된 쿠키가 사용되었다. 관심 대상이 되는 모든 동작은 이 식별자에 대해 기록되었고, 한 사람의 온라인 활동에 대한 포괄적인 기록이 형성되었다.

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

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

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

1.3. 목표

이 문서는 광고를 사용하는 사이트에서 기여도 측정을 가능하게 하면서 추적을 가능하게 하거나 조장하는 메커니즘, 예를 들어 사이트 간 쿠키를 피하고자 한다.

Attribution API는 사이트에 측정 도구를 제공함으로써 간접적이고 집단적인 사용자 이익을 제공하는 것을 목표로 한다. 이러한 도구는 효과적으로 적용될 경우 광고 성과에 대한 통찰을 제공할 수 있다.

1.4. 최종 사용자 이점

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

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

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

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

기여도 측정 시스템에 참여하는 것은 웹 사용자에게 부차적인 비용을 초래할 수 있다.

기여도 측정을 지원하면 광고주에게 광고 전략을 개선하는 데 사용할 수 있는 정보를 제공함으로써 더 효과적인 광고가 가능해질 수 있다. 기여도 측정을 통해 원하는 결과와 광고가 표시되는 시간과 장소, 광고가 제시되는 사람, 그리고 광고 자체의 세부 정보와 같은 광고 특성 간의 상관관계를 측정할 수 있다. 사이트는 이 정보를 사용하여 광고 활용 방식을 개선할 수 있다.

행동을 결과와 연결하는 것은 광고주가 성과를 개선하는 더 광범위한 측정 전략의 일부로 사용할 수 있는 도구이다. 효과적인 측정을 통해 광고주는 효과적인 광고에는 더 많이 지출하고 효과가 없는 광고에는 더 적게 지출할 수 있다. 이는 얻는 가치에 비해 광고의 전체 비용을 낮춘다. [ONLINE-ADVERTISING]

콘텐츠 게시자 및 서비스 제공자와 같이 광고 인벤토리를 제공하는 사이트는 더 효율적인 광고로부터 간접적으로 이익을 얻는다. 광고주가 원하는 결과를 가져오는 광고를 더 효과적으로 표시할 수 있는 광고 매체는 광고 게재에 더 높은 비용을 부과할 수 있다.

광고 게재를 통해 지원을 받는 사이트는 양질의 콘텐츠나 서비스를 더 잘 제공할 수 있다. 중요한 점은 이러한 지원이 이용자층으로부터 불균등하게 발생한다는 것이다. 이는 다른 형태의 재정 지원보다 더 공평할 수 있다. 광고된 상품에 지출하려는 경향이나 지출 능력이 낮은 사람도 비용을 지불할 여력이 있는 사람과 동일한 광고 지원 콘텐츠와 서비스를 이용할 수 있다. [EU-AD][COPPACALYPSE]

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

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

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

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

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

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

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

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

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

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

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

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

이러한 그룹화와 각 그룹에 귀속된 전환 횟수는 히스토그램을 구성한다. 히스토그램의 각 버킷은 광고 그룹의 전환 횟수를 집계한다. 이를 통해 그룹 간 비교가 가능하다.

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

목적에 따라 서로 다른 그룹화를 사용할 수 있다. 이를 통해 인과관계를 확립하려는 엄밀한 실험과 서로 다른 처리 조건에 대한 보다 단순한 비교가 모두 가능해진다. 예를 들어, 광고 소재(광고의 콘텐츠)를 기준으로 그룹화하여 서로 다른 광고 소재를 비교할 수 있다.

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

1.7. 제한 사항 및 성공적인 사용

Attribution API가 제공하는 결과는 광고 전략에 관한 의사 결정에 정보를 제공할 수 있다. 그러나 충분한 주의를 기울이지 않으면 API 사용으로 잘못된 의사 결정을 뒷받침하는 오해의 소지가 있는 결과가 나올 수 있다.

API가 제공하는 정보를 사용하여 더 나은 결정을 내리려면, 그 한계—​특히 편향과 오류의 잠재적 원인—​를 이해해야 한다. 이러한 이해는 API를 사용하는 시스템의 설계와 모든 결과의 해석 모두에 적용되어야 한다.

범위의 한계

중요한 한계는 동일한 브라우저에서의 활동만 Attribution API로 포착할 수 있다는 점이다. 광고 캠페인의 범위와 효과가 단일 매체에만 한정되는 경우는 드물다. 이는 얻어진 어떠한 측정 결과도 모든 관련 활동을 포착한다고 가정할 수 없음을 의미한다.

비인과적 효과

광고를 접하는 사람 중 일부는 광고가 유도하려는 행동을 이미 실행할 의도가 있다. 그러한 광고에 결과를 귀속시키면 광고의 효과에 대해 잘못된 인상을 줄 수 있다.

광고의 인과적 효과를 더 정확하게 측정하려면, (무작위) 통제 실험—​또는 업계 용어로 증분성—​을 사용할 필요가 있다 [INFERNO]. 기본적인 광고 통제 실험은 대상 이용자층을 식별하고, 해당 이용자층 내의 처리 그룹에 광고를 제공하고, 통제 그룹에는 광고를 제공하지 않거나 기본 광고를 표시하며, 두 그룹 간 원하는 결과의 차이를 측정하는 방식으로 이루어진다.

이 API는 이러한 실험을 지원하는 데 사용할 수 있다. 이는 통제 모집단과 처리 모집단을 서로 다른 히스토그램 버킷에 할당함으로써 구현할 수 있다. 다만 현재 웹 플랫폼에는 서로 다른 사이트에 걸쳐 사용자를 통제 그룹과 처리 그룹에 일관되게 할당하는 기능이 없다는 점에 유의해야 한다.

단순한 기여도 측정 로직

이 API는 단순한 멀티터치 기여도 측정 알고리즘을 제공한다. 단순한 기여도 측정 알고리즘은 의사 결정에 영향을 미치는 방식으로 결과에 편향을 유발할 수 있다. 향후 버전의 API에서는 더 정교한 알고리즘을 지원할 수 있다.

오류의 원인

분산 측정 시스템에는 여러 가지 오류 원인이 있다. 차등 개인정보 보호는 집계 결과에 일정량의 노이즈를 추가하지만, 그 양은 알려져 있다.

그 밖의 다양한 이유로 결과가 측정 대상을 정확하게 반영하지 못할 수 있으며, 그중 일부는 피할 수 없을 수도 있다. 여기에는 다음이 포함된다.

  • 참여 사이트에 구성을 전파하는 과정에서의 실패 및 지연.

  • 노출 또는 전환 이벤트의 손실을 유발하는 스크립트 오류.

  • 저장소 압박으로 인한 저장된 노출 정보의 손실.

  • 우발적이거나 악의적인 노출 기록.

  • 보고서 손실을 초래하는 네트워크 오류.

  • IVT 분류로 인해 실제 이벤트가 무시되는 경우.

  • IVT 분류에 사기 또는 우발적인 실수가 잘못 포함되는 경우.

이러한 오류는 측정 결과에 알 수 없는 정도의 불확실성을 더할 수 있다. API를 사용하는 사이트는 이러한 오류 및 다른 종류의 오류에 대한 노출을 관리할 책임이 있다. 향후 버전의 API에서는 사이트가 오류를 처리할 때 더 나은 지원을 제공하도록 할 수 있다.

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, 유형은 unsigned long
measureConversion()이 이 노출을 이후의 전환과 일치시키면, 전환 값이 이 인덱스로 식별되는 히스토그램 버킷에 추가된다.
matchValue, 유형은 unsigned long이며, 기본값은 0
노출과 연결된 선택적 메타데이터이다. 이 값은 전환으로부터 기여도를 받을 수 있는 노출을 식별하는 데 사용할 수 있다.
conversionSites, 유형은 sequence<USVString>이며, 기본값은 []
이 노출에 대한 전환이 발생할 수 있는 최상위 전환 사이트이며, 해당 도메인 이름으로 식별된다. measureConversion() 메서드는 표시된 사이트 중 하나가 호출한 경우에만 이 노출에 기여도를 부여한다. 비어 있으면 모든 전환 사이트가 일치한다.
conversionCallers, 유형은 sequence<USVString>이며, 기본값은 []
이 노출을 전환에 대해 선택할 수 있는 중개 사이트 또는 전환 사이트이며, 해당 도메인 이름으로 식별된다. measureConversion() 메서드는 표시된 사이트 중 하나가 호출한 경우에만 이 노출에 기여도를 부여한다. 이 옵션에는 전환 사이트중개 사이트가 모두 포함된다. 비어 있으면 API를 호출하는 모든 사이트가 일치한다.
lifetimeDays, 유형은 unsigned long이며, 기본값은 30
양의 "유효 기간"(일 단위)으로, 이 기간이 지나면 노출은 더 이상 기여도를 받을 수 없다. 사용자 에이전트는 수명에 상한을 두어야 하며, 여기에 지정된 값이 해당 상한을 초과하면 그 값을 자동으로 줄여야 한다.
priority, 유형은 long이며, 기본값은 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"여야 한다. 이는 호스트의 단순 문자열 직렬화만으로 사이트를 식별하기에 충분하다는 의미이다. 따라서 API는 단순한 문자열을 사용하여 사이트를 나타낼 수 있다.

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

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

  2. host가 실패이면, 실패를 반환한다.

  3. sitehost를 전달하여 등록 가능한 도메인을 얻은 결과로 반환된 값으로 설정한다.

  4. site가 null이면, 실패를 반환한다.

  5. site가 "localhost"이거나, ".localhost"로 끝나거나, U+005B ([)로 시작하거나(IPv6 주소임), 또는 숫자로 끝나면(IPv4 주소임), 실패를 반환한다.

  6. ("https", site)로 이루어진 스킴 및 호스트 튜플을 반환한다.

이 알고리즘은 등록 가능한 도메인보다 더 많은 도메인 레이블을 포함하는 문자열에서도 성공적으로 사이트를 생성한다. 예를 들어, "extra.example.com"은 "example.com"으로 파싱된다.

이 알고리즘은 localhost 도메인 [RFC6761]이나 IP 주소인 호스트를 허용하지 않는다. 그 결과, 사이트 이름 추출에 의존하는 모든 알고리즘은 localhost 도메인이나 IP 주소가 언급되거나 현재 사이트(최상위 또는 프레임된 사이트)가 localhost 도메인인 경우 실패한다. 이로 인해 테스트 및 개발에 로컬 서버를 사용하는 것이 어려울 수 있다. 구현은 테스트 및 개발을 지원하기 위해 localhost 검사를 비활성화하는 구성을 제공할 수 있다.

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

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

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

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

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

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

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

에포크 인덱스

에포크 인덱스

사이트

사이트

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

32비트 정수를 선택하면 엡실론 설정이 4294의 최대 엡실론 이하로 제한된다. 이는 구현에 충분하고도 남을 것으로 예상된다.

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

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

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

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

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

개인정보 보호 및 안전 예산을 차감하려면 개인정보 보호 예산 키 key, 집합노출 impressions, 검증된 전환 옵션 options, 그리고 선택적 정수 singleEpochL1Norm이 주어졌을 때:
  1. epsilonoptions엡실론으로 둔다.

  2. valueoptions으로 둔다.

  3. maxValueoptions최댓값으로 둔다.

  4. valueSensitivity를 2 * value로 둔다.

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

  6. valueDeductionFpvalueSensitivity / noiseScale로 둔다.

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

  8. deductionvalueDeduction으로 둔다.

  9. singleEpochL1Norm이 주어진 경우:

    1. l1NormDeductionFpsingleEpochL1Norm / noiseScale로 둔다.

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

    3. deductionl1NormDeduction으로 설정한다.

    단일 에포크 기여 분석은 에포크 전반에 걸쳐 연쇄적인 영향을 일으키지 않는다. 여러 에포크가 관련된 기여 분석은 하나의 변경 사항이 에포크 전반의 기여 분석에 영향을 줄 가능성이 있으므로 예산을 두 배로 소비한다. 차감액을 두 배로 하는 것은 maxValue / epsilon에 비례하는 라플라스 노이즈가 집계된 히스토그램에 추가된다고 가정한다.

  10. 기여 분석 예산 잠금이 true이면, 값이 false가 될 때까지 기다린 다음, 값을 true로 설정한다.

  11. key, deduction, valueDeduction, 그리고 impressions사용 가능한 개인정보 보호 예산 확인을 호출한 결과가 false이면 다음 단계를 수행한다:

    1. 기여 분석 예산 잠금을 false로 설정한다.

    2. false를 반환한다.

  12. 모든 예산 검사를 통과했으므로 다음과 같이 차감한다:

    1. currentValue값을 가져온 결과로 둔다. 이 값은 개인정보 보호 예산 저장소에서 key의 값을 가져오며 기본값은 사이트별 개인정보 보호 예산이다.

    2. 설정한다. 개인정보 보호 예산 저장소에서 key의 값을 currentValuededuction으로 설정한다.

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

    4. currentGlobalValue값을 가져온 결과로 둔다. 이 값은 전역 개인정보 보호 예산 저장소에서 epoch의 값을 가져오며 기본값은 에포크당 전역 개인정보 보호 예산이다.

    5. 설정한다. 전역 개인정보 보호 예산 저장소에서 epoch의 값을 currentGlobalValuevalueDeduction으로 설정한다.

      이 차감은 에포크당 최대 한 번만 발생하는 것이 보장된다. 이는 개인정보 보호 및 안전 예산 차감이 에포크당 최대 한 번만 호출되기 때문이다.

    6. deductedImpressionQuotas를 새로운 집합으로 둔다.

    7. impressions의 각 impression대해:

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

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

      2. deductedImpressionQuotasimpressionSite포함하지 않는 경우:

        1. impressionSitedeductedImpressionQuotas추가한다.

        2. impressionQuotaKey를 항목이 epochimpressionSite개인정보 보호 예산 키로 둔다.

        3. currentImpressionQuotaValue값을 가져온 결과로 둔다. 이 값은 에포크당 노출 사이트 할당량에서 impressionQuotaKey의 값을 가져오며 기본값은 에포크당 노출 사이트 할당량이다.

        4. 설정한다. 에포크당 노출 사이트 할당량[impressionQuotaKey]의 값을 currentImpressionQuotaValuevalueDeduction으로 설정한다.

  13. 기여 분석 예산 잠금을 false로 설정한다.

  14. true를 반환한다.

사용 가능한 개인정보 보호 예산을 확인하려면 개인정보 보호 예산 키 key, integer deduction, integer valueDeduction, 그리고 집합노출 impressions가 주어졌을 때:
  1. currentValue값을 가져와서 얻은 값으로 설정한다. 이때 개인정보 보호 예산 저장소에서 key의 값을 가져오며, 기본값은 사이트별 개인정보 보호 예산이다.

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

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

  4. currentGlobalValue값을 가져와서 얻은 값으로 설정한다. 이때 전역 개인정보 보호 예산 저장소에서 epoch의 값을 가져오며, 기본값은 에포크당 전역 개인정보 보호 예산이다.

  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 API에 접근할 수 없게 되는 것을 방지하려면 더 큰 값이 바람직할 수 있다.

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

사용자 상호작용으로 인해 Document document에서 활성화를 트리거하는 입력 이벤트가 발생하면, 사용자 에이전트는 이벤트를 디스패치하기 전에 활성화 알림 단계에 더하여 아래 단계를 수행해야 한다. 이 경우 내비게이블 navigable을 null로 설정한다.

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

단계는 다음과 같다.

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

  2. 그렇지 않으면, ndocument노드 내비게이블을 가져온 결과로 둔다.

  3. topn최상위 트래버서블을 가져온 결과로 둔다.

  4. top기여도 활성화 타임스탬프현재 고해상도 시간으로 설정한다.

최상위 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를 얻는 알고리즘을 호출하는 부수 효과이다.

에포크 인덱스는 주어진 에포크를 참조하는 정수이다. 에포크 인덱스노출에포크 시작 시간에 접근하는 데 사용된다.

시점이 다른 시점에 상대적인 기간으로만 표현할 수 있는 추상적인 개념인 것과 마찬가지로, 에포크도 추상적이다.

에포크 인덱스는 정해진 기준점을 기준으로 한 정수로 저장된다. 이 명세의 에포크 인덱스에포크 시작 시간을 기준점으로 사용한다. 사용자 에이전트는 "0" 또는 기준 에포크를 나타내기 위해 다른 시점을 사용하도록 선택할 수 있다.

이 명세의 알고리즘은 모두 더 추상적인 에포크가 아니라 구체적인 에포크 인덱스를 사용한다. 시간상의 시점현재 에포크 가져오기 알고리즘을 사용하여 해당 에포크에포크 인덱스로 변환된다.

시점 t가 주어졌을 때 에포크 인덱스를 반환하는 현재 에포크를 가져오기는 다음과 같다.
  1. period를 하나의 에포크기간으로 둔다.

  2. 에포크 시작 시간이 설정되어 있지 않으면, 다음과 같이 이전 에포크 내에서 무작위로 선택한 시간으로 설정한다.

    1. randt에서 0(포함)과 period(제외) 사이에서 무작위로 선택한 기간을 뺀 값으로 둔다.

    2. ms유닉스 에포크에서 rand까지의 기간에 포함된 밀리초 수로 둔다.

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

    4. 에포크 시작 시간유닉스 에포크hour기간으로 더한 값으로 설정한다.

  3. start에포크 시작 시간으로 둔다.

  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를 갱신하는 것을 건너뛸 수 있다:

세 조건이 모두 참이면, 마지막 브라우징 기록 삭제를 업데이트할 필요가 없다. 대신 프라이버시 예산 저장소는 영향을 받는 모든 사이트에포크에서 형성할 수 있는 모든 프라이버시 예산 키 조합에 대해 0의 값을 설정하여 반드시 업데이트해야 한다 (해당하는 에포크 인덱스를 사용한다).

이 최적화는 사용자 에이전트가 영향을 받은 사이트와의 상호작용에 관한 정보를 영향을 받은 에포크에 보존하고 있다는 사실에 의존한다. 이는 보존된 상호작용 중 어느 것이든 예산을 소진시켰을 수 있기 때문에 가능하다. 검색 기록의 공백에 관한 정보가 노출되지 않도록 하려면 예산을 재설정해야 한다.

시점 now가 주어졌을 때 에포크 인덱스를 반환하는 기여 분석의 시작 에포크 가져오기는 다음과 같다.
  1. earliestEpochIndexnow에서 최대 조회 기간일수를 뺀 값을 사용하여 현재 에포크 가져오기를 수행한 결과로 둔다.

    이렇게 하면 가능한 모든 노출을 질의할 수 있다.

  2. startEpochearliestEpochIndex로 둔다.

  3. 마지막 검색 기록 삭제 시점이 설정되어 있으면, 다음 단계를 수행한다.

    1. clearEpoch마지막 검색 기록 삭제 시점의 값을 사용하여 현재 에포크 가져오기를 수행한 결과로 둔다.

      현재 에포크 가져오기 사용은 음수 값을 반환할 수 있다. 이는 에포크 시작 시간이 기록이 마지막으로 삭제된 시간보다 이후의 시간으로 설정될 가능성이 높기 때문이다.

    2. clearEpochclearEpoch + 1로 설정한다.

      기여 분석을 위한 에포크 범위가 검색 기록이 삭제되기 전의 에포크와 겹치지 않도록 하려면 1을 더해야 한다.

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

  4. startEpoch를 반환한다.

집합사이트 sites, 불리언 forgetVisits, 및 시점 now가 주어졌을 때 기여 분석을 위한 검색 기록 삭제는 다음과 같다.
  1. forgetVisits가 false인 경우:

    1. 단언: sites비어 있지 않다.

    2. startingEpochnow를 지정하여 기여 분석의 시작 에포크를 가져오기를 호출한 결과로 설정한다.

    3. currentEpochnow를 지정하여 현재 에포크를 가져오기를 호출한 결과로 설정한다.

    4. sites의 각 site에 대해 다음을 수행한다:

      1. startingEpoch부터 currentEpoch까지의 양 끝을 포함하는 범위에 있는 각 epoch에 대해 다음을 수행한다:

        1. keysiteepoch로 구성된 개인정보 보호 예산 키로 설정한다.

        2. 설정: 개인정보 보호 예산 저장소[key]를 0으로 설정한다.

    5. 반환한다.

  2. sites비어 있는 경우:

    1. 비운다: 노출 저장소를 비운다.

    2. 비운다: 개인정보 보호 예산 저장소를 비운다.

    3. 비운다: 노출 사이트 할당량 저장소를 비운다.

    4. 비운다: 전역 개인정보 보호 예산 저장소를 비운다.

  3. sites비어 있지 않은 경우:

    1. 노출 저장소impression에 대해, sitesimpression노출 사이트포함하는 경우, impression을 제거한다.

    2. 개인정보 보호 예산 저장소에 있는 각 key에 대해 다음을 수행한다. siteskey사이트 구성 요소를 포함하는 경우, 제거: 개인정보 보호 예산 저장소[key]를 제거한다.

    3. 노출 사이트 할당량 저장소에 있는 각 key에 대해 다음을 수행한다. siteskey사이트 구성 요소를 포함하는 경우, 제거: 노출 사이트 할당량 저장소[key]를 제거한다.

      이 과정은 전역 개인정보 보호 예산 저장소를 건드리지 않는다. 주된 목적은 한 번 소진된 개인정보 보호 예산이 잊히지 않도록 보장하는 것이다.

  4. 마지막 탐색 기록 삭제now로 설정한다.

    일부 사이트의 상태만 삭제하면서 마지막 탐색 기록 삭제를 설정하면 (즉, sites비어 있지 않은 경우) 해당 집합에 없는 사이트에서는 일부 노출에 접근할 수 없게 된다. 구현은 결과적으로 사용할 수 없게 된 모든 노출과 모든 예산 레코드 (예: 전역 개인정보 보호 예산 저장소에 있는 레코드)를 제거할 수도 있다.

4.3. 노출 저장 알고리즘

saveImpression(options) 메서드 단계는 다음과 같다:
  1. implicitInputs암시적 API 입력을 얻은 결과로 설정한다. 이때 this에서 얻으며, 던져진 이유가 있으면 그 이유로 거부된 프로미스를 반환한다.

  2. 단언: implicitInputs는 null이 아니다.

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

AttributionImpressionOptions options암시적 API 입력 implicitInputs가 주어졌을 때 노출을 저장하려면:
  1. documentimplicitInputs연결된 문서로 설정한다.

  2. realmdocument관련 렐름으로 설정한다.

  3. document가 "save-impression"이라는 이름의 정책 제어 기능사용하도록 허용되지 않은 경우, realm에서 "NotAllowedError" DOMException으로 거부된 프로미스를 반환한다.

  4. document가 주어졌을 때 Attribution API 활성화를 확인하고, 던져진 이유가 있으면 그 이유로 거부된 프로미스를 반환한다.

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

    1. options.histogramIndex구현 정의 최대 히스토그램 크기보다 크거나 같으면, realm에서 RangeError거부된 프로미스를 반환한다.

    2. options.lifetimeDays가 0이면, realm에서 RangeError거부된 프로미스를 반환한다.

    3. options.lifetimeDays최대 룩백으로 제한한다.

    4. options.conversionSites크기구현 정의 노출당 최대 전환 사이트 수보다 크면, realm에서 RangeError거부된 프로미스를 반환한다.

    5. conversionSitesoptions.conversionSites의 각 값에 대해 사이트를 파싱한 결과인 집합으로 설정한다.

    6. conversionSites의 결과 중 하나라도 실패이면, realm에서 "NotAllowedError" DOMException으로 거부된 프로미스를 반환한다.

    7. options.conversionCallers크기구현 정의 노출당 최대 전환 호출자 수보다 크면, realm에서 RangeError거부된 프로미스를 반환한다.

    8. conversionCallersoptions.conversionCallers의 각 값에 대해 사이트를 파싱한 결과인 집합으로 설정한다.

    9. conversionCallers의 결과 중 하나라도 실패이면, realm에서 "NotAllowedError" DOMException으로 거부된 프로미스를 반환한다.

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

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

      일치 값

      options.matchValue

      노출 사이트

      implicitInputs최상위 사이트

      중개 사이트

      implicitInputs중개 사이트

      전환 사이트

      conversionSites

      전환 호출자

      conversionCallers

      타임스탬프

      implicitInputs타임스탬프

      수명

      options.lifetimeDays

      히스토그램 인덱스

      options.histogramIndex

      우선순위

      options.priority

    2. Attribution API가 활성화되어 있으면, impression노출 저장소에 저장한다.

  7. result를 새로운 AttributionImpressionResult로 설정한다.

  8. realm에서 result이행된 프로미스를 반환한다.

saveImpression()은 노출이 기록되었는지를 나타내는 상태를 반환하지 않는다. 이는 Attribution API가 비활성화된 시점을 감지할 수 있는 능력을 최소화한다.

구현은 API 상태를 드러낼 수 있는 부채널을 완화하려고 반드시 시도해야 한다. 예를 들어, 반환된 프로미스의 이행은 impression노출 저장소에 저장하는 것을 조건으로 하지 않으며, 이를 통해 이행에 걸리는 시간이 기존 노출의 수나 API의 활성화 여부에 좌우되지 않도록 한다.

암시적 API 입력은 다음 필드를 가진 구조체이다:

최상위 사이트: 사이트.
중개 사이트: 사이트 또는 undefined.
타임스탬프: 시점.
연결된 문서: Document.
선택적 오리진(기본값 null)을 사용하여 렐름 realm에서 암시적 API 입력을 얻으려면:
  1. windowrealm전역 객체로 설정한다.

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

  3. settingsrealm설정 객체로 설정한다.

  4. timestampsettings현재 벽시계 시간으로 설정한다.

  5. topLevelOriginsettings최상위 오리진으로 설정한다.

  6. topLevelSitetopLevelOrigin에서 호환 가능한 사이트를 얻은 결과로 설정한다.

  7. origin이 null이면, originsettings오리진으로 설정한다.

  8. intermediarySite를 다음과 같이 설정한다:

    1. origintopLevelOrigin동일 사이트이면 undefined 값,

    2. 그렇지 않으면, origin에서 호환 가능한 사이트를 얻은 결과.

  9. 다음 필드를 가진 암시적 API 입력을 반환한다:

    최상위 사이트

    topLevelSite

    중개 사이트

    intermediarySite

    타임스탬프

    timestamp

    연결된 문서:

    window연결된 문서

오리진 origin이 주어졌을 때 사이트를 반환하는 호환 가능한 사이트를 얻으려면:
  1. origin튜플 오리진이 아니면, "NotAllowedError" DOMException을 던진다.

  2. hostorigin호스트 구성 요소로 설정한다.

  3. host가 "localhost"이면, host가 ".localhost"로 끝나면, host가 U+005B ([)로 시작하면, 또는 host숫자로 끝나면, "NotAllowedError" DOMException을 던진다.

  4. origin에서 사이트를 얻은 결과를 반환한다.

localhost 도메인과 IP 주소 호스트의 처리에 관한 참고 사항은 § 4.1.4 사이트 이름을 참조한다.

4.4. 전환 측정 알고리즘

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

measureConversion(options) 메서드 단계는 다음과 같다:
  1. implicitInputs암시적 API 입력을 얻은 결과로 설정한다. 이때 this에서 얻으며, 던져진 이유가 있으면 그 이유로 거부된 프로미스를 반환한다.

  2. 단언: implicitInputs는 null이 아니다.

  3. optionsimplicitInputs전환을 측정한 결과를 반환한다.

AttributionConversionOptions options암시적 API 입력 implicitInputs가 주어졌을 때 전환을 측정하려면:
  1. documentimplicitInputs연결된 문서로 설정한다.

  2. realmdocument관련 렐름으로 설정한다.

  3. document가 "measure-conversion"이라는 이름의 정책 제어 기능사용하도록 허용되지 않은 경우, realm에서 "NotAllowedError" DOMException으로 거부된 프로미스를 반환한다.

  4. document가 주어졌을 때 Attribution API 활성화를 확인하고, 던져진 이유가 있으면 그 이유로 거부된 프로미스를 반환한다.

  5. validatedOptionsoptions검증한 결과로 설정하고, 던져진 이유가 있으면 그 이유로 거부된 프로미스를 반환한다.

  6. promiserealm새 프로미스로 설정한다.

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

    1. reportvalidatedOptions히스토그램 크기를 사용하여 모든 값이 0인 히스토그램을 생성한 결과로 설정한다.

    2. Attribution API가 활성화되어 있으면, reportvalidatedOptions, implicitInputs최상위 사이트, implicitInputs중개 사이트, 그리고 implicitInputs타임스탬프를 사용하여 어트리뷰션을 수행하고 히스토그램을 채운 결과로 설정한다.

    3. aggregationServicevalidatedOptions집계 서비스로 설정한다.

    4. aggregationService.protocol의 값에 따라 분기한다:

      dap-18-histogram

      다음 단계를 수행한다:

      1. encryptedReportvalidatedOptions, implicitInputs최상위 사이트, implicitInputs중개 사이트, implicitInputs타임스탬프, 그리고 report가 주어졌을 때 DAP 보고서를 구성한 결과로 설정한다.

    5. result를 다음 항목을 가진 AttributionConversionResult로 설정한다:

      report

      encryptedReport

    6. promiseresult이행하도록 Attribution 태스크 소스태스크를 큐에 넣는다.

  8. promise를 반환한다.

구현은 API 상태를 드러낼 수 있는 부채널을 완화하려고 반드시 시도해야 한다. 예를 들어, 이상적으로는 반환된 프로미스를 이행하는 데 걸리는 시간이 저장되었거나 일치한 노출의 수 또는 API의 활성화 여부에 좌우되지 않아야 한다.

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

집계 서비스: AttributionAggregationService의 인스턴스.
엡실론: 유한한 양수.
히스토그램 크기: 32비트 부호 없는 정수.
룩백: 양의 지속 시간.
일치 값: 32비트 부호 없는 정수집합.
노출 사이트: 사이트집합.
노출 호출자: 사이트집합.
크레딧: 숫자의 목록.
: 32비트 부호 없는 정수.
최대 값: 32비트 부호 없는 정수.
AttributionConversionOptions options검증하려면:
  1. aggregationServicesoptions.aggregationService로 갖는 항목포함하지 않으면, ReferenceError를 던진다.

  2. aggregationServiceoptions.aggregationService가 주어졌을 때 AttributionAggregationServices에서 값을 가져온 결과로 설정한다.

  3. options.epsilon이 0 이하이거나 최대 엡실론보다 크면, RangeError를 던진다.

  4. options.histogramSize가 0이거나 구현 정의 최대 히스토그램 크기보다 크거나, options.aggregationService에 대해 최대 집계 서비스 히스토그램 크기가 있는 경우 그보다 크면, RangeError를 던진다.

  5. options.value가 0이면, RangeError를 던진다.

  6. options.valueoptions.maxValue보다 크면, RangeError를 던진다.

  7. creditoptions.credit존재하면 그 값으로, 그렇지 않으면 «1»로 설정한다.

  8. credit비어 있으면, RangeError를 던진다.

  9. credit항목 중 하나라도 0 이하이면, RangeError를 던진다.

  10. credit크기구현 정의 최대 크레딧 값 수를 초과하면, RangeError를 던진다.

  11. lookbackoptions.lookbackDays존재하면 해당 일수로, 그렇지 않으면 최대 룩백 일수로 설정한다.

  12. lookback이 해당 최대값보다 크면 lookback최대 룩백 일수로 설정한다.

  13. lookback이 0 이면, RangeError를 던진다.

  14. options.matchValues크기구현 정의 최대 일치 값 수보다 크면, RangeError를 던진다.

  15. matchValuesoptions.matchValues를 사용하여 집합을 생성한 결과로 설정한다.

  16. options.impressionSites크기구현 정의 전환을 위한 최대 노출 사이트 수보다 크면, RangeError를 던진다.

  17. impressionSitesoptions.impressionSites의 각 값에 대해 사이트를 파싱한 결과인 집합으로 설정한다.

  18. impressionSites의 결과 중 하나라도 실패이면, "NotAllowedError" DOMException을 던진다.

  19. options.impressionCallers크기구현 정의 전환을 위한 최대 노출 호출자 수보다 크면, RangeError를 던진다.

  20. impressionCallersoptions.impressionCallers의 각 값에 대해 사이트를 파싱한 결과인 집합으로 설정한다.

  21. impressionCallers의 결과 중 하나라도 실패이면, "NotAllowedError" DOMException을 던진다.

  22. 다음 필드를 가진 검증된 전환 옵션을 반환한다:

    집계 서비스

    aggregationService

    엡실론

    options.epsilon

    히스토그램 크기

    options.histogramSize

    룩백

    lookback

    일치 값

    matchValues

    노출 사이트

    impressionSites

    노출 호출자

    impressionCallers

    크레딧

    credit

    options.value

    최대 값

    options.maxValue

4.4.1. 어트리뷰션 로직

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

어트리뷰션을 수행하고 히스토그램을 채우려면, 검증된 전환 옵션 options, 사이트 topLevelSite, 사이트 또는 undefined intermediarySite, 그리고 시점 now가 주어졌을 때:
  1. currentEpochnow현재 에포크 가져오기를 수행한 결과로 둔다.

  2. startEpochnow기여 분석의 시작 에포크 가져오기를 수행한 결과로 둔다.

  3. earliestEpoch를 (nowoptions조회 기간)을 전달하여 현재 에포크 가져오기를 호출한 결과로 둔다.

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

  5. isSingleEpoch가 true인 경우:

    1. impressionsoptions, topLevelSite, intermediarySite, currentEpoch, 그리고 now공통 일치 로직을 호출한 결과로 둔다.

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

    3. histogramimpressions, options히스토그램 크기, options, 그리고 options크레딧으로 마지막 n회 접점 기여 분석으로 히스토그램 채우기를 수행한 결과로 둔다.

    4. l1Normhistogram항목의 합으로 둔다.

    5. 단언: l1Normoptions보다 작거나 같다.

    6. key를 항목이 currentEpochtopLevelSite개인정보 보호 예산 키로 둔다.

    7. budgetAndSafetyOkkey, impressions, options, 그리고 l1Norm으로 개인정보 보호 및 안전 예산 차감을 호출한 결과로 둔다.

    8. budgetAndSafetyOk가 true이면 histogram을 반환한다.

    9. options히스토그램 크기모든 값이 0인 히스토그램 생성을 호출한 결과를 반환한다.

  6. matchedImpressions 집합으로 둔다.

  7. startEpoch부터 currentEpoch까지 각 epoch에 대해, 양 끝값을 포함하여:

    1. impressionsoptions, topLevelSite, intermediarySite, epoch, 그리고 now공통 일치 로직을 호출한 결과로 둔다.

    2. impressions비어 있지 않으면:

      1. key를 항목이 epochtopLevelSite개인정보 보호 예산 키로 둔다.

      2. budgetAndSafetyOkkey, impressions, 그리고 options으로 개인정보 보호 및 안전 예산 차감을 호출한 결과로 둔다.

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

  8. matchedImpressions비어 있으면, options히스토그램 크기모든 값이 0인 히스토그램 생성을 호출한 결과를 반환한다.

  9. histogrammatchedImpressions, options히스토그램 크기, options, 그리고 options크레딧으로 마지막 n회 접점 기여 분석으로 히스토그램 채우기를 수행한 결과로 둔다.

  10. histogram을 반환한다.

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

4.4.2. 공통 노출 매칭 로직

공통 일치 로직을 수행하려면, 다음이 주어졌을 때 검증된 전환 옵션 options, 사이트 topLevelSite, 사이트 또는 undefined intermediarySite, 에포크 인덱스 epoch, 그리고 시점 now:
  1. matching 집합으로 둔다.

  2. 노출 저장소의 각 impression에 대해 반복한다.

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

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

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

    4. nowimpression타임스탬프options조회 기간을 더한 시점보다 이후이면, 계속한다.

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

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

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

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

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

    10. impression중개 사이트undefined가 아니면 impressionCaller를 그 값으로, 그렇지 않으면 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에 대해 구현 정의 최대 조회 기간을 설정한다. 최대 조회 기간은 양의 정수로 나타낸 일수이다. 이 두 값에 서로 다른 최댓값을 둘 필요는 없다. 두 값 중 더 작은 값이 저장된 노출 중 어떤 것이 전환에 사용 가능한지를 결정하기 때문이다.

구현은 반드시 최대 조회 기간을 최소 30일로 설정해야 한다. 이 기간 내에 구현은 각 노출 사이트당 최소 1000개의 노출을 보존하도록 노력해야 한다.

구현은 가능한 경우 시간과 개수에 대한 이러한 권장 제한을 넘어 노출을 보존해야 한다. 노출을 저장하는 데 사용할 수 있는 용량은 노출 데이터를 보존하는 데 필요한 저장 공간과 전환 보고서를 생성하는 데 필요한 처리 시간 모두에 따라 달라진다. 사이트가 사용 가능한 용량을 초과하여 노출 저장을 요청하거나, 사용자가 요청하거나(§ 9.2 Attribution API 비활성화 참조), 또는 구현 정의 이유가 있는 경우, 구현은 이러한 제한에 도달하기 전에 노출을 폐기할 수 있다.

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

saveImpression()measureConversion()에 전달되는 사이트 목록에 대해 구현 정의 값이 선택된다. 노출당 최대 전환 사이트 수conversionSites 값의 개수에 대한 제한이며, 구현은 반드시 이 값을 최소 5로 설정해야 한다. 노출당 최대 전환 호출자 수전환에 대한 최대 노출 호출자 수는 각각 conversionCallersimpressionCallers 값의 개수에 대한 제한이며, 구현은 반드시 이 값들을 각각 최소 10으로 설정해야 한다. 전환에 대한 최대 노출 사이트 수impressionSites 값의 개수에 대한 제한이며, 구현은 반드시 이 값을 최소 30으로 설정해야 한다.

최대 크레딧 값 수에 대해 구현 정의 값이 선택되며, 이는 credit 값의 개수에 대한 제한이다. 구현은 반드시 이 값을 최소 10으로 설정해야 한다. 최대 일치 값 수에 대해 구현 정의 값이 선택되며, 이는 matchValues 값의 개수에 대한 제한이다. 구현은 반드시 이 값을 최소 30으로 설정해야 한다.

measureConversion()이 생성하는 히스토그램의 크기는 구현 정의 최대 히스토그램 크기최대 집계 서비스 히스토그램 크기 모두의 제한을 받는다. 집계 기술의 선택이 제한을 설정할 것으로 예상되므로 최대 히스토그램 크기에는 최솟값이 설정되지 않는다. 최대 집계 서비스 히스토그램 크기집계 서비스가 사용하는 기술의 선택에 의해 결정되는 고정된 값이며, 구현 정의가 아니다.

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

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

사이트별 사이트 예산의 배수로 안전 제한을 구성하면 여러 사이트에서 API를 어떻게 사용할 수 있는지가 결정된다. 이 배수를 설정할 때, 구현은 예산을 사용할 것으로 예상되는 사이트 수를 고려해야 하며, 예산을 완전히 사용하지 않는 사이트를 고려하여 그 수를 낮춰 조정할 수도 있다.

사이트별 사이트 예산의 배수로 안전 제한을 설정하면 공유 제한을 소진하려면 많은 사이트의 협력이 필요하게 되어, 이러한 제한은 주요 프라이버시 메커니즘이라기보다 악용을 방지하기 위한 수단으로 주로 유용하게 된다.

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"로 설정하여 구조화 필드를 파싱한 결과로 둔다.

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

  3. histogramIndexdict["histogram-index"]의 기본값undefined인 값으로 둔다.

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

  5. opts를 다음 항목을 갖는 새로운 AttributionImpressionOptions로 둔다.

    histogramIndex

    histogramIndex

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

    1. conversionSites를 그 으로 둔다.

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

    3. opts.conversionSitesconversionSites로 설정한다.

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

    1. conversionCallers를 그 으로 둔다.

    2. conversionCallers내부 목록이 아니거나, 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"로 설정하여 구조화 필드를 파싱한 결과로 둔다.

  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 파서를 적용한 결과로 둔다.

  10. reportUrl이 실패이면 오류를 반환한다.

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

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

  13. opts를 다음 항목을 갖는 새로운 AttributionConversionOptions로 둔다.

    aggregationService

    aggregationService

    histogramSize

    histogramSize

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

    1. epsilon을 그 으로 둔다.

    2. epsilon십진수 또는 정수가 아니면 오류를 반환한다.

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

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

    1. lookbackDays를 그 으로 둔다.

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

    3. opts.lookbackDayslookbackDays로 설정한다.

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

    1. matchValues를 그 으로 둔다.

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

    3. opts.matchValuesmatchValues로 설정한다.

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

    1. impressionSites를 그 으로 둔다.

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

    3. opts.impressionSitesimpressionSites로 설정한다.

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

    1. impressionCallers를 그 으로 둔다.

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

    3. opts.impressionCallersimpressionCallers로 설정한다.

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

    1. credit을 그 으로 둔다.

    2. credit내부 목록이 아니거나, credit항목 중 하나라도 십진수 또는 정수가 아니면 오류를 반환한다.

    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. vdaflength, maxValue, 그리고 chunkLength를 전달하여 생성한 새로운 PrioL1BoundSum VDAF [PRIO-L1] 인스턴스로 설정한다.

  5. microEpsilonoptions엡실론에 1,000,000을 곱한 다음 양의 무한대 방향으로 반올림한 값으로 설정한다.

  6. intermediarySiteundefined가 아니면 callerintermediarySite로 설정하고, 그렇지 않으면 topLevelSite로 설정한다.

  7. taskConfig4.2절에 정의된 대로 TaskConfiguration 인스턴스를 인코딩하여 생성된 바이트 시퀀스로 설정한다. 이는 [DAP]의 다음 값을 사용한다:

    1. task_info.

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

    3. helper_aggregator_endpoint를 DAP Helper의 직렬화된 URL로 설정하며, 이는 options.집계 서비스에서 선택된 집계 서비스구현 정의 정의에서 가져오며, leader_aggregator_endpoint 값과 동일한 절차를 사용하여 생성한다.

    4. time_precision 값은 5.

    5. min_batch_size 값은 20.

    6. batch_mode 값은 TBD(Attribution API를 위한 분산 집계 프로토콜(DAP) 확장 § batch-mode 참조).

    7. batch_config.

    8. vdaf_type 값은 7(기여도에 대한 L1 노름 경계를 사용하는 벡터 합을 위한 Prio 인스턴스화 § dap 참조).

    9. vdaf_configurationlength, maxValue, 그리고 chunkLength를 사용하여 PrioL1BoundSum 기여도에 대한 L1 노름 경계를 사용하는 벡터 합을 위한 Prio 인스턴스화 § dap에 따라 인코딩한다.

    10. 태스크 확장 집합 extensions16비트 부호 없는 정수에서 바이트 시퀀스로의 이다:

  8. taskIDtaskConfig를 전달하여 DAP를 위한 태스크 바인딩 및 인밴드 프로비저닝 § task-id에 설명된 절차로 생성된 바이트 시퀀스로 설정한다.

  9. ctx4.4.2.1절에 정의된 대로 인코딩된 문자열 dap-18taskID를 연결하여 형성한 바이트 시퀀스로 설정한다. 이는 [DAP]에 정의되어 있다.

  10. reportID를 암호학적으로 안전한 난수 소스 [RFC4086]에서 샘플링한 16바이트로 설정한다.

  11. rand를 암호학적으로 안전한 난수 소스 [RFC4086]에서 샘플링한 128바이트로 설정한다.

  12. publicShare, inputSharesctx, histogram, reportID(VDAF "nonce" 매개변수로), 그리고 rand를 사용하여 vdaf.shard()를 호출한 결과로 설정한다. 이는 4.1절[VDAF]에 정의되어 있다.

  13. timeUnix 에포크에서 now까지의 지속 시간을 5초의 지속 시간으로 나눈 다음, 음의 무한대 방향으로 반올림하여 얻은 정수로 설정한다.

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

  15. reportMetadatareportID, time, 그리고 extensions에서 생성한 인코딩된 DAP ReportMetadata로 설정한다.

  16. encryptedInputShares 목록으로 설정한다.

  17. inputShares의 각 share대해, 4.4.2.1절에 설명된 공유를 암호화하는 방법을 따른다:

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

      "dap-18-histogram"의 URL은 DAP Leader 역할을 식별할 것으로 예상된다. 구현은 두 Aggregator 모두에 대한 HPKE 구성을 정적으로 얻어야 한다. § 9.4 구성되지 않은 브라우저를 참조한다.

    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 Aggregator에서 얻은 집계 서비스 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 보장을 제공한다. 전역 예산은 악의적인 사이트의 조직적인 공격이 발생할 경우를 위한 대체 보호 수단으로 볼 수 있다.

전역 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의 함수 실행 시간 변동은 보장을 유지하기 위한 주요 고려 사항이다. 실행 시간과 관련하여 특히 우려되는 두 가지 요소가 있다.

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

모든 사이드 채널을 완전히 제거하는 것은 현실적으로 어렵지만, 구현은 기여도 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 전용 제어 기능을 사용하거나, 여러 기능에 적용되는 통합 프라이버시 제어 기능을 통해 사용자가 참여를 거부할 수 있는 선택권을 제공할 수 있다.

사용자 에이전트 개발자는 다른 프라이버시 모드와 Attribution API의 상호 작용을 고려하는 것이 권장된다. 예를 들어, 비공개 브라우징 모드에서는 어트리뷰션이 비활성화될 수 있으며, 또는 사용자가 진단 데이터 수집을 거부한 경우 비활성화될 수도 있다.

설계상 사용자가 참여를 거부했는지는 웹사이트에서 감지할 수 없다.

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

9.3. 가시성

구현은 사용자가 노출 저장소의 상태를 확인하고 과거 보고서 제출 내역을 검토할 수 있는 방법을 제공하는 것이 권장된다.

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

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

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

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

구성을 가져오는 작업으로 인해 measureConversion() 호출의 해결이 지연될 수 있다면, 이는 타이밍 부채널을 생성한다. 대신 가짜 응답이 생성되는 경우, 올바르게 구성된 사용자 에이전트의 응답과 가짜 응답 간의 차이가 관찰될 수 있다. 이는 키 식별자 또는 암호화되지 않은 기타 메타데이터의 사용일 수 있다. 암호문 길이의 차이 역시 암호화되는 내용의 변경이나 알고리즘 선택의 변경을 드러낼 수 있다.

오래되었거나 존재하지 않는 구성을 감지하는 것은 핑거프린팅을 통해 사용자 에이전트를 식별하는 데 사용될 수 있다. HPKE 구성은 요청 시 가져와서는 안 된다. 그렇게 하는 데 걸리는 시간이 measureConversion() 호출자에게 정보를 유출하기 때문이다.

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

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

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

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

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

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

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

9.7. API 상태 지우기

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

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

사용자 에이전트재량에 따라 API가 비활성화될 때 프라이버시 예산 저장소에포크 시작 시간에서 데이터를 지울 수 있다. 이 경우 API가 다시 활성화되면, API가 비활성화되기 전에 얼마나 많은 예산이 소비되었는지 확인할 방법이 없다. 이 경우 사용자 에이전트마지막 브라우징 기록 삭제 값을 업데이트하여 프라이버시 예산이 의도치 않게 초과되지 않도록 할 수 있다.

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
[INFERNO]
Garrett A. Johnson. Inferno: 온라인 디스플레이 광고의 현장 실험 가이드. 2023-01-18. URL: https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3581396
[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);
};