1. 소개
이 문서는 브라우저가 집계되고 차등 프라이버시가 적용된 메트릭을 수집할 수 있게 하는 API를 정의한다.
이 API의 목표는 광고 기여도 측정을 가능하게 하는 것이다.
1.1. 어트리뷰션
광고에서, 어트리뷰션은 관심 있는 결과보다 앞서 발생한 동작을 식별하고, 그 동작에 가치를 할당하는 과정이다.
광고주가 관심을 가지는 동작은 주로 광고를 표시하는 것 (또한 노출이라고도 한다)이다. 다른 동작에는 광고 클릭(또는 다른 상호작용)과 사용되지 않은 광고 표시 기회가 포함된다.
광고에서 원하는 결과는 더 다양하다. 광고 표시를 통해 광고주가 개선하려는 모든 결과를 포함하기 때문이다. 바람직한 결과는 전환이라고도 할 수 있으며, 이는 잠재 고객을 고객으로 “전환”하는 것을 의미한다. 전환으로 간주되는 것은 판매, 구독, 페이지 방문 및 문의를 포함할 수 있다.
이 API에서, 동작과 결과는 모두 이벤트, 즉 한 번 발생하는 일이다. 광고를 위한 어트리뷰션의 고유한 점은 이러한 이벤트가 같은 사이트에서 발생하지 않을 수도 있다는 것이다. 광고는 광고주의 사이트가 아닌 다른 사이트에서 가장 자주 표시된다.
어트리뷰션의 주요 과제는 프라이버시를 유지하는 데 있다. 어트리뷰션은 서로 다른 사이트의 활동을 연결하는 일을 포함한다. 어트리뷰션의 목표는 전환이 발생하기 전에 같은 사람에게 표시된 노출을 찾는 것이다.
어트리뷰션 정보가 직접 공개된다면, 원치 않는 교차 컨텍스트 인식을 가능하게 하여, 그 결과 추적을 가능하게 할 것이다.
이 문서는 어트리뷰션 정보가 집계 서비스를 사용하여 집계되도록 보장함으로써 교차 컨텍스트 인식을 피한다. 집계 서비스는 각 사람이 해당 집계에 기여하는 값을 드러내지 않고 집계를 계산한다고 신뢰된다.
각 브라우저 인스턴스가 주어진 사이트의 집계에 기여하는 정보의 양에는 엄격한 제한이 적용된다. 각 기여에 추가적인 프라이버시 보호를 제공하기 위해 차등 프라이버시가 사용된다.
집계 서비스 동작의 세부사항은 § 6 집계에 포함되어 있다. 사용된 차등 프라이버시 설계는 § 7 차등 프라이버시에서 개괄한다.
1.2. 배경
웹의 초기부터, 광고는 사이트 제작을 재정적으로 지원하기 위해 널리 사용되어 왔다.
웹을 다른 광고 매체와 구별하게 한 한 가지 특징은 광고 캠페인의 효과에 대한 정보를 얻을 수 있다는 점이었다.
웹 광고주는 도달률(광고를 본 사람 수), 빈도(각 사람이 광고를 본 횟수), 및 전환(광고를 본 뒤 나중에 그 광고가 유도하려던 동작을 수행한 사람 수)과 같은 주요 메트릭을 측정할 수 있었다. 이에 비해, 이러한 측정은 다른 어떤 매체보다도 훨씬 더 시의적절하고 정확했다.
측정 성능의 비용은 프라이버시였다. 정확하고 포괄적인 정보를 생성하기 위해, 광고 비즈니스는 모든 웹 사용자의 활동을 광범위하게 추적했다. 각 브라우저에는 추적 식별자가 부여되었으며, 흔히 교차 사이트 콘텐츠가 기록하는 쿠키를 사용했다. 관심 있는 모든 동작은 이 식별자에 대해 기록되어, 한 사람의 온라인 활동에 대한 포괄적인 기록을 형성했다.
한 사람의 동작에 대한 상세한 기록을 보유하면 광고주가 사람들에 대한 특성을 추론할 수 있었다. 이러한 특성은 광고에 적합한 대상을 선택하기 쉽게 하여, 그 효과를 크게 향상시켰다. 이는 더 많은 정보를 수집하려는 강한 유인을 만들었다.
온라인 광고는 매우 경쟁적이다. 광고를 표시하는 사이트는 각 광고 게재에서 최대한 많은 수익을 얻으려 한다. 광고주는 비용 대비 가장 큰 효과가 있을 곳에 광고를 게재하려 한다. 이러한 주체들—및 그들을 대신하여 운영하는 중개자들—이 얻는 모든 경쟁 우위는 잠재적 대상에 대한 더 포괄적인 정보를 보유하는 데 달려 있다.
시간이 지나면서, 관심 있는 동작은 온라인 활동의 거의 모든 측면을 포함하도록 확장되었다. 그 정보를 웹 밖의 활동과 연관시키는 방법이 고안되었다. 다양한 목적을 위해 거래되는 개인 정보의 여러 판매자가 참여하는 활발한 거래가 형성되었다.
1.3. 목표
이 문서의 목표는 추적을 가능하게 하지 않는 방식으로 광고를 위한 어트리뷰션을 수행하는 수단을 정의하는 것이다.
1.4. 최종 사용자 이점
광고 성과의 측정은 새로운 교차 사이트 정보 흐름을 만든다. 그 정보 흐름은 교차 컨텍스트 인식이라는 프라이버시 위험 또는 비용을 만들며, 이는 최종 사용자에게 주는 이점의 관점에서 정당화되어야 한다.
어트리뷰션 사용을 통해 최종 사용자가 얻는 모든 이점은 간접적이다.
웹사이트를 방문하는 최종 사용자는 사이트가 보여주는 광고에 대한 자신의 주의를 통해 주로 “무료” 콘텐츠나 서비스의 비용을 지불한다. 이 “가치”는 광고주에게 발생하며, 광고주는 다시 사이트에 비용을 지불한다. 사이트는 이 돈을 콘텐츠나 서비스 제공을 지원하는 데 사용할 것으로 기대된다.
어트리뷰션 측정 시스템에 참여하는 것은 웹 사용자에게 2차 비용을 구성할 것이다.
어트리뷰션 지원은 더 효과적인 광고를 가능하게 하며, 대체로 어떤 광고가 어떤 상황에서 가장 잘 작동하는지에 대해 광고주에게 알려줌으로써 이루어진다. 그러한 상황에는 광고가 표시되는 시간과 장소, 광고가 제시되는 사람, 그리고 광고 자체의 세부사항이 포함될 수 있다.
그 정보를 결과에 연결하면 광고주는 자신이 가장 가치 있게 여기는 결과로 가장 자주 이어지는 상황을 알 수 있다. 이를 통해 광고주는 효과적인 광고에는 더 많이 지출하고 효과적이지 않은 광고에는 덜 지출할 수 있다. 이는 얻은 가치에 비해 광고의 전체 비용을 낮춘다. [ONLINE-ADVERTISING]
콘텐츠 게시자와 서비스 제공자처럼 광고 인벤토리를 제공하는 사이트는 더 효율적인 광고에서 간접적인 이익을 얻는다. 광고주가 원하는 결과로 이어지는 광고를 더 잘 보여줄 수 있는 광고 매체는 광고 게재에 더 많은 비용을 청구할 수 있다.
광고 게재를 통해 지원을 얻는 사이트는 양질의 콘텐츠나 서비스를 더 잘 제공할 수 있다. 중요한 점은, 그 지원이 사용자층에서 고르게 도출되지 않는다는 것이다. 이는 다른 형태의 재정 지원보다 더 공평할 수 있다. 광고 상품에 지출할 경향이나 능력이 더 낮은 사람도 지불할 여력이 있는 사람과 동일한 광고 지원 콘텐츠와 서비스를 이용할 수 있다. [EU-AD][COPPACALYPSE]
광고로 지원되는 “무료” 서비스를 제공할 수 있는 능력은 그 서비스의 가치에서 비롯되는 측정 가능한 경제적 이익을 가진다. [FREE-GDP]
1.5. 집단적 프라이버시 효과
집계를 사용하면—올바르게 구현된 경우—사이트에 제공되는 정보가 개인이 아니라 그룹에 관한 것이 되도록 보장한다.
따라서 이 메커니즘의 도입은 집단적 프라이버시라는 개념에 맞는 집단적 의사결정을 나타낸다.
어트리뷰션 측정 참여는 참여하는 그룹이 더 클수록 더 낮은 프라이버시 비용을 가진다. 이는 사이트가 집계에서 개인에 대한 정보를 추출할 수 있는 능력에 집계가 미치는 영향 때문이다. 이는 특히 중앙 차등 프라이버시에서 그렇다. 이것이 이 명세에서 사용되는 프라이버시 설계의 수학적 기반이다.
더 큰 참여자 집단은 측정되는 광고에 대한 더 대표성 있고—따라서 더 유용한—통계도 생성한다.
어트리뷰션이 정당화된다면, 이 두 요소는 모든 사용자에 대해 어트리뷰션을 활성화하도록 동기를 부여한다.
사용자 에이전트가 어트리뷰션 측정을 활성화하도록 하는 조치는 일부 사람들에게 긍정적으로 받아들여지지 않을 것이다. 사람마다 광고와 관계를 맺음으로써 발생하는 비용과 이점을 다르게 인식한다. 제안된 설계는 사이트에 그 선택을 드러내지 않으면서도 사람들이 어트리뷰션에 참여하는 것처럼 보일 수 있는 선택권을 허용한다. § 9.2 Attribution API 비활성화 참조.
1.6. 히스토그램을 사용한 어트리뷰션
어트리뷰션은 하나 이상의 광고 게재(노출)와 광고주가 원하는 결과 사이의 상관관계를 측정하려고 시도한다.
집계로 고려될 때, 개인에 대한 정보는 유용하지 않다. 동작과 결과는 그룹화되어야 한다.
가장 단순한 형태의 어트리뷰션은 광고의 속성에 따라 노출을 여러 그룹으로 나누고 전환의 수를 센다. 그룹화는 광고가 표시된 위치, 표시된 내용(“크리에이티브”), 광고가 표시된 시점, 또는 누구에게 표시되었는지 같은 속성에서 형성될 수 있다.
이러한 그룹화와 각 그룹에 귀속된 전환의 집계는 히스토그램을 형성한다. 히스토그램의 각 버킷은 광고 그룹에 대한 전환을 센다.
서로 다른 목적에는 서로 다른 그룹화가 사용될 수 있다. 예를 들어, 크리에이티브(광고의 내용)별 그룹화는 어떤 크리에이티브가 가장 잘 작동하는지 알아내는 데 사용될 수 있다.
각 전환에서 1보다 큰 값을 추가하면 단순한 카운트 이상의 것이 가능해진다. 히스토그램은 값도 집계할 수 있으며, 이는 서로 다른 결과를 구분하는 데 사용될 수 있다. 노출에 할당되는 값은 전환 값이라고 한다. 더 높은 전환 값은 더 큰 구매나 더 높게 평가되는 모든 결과에 사용될 수 있다. 전환 값은 또한 여러 노출 사이에서 크레딧을 나누기 위해 분할될 수도 있다.
2. 동작 개요
Attribution API는 두 종류의 이벤트, 즉 노출과 전환 사이의 연관성에 대한 집계 정보를 제공한다.
노출은 광고주가 어떤 웹사이트에서든 수행하는 모든 동작이다. 이 API는 무엇이 노출로 기록될 수 있는지를 제한하지 않는다. 광고주가 측정하려 할 수 있는 일반적인 동작에는 다음이 포함된다.
-
광고 표시.
-
사용자가 어떤 방식으로든 광고와 상호작용하도록 하는 것.
-
광고를 표시하지 않는 것(특히 광고 캠페인이 효과적인지 확인하려는 통제 실험의 경우).
이 API에서 전환은 측정 대상인 결과이다. 이 API는 무엇이 결과로 간주될 수 있는지를 제한하지 않는다. 광고주가 측정하려 할 수 있는 일반적인 결과에는 다음이 포함된다.
-
구매하기.
-
계정 가입하기.
-
웹페이지 방문하기.
이 절의 나머지는 Attribution API가 집계 서비스와 함께 어떻게 동작하여 집계된 어트리뷰션 측정을 생성하는지를 설명한다. 그 동작은 다음 그림에 설명되어 있다.
2.1. 노출 기록
노출이 발생하면, saveImpression() 메서드를 사용하여 브라우저가 정보를 저장하도록 요청할 수 있다. 여기에는 노출에 대한 식별자와 노출에 관한 몇 가지 추가 정보가 포함된다. 예를 들어 광고주는 추가 정보를 사용하여 해당 노출이 광고 조회였는지 광고 클릭이었는지를 기록할 수 있다.
2.2. 전환 또는 노출 질의
전환 시점에는 전환 보고서가 생성된다. 전환 보고서는 브라우저가 이전에 저장한 노출의 정보를 포함하는 암호화된 히스토그램 기여값이다.
measureConversion() 메서드는 브라우저에 전환 보고서를 구성하는 방법을 알려 주는 데 사용되는 제한된 쿼리를 받는다. 여기에는 브라우저가 저장한 노출 중에서 선택하는 값, 선택된 노출에 할당되는 전환 값, 그리고 전환 보고서를 구성하는 데 필요한 기타 정보가 포함된다.
전환 보고서가 생성하는 히스토그램은 다음과 같이 구성된다.
-
쿼리가 노출을 찾지 못했거나, 해당 사이트의 프라이버시 예산이 소진된 경우, 전부 0으로 이루어진 히스토그램이 구성된다.
-
하나 이상의 일치하는 노출이 발견되면, 브라우저는 관련 노출을 선택하기 위해 last-n-touch 어트리뷰션 로직을 실행한다. 제공된 전환 값은 귀속된 노출 시점에 지정된 버킷의 히스토그램에 추가된다. 다른 모든 버킷은 0으로 설정된다.
브라우저는 보고된 전환을 반영하도록 프라이버시 예산 저장소를 갱신한다.
결과 히스토그램은 선택된 집계 서비스의 요구사항에 따라 집계를 위해 준비되고 사이트에 반환된다. 이는 최소한 히스토그램의 암호화를 포함한다.
이 API를 호출하는 사이트는 항상 유효한 전환 보고서를 받는다. 그 결과, 사이트는 이 상호작용으로부터 다른 사이트에서 어떤 일이 일어났는지 전혀 알 수 없다.
2.3. 집계
사이트는 이 API 호출에서 수신한 암호화된 히스토그램을 수집하여 집계 서비스에 제출할 수 있다.
사이트로부터 암호화된 히스토그램 집합을 수신하면, 집계 서비스는 다음을 수행한다.
-
제공된 입력으로부터 집계를 이전에 계산한 적이 없으며 충분한 전환 보고서가 있음을 확인하고,
-
충분한 노이즈를 포함하여 히스토그램을 더해 차등 프라이버시 집계 히스토그램을 생성하고,
-
그 집계를 사이트에 반환한다.
집계 서비스의 최종 출력을 기여 결과라고 부른다.
브라우저 구현은 위 기능을 신뢰할 수 있게 수행하도록 신뢰되는 집계 서비스 집합을 가져야 한다. 제공되는 서비스 집합 중에서, 전환 사이트는 집계를 수행할 서비스 선택에 대해 합의에 도달해야 한다.
브라우저는 집계 서비스를 등록하기 위한 프로그램을 수립할 수도 있으며, 이는 브라우저가 Web PKI 인증서를 검증할 때 사용하는 인증 기관을 승인하기 위해 사용되는 루트 저장소 프로그램과 성격상 유사하다. 그러한 프로그램의 수립은 이 문서의 범위를 벗어난다.
3. API 사용
Attribution API를 사용하는 사이트는 일반적으로 노출 또는 전환 중 하나를 등록하지만, 경우에 따라 같은 사이트가 둘 다 수행할 수도 있다.
노출을 등록하려면, 사이트는 saveImpression()를 호출한다. 매개변수 값을 수집하는 것 외에는 이 API를 사용하기 위한 준비가 필요하지 않지만, Attribution API를 사용할지 결정할 때 지원되는 aggregationServices를 살펴보는 것이 유용할 수 있다.
사용자 에이전트에 리소스를 제공할 때 HTTP 응답에
`Save-Impression`
헤더를 포함하여 노출을 등록하는 것도 가능하다.
전환 보고서를 요청하려면, 사이트는
measureConversion()를 호출한다.
이 API를 호출하기 전에, 사이트는 지원되는 집계 서비스를 선택해야 한다.
페이지는 aggregationServices에서 발견되는
지원 서비스 중 아무 것이나 선택할 수 있다.
선택한 서비스의 이름은
measureConversion() 메서드를 호출할 때
AttributionConversionOptions
사전의
aggregationService
멤버로 제공해야 한다.
3.1. 사이트 식별자
이 API는 자신이 동작하는 기본 범위로 사이트에 대한 HTML 정의에 의존한다. 세 가지 유형의 사이트가 인식된다.
-
노출 사이트는 노출을 등록하는 사이트이다. 이 노출 사이트는 최상위 출처에서 파생된다. 이는 관련 설정 객체의 최상위 출처이며, 노출을 저장하기 위해
saveImpression()이 호출되는 시점의 것이다. -
전환 사이트는 전환이 발생하는 사이트이다. 전환 사이트는
measureConversion()이 호출되는 시점의 관련 설정 객체의 최상위 출처에서 파생된다. -
중개자 사이트는 iframe과 같은 어떤 교차 사이트 프레임에서 API를 호출하는 사이트이다. 중개자 사이트는 관련 설정 객체의 출처에서 파생된다. 이는
saveImpression()또는measureConversion()중 하나가 호출되는 시점의 것이며, 이 출처가 각각 노출 사이트 또는 전환 사이트와 same site인 경우는 제외한다.
이 API는 출처가 아니라 사이트를 사용한다. 이는 프라이버시 결과를 가질 수 있는 모든 활동을 단일 엔티티와 연결하는 것에 의존하기 때문이다. 쿠키와 같은 기능은 프라이버시 관련 정보가 same site 출처들 사이에서 자유롭게 교환되도록 허용하며, 그렇지 않으면 이를 사용하여 프라이버시 예산을 초과할 수 있다.
3.2. Navigator 인터페이스
이 API의 모든 기능은
속성에 연결된다.
navigator.attribution
partial interface Navigator { [SecureContext ,SameObject ]readonly attribute Attribution ; };attribution
이는 세 가지 핵심 기능을 제공한다.
-
브라우저가 지원하는 집계 서비스 목록 (§ 3.3 지원되는 집계 서비스 찾기)
-
브라우저에 노출 저장을 요청하는 수단 (§ 3.4 노출 저장)
-
전환 측정을 요청하는 메서드 (§ 3.5 전환에 대한 기여 요청)
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이라는 변수에 저장된다.
그렇지 않으면 serviceUrl은 undefined로 남는다.
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 to0- 노출과 연관된 선택적 메타데이터 조각이다. 이 값은 전환으로부터 기여를 받을 수 있는 노출을 식별하는 데 사용될 수 있다.
conversionSites, of type sequence<USVString>, defaulting to[]- 이 노출에 대한 전환이 발생할 수 있는 최상위 전환 사이트이며, 그 도메인 이름으로 식별된다. measureConversion() 메서드는 표시된 사이트 중 하나에서 호출된 경우에만 이 노출에 기여를 귀속시킨다. 비어 있으면, 모든 전환 사이트가 일치한다.
conversionCallers, of type sequence<USVString>, defaulting to[]- 이 노출을 전환에 대해 선택할 수 있는 중개자 사이트 또는 전환 사이트이며, 그 도메인 이름으로 식별된다. measureConversion() 메서드는 표시된 사이트 중 하나에서 호출된 경우에만 이 노출에 기여를 귀속시킨다. 이 옵션에는 전환 사이트와 중개자 사이트가 모두 포함된다. 비어 있으면, API를 호출하는 모든 사이트가 일치한다.
lifetimeDays, of type unsigned long, defaulting to30- 양의 "존속 시간"(일 단위)이며, 이 시간이 지나면 노출은 더 이상 기여를 받을 수 없다. 사용자 에이전트는 수명에 상한을 부과해야 하며, 여기에 지정된 값이 그 한도를 초과하면 조용히 줄여야 한다.
priority, of type long, defaulting to0- 기여 중에 노출을 정렬하는 데 사용되는 정수이다.
3.5. 전환에 대한 어트리뷰션 요청
measureConversion() 메서드는 사용자 에이전트가 전환에 대해 어트리뷰션을 수행하고, 전환 보고서를 반환하도록 요청한다.
measureConversion() 메서드는 매칭되는 노출이 발견되는지 여부와 관계없이 항상 전환 보고서를 반환한다. 매칭이 없거나 차등 프라이버시가 어트리뷰션 보고를 허용하지 않는 경우, 반환된 전환 보고서는 히스토그램에 기여하지 않는다. 즉, 균일하게 0이 된다.
암호화된 측정의 생성을 요청하기 위해,
사이트는 measureConversion()
메서드를 호출한다.
이 함수는 네 가지 서로 다른 유형의 입력을 받는다.
-
URL을 사용하여 식별되는 선택된 집계 서비스. 집계 서비스를 선택하는 예제 과정은 브라우저가 지원하는 서비스를 선택하는 방법을 보여준다.
const serviceDetails= { aggregationService: serviceUrl, }; -
집계된 측정의 세부사항. 이러한 값은 여러 브라우저에 걸친 API의 모든 호출에서 일관된다. 여기에는 히스토그램의 크기와 지출되었을 수 있는 프라이버시 예산의 양이 포함된다.
const aggregatedMeasurementDetails= { histogramSize: 20 , epsilon: 1 , }; -
고려할 노출을 선택하는 속성 집합. 모두 선택 사항이다. 여기에는 노출이 얼마나 오래될 수 있는지 (
lookbackDays), 노출을 저장했을 수 있는 노출 사이트 (impressionSites), 노출을 저장했을 수 있는 중개자 사이트 (impressionCallers), 그리고matchValues의 선택이 포함된다.const selectionDetails= { lookbackDays: 14 , impressionSites: [ "publisher.example" , "other.example" ], impressionCallers: [ "ad-tech.example" ], matchValues: [ 2 ], }; -
어트리뷰션 로직 매개변수.
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는 올바른 노출만 선택되도록 보장하기 위한
여러 도구를 제공한다.
저장된 노출의 경우:
-
Match values를 사용하여 노출을 히스토그램 정의별로 분리할 수 있다.
-
전환을 위한 노출의 사용은 전환 사이트 집합의
measureConversion()에만 보이도록 제한될 수 있다. -
전환을 위한 노출의 사용은 사이트 집합이 호출한
measureConversion()에만 보이도록 제한될 수 있다.
-
match value 집합은 노출 집합을 제한한다.
-
Impression Sites 집합은 노출이 저장된 노출 사이트를 제한한다.
-
Impression Callers 집합은 노출을 저장한 전환 사이트 또는 중개자 사이트의 집합을 제한한다.
이러한 옵션은 어트리뷰션이 히스토그램을 선택하는 방식에 대해 사이트에 유연성을 제공한다.
이는 전환 사이트가 서로 다른 히스토그램을
사용하는 것을 배제하지 않는다.
measureConversion()
호출이
서로 다른 히스토그램 정의를 가진 노출을
절대 선택하지 않는다면,
여러 노출은
서로 다른 히스토그램 정의로 저장될 수 있다.
이는 measureConversion()을
여러 번 호출함으로써 전환이
여러 히스토그램에 귀속될 수
있도록 보장한다.
3.8. Permissions Policy 통합
중개자에게 위임할 수 있는 기능은 Permission Policy에 의해 제어된다.
이 명세는 두 개의 정책 제어 기능을 정의한다.
-
saveImpression() API의 호출로, 문자열 "
"로 식별된다.save-impression -
measureConversion() API의 호출로, 문자열 "
"로 식별된다.measure-conversion
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을 전달한다.
4.1.4. 사이트 이름
노출 저장소는 세 가지 유형의 사이트에 대한 정보를 저장한다. 노출 사이트, 선택적 중개자 사이트, 그리고 전환 사이트의 집합이다.
이 사이트들은 모두
"https" 스킴을 가진 scheme-and-host
형식이어야 MUST 한다.
이는 호스트의 단순 문자열 직렬화가
사이트를 식별하기에 충분하다는 뜻이다.
따라서 API는 단순한 문자열을 사용하여
사이트를 나타낼 수 있다.
구현이 내부적으로 튜플의 host 부분만 사용하여 사이트를 표현하는 것도 가능하다.
-
host를 input을 전달하여 host parser를 호출해 반환된 값으로 둔다.
-
host가 failure이면 failure를 반환한다.
-
site를 host를 전달하여 obtain a registrable domain이 반환한 값으로 둔다.
-
site가 null이면 failure를 반환한다.
-
site가 "
localhost"이거나 site가 ".localhost"로 끝나면, failure를 반환한다. -
("
https", site)의 scheme-and-host 튜플을 반환한다.
이 알고리즘은 registrable domain보다 더 많은
domain label을 포함하는 문자열에서도
site를 성공적으로 생성한다.
예를 들어, "extra.example.com"은 "example.com"으로 파싱된다.
이 알고리즘은 localhost 도메인 [RFC6761]을 허용하지 않으므로, site 이름 추출에 의존하는 모든 알고리즘은 localhost 도메인이 언급되거나 현재 site(최상위 또는 프레임)가 localhost 도메인일 때 실패하게 된다. 이는 테스트 및 개발을 위해 로컬 서버를 사용하는 것을 어렵게 만들 수 있다. 구현은 테스트 및 개발을 돕기 위해 localhost 검사를 비활성화하는 구성을 제공할 수 있다.
4.2. 프라이버시 예산 관리를 위한 상태
사용자 에이전트는 프라이버시 예산의 지출을 관리하는 데 사용되는 여러 상태 조각을 유지한다.
-
프라이버시 예산 저장소는 각 사이트별 및 각 에포크별 프라이버시 예산의 상태를 기록한다.
-
전역 프라이버시 예산 저장소는 모든 사이트에 걸쳐 적용되는 각 에포크별 전역 프라이버시 예산의 상태를 기록한다.
-
노출 사이트 할당량 저장소는 전역 프라이버시 예산 저장소에서 소비하기 위한, 각 노출 사이트별 및 각 에포크별 할당량의 상태를 기록한다.
-
에포크 시작 시각은 에포크가 시작되는 시점을 결정하는 데 사용된다. 이 값은 measureConversion() 호출의 부수 효과로 초기화된다.
-
단일 마지막 브라우징 이력 삭제 값은 사이트에 대한 브라우징 활동이 마지막으로 삭제된 시점을 추적한다.
-
단일 어트리뷰션 예산 잠금은 불리언 플래그이며, 프라이버시 예산 저장소에 대한 동시 작업을 방지하는 데 사용된다. 그렇지 않으면 예산의 과도한 지출로 이어질 수 있다.
프라이버시 예산 저장소, 전역 프라이버시 예산 저장소, 및 노출 사이트 할당량 저장소는 프라이버시 및 안전 예산 차감에 의해 갱신된다.
노출 저장소와 마찬가지로, 프라이버시 예산 저장소와 관련 저장소는 storage key를 사용하지 않는다. 이러한 저장소에는 정보가 삭제되는 방식에 대한 몇 가지 추가 제약이 있다. 자세한 내용은 § 9.7 API 상태 삭제를 참조한다.
어트리뷰션 예산 잠금을 불리언 플래그로 정의하는 선택은 명세 작성의 편의를 위한 것이다. 구현에는 대체 구성물이 더 적합할 수 있다. 구현은 이 값을, 예를 들어 에포크별로 분할하여, 경합 범위를 줄일 수 있을지도 모른다.
4.2.1. 프라이버시 예산 저장소
프라이버시 예산 키는 다음 항목들로 구성된 튜플이다.
프라이버시 예산 저장소는 키가 프라이버시 예산 키이고 값이 32비트 부호 없는 정수인 맵이다. 이러한 정수는 마이크로엡실론 단위로 값을 저장한다. 마이크로엡실론은 차등 프라이버시에서 사용되는 단위 엡실론 값의 백만분의 일이다 [DP].
32비트 정수를 선택하면 epsilon 설정이 4294라는 최대 epsilon 이하로 제한된다. 이는 구현에 충분하고도 남아야 should 한다.
전역 프라이버시 예산 저장소는 키가 에포크 인덱스이고 값이 32비트 부호 없는 정수인 맵이며, 마이크로엡실론 단위이다.
전역 프라이버시 예산 저장소는 모든 사이트에 걸쳐 적용되고 각 에포크마다 새로고침되는 단일 프라이버시 예산의 지출을 추적한다. 이는 같은 사람에 대한 활동을 여러 사이트에 걸쳐 상관시킬 수 있는 적대자에 대한 안전 한계를 제공한다.
각 사이트별 프라이버시 예산 저장소와 달리, 전역 프라이버시 예산 저장소는 사이트가 아니라 에포크 인덱스로만 키 지정된다.
노출 사이트 할당량 저장소는 키가 프라이버시 예산 키이고 값이 32비트 부호 없는 정수인 맵이며, 마이크로엡실론 단위이다.
노출 사이트 할당량 저장소는 하나의 에포크에서 어떤 단일 노출 사이트가 기여할 수 있는 “stock” (노출과 관련된 프라이버시 예산)의 양을 제한한다. 이는 단일 노출 사이트가 악의적으로 유발될 수 있는 전역 한계에서 과도한 양을 소비하는 것을 방지한다.
-
l1NormSensitivity를 isSingleEpoch이면 l1Norm, 그렇지 않으면 2 * value로 둔다.
-
valueSensitivity를 2 * value로 둔다.
-
noiseScale을 2 * maxValue / epsilon으로 둔다.
-
l1NormDeductionFp를 l1NormSensitivity / noiseScale로 둔다.
-
valueDeductionFp를 valueSensitivity / noiseScale로 둔다.
단일 에포크 어트리뷰션은 에포크 전반에 걸친 연쇄 효과를 일으키지 않는다. 여러 에포크를 수반하는 어트리뷰션은 하나의 변경이 에포크 전반의 어트리뷰션에 영향을 미칠 가능성이 있으므로 두 배의 예산을 소비한다. 이 차감량을 두 배로 하는 것은 maxValue / epsilon에 비례하는 Laplace 노이즈가 집계된 히스토그램에 추가된다고 가정한다.
-
l1NormDeduction을 l1NormDeductionFp * 1000000을 양의 무한대 방향으로 올림한 값으로 둔다.
-
valueDeduction을 valueDeductionFp * 1000000을 양의 무한대 방향으로 올림한 값으로 둔다.
-
어트리뷰션 예산 잠금이 true이면, 그 값이 false가 될 때까지 기다린 다음, 그 값을 true로 설정한다.
-
deduction을 isSingleEpoch가 true이면 l1NormDeduction, 그렇지 않으면 valueDeduction으로 둔다.
-
key, deduction, valueDeduction 및 impressions로 사용 가능한 프라이버시 예산 확인을 호출한 결과가 false이면, 다음 단계를 수행한다:
-
어트리뷰션 예산 잠금을 false로 설정한다.
-
false를 반환한다.
-
-
모든 예산 확인을 통과했으므로, 다음 차감을 수행한다:
-
currentValue를 값을 가져오기로 key의 값을 프라이버시 예산 저장소에서 가져온 결과로 두되, 기본값은 사이트별 프라이버시 예산으로 한다.
-
설정을 수행하여 프라이버시 예산 저장소의 key 값을 currentValue − deduction으로 설정한다.
-
epoch를 key의 에포크 인덱스 구성요소로 둔다.
-
deductedGlobalBudgets가 epoch를 포함하지 않으면, deductedGlobalBudgets에 epoch를 추가하고, 전역 프라이버시 예산 저장소[epoch]를 valueDeduction만큼 감소시킨다.
-
impressions의 각 impression에 대해 반복한다:
-
impressionSite를 impression의 노출 사이트로 둔다.
-
impressionQuotaKey를 그 항목이 epoch와 impressionSite인 프라이버시 예산 키로 둔다.
아래는 해당 사이트에 대해 여러 노출이 있을 때 동일한 노출 사이트 할당량에서 예산을 두 번 이상 차감하지 않도록 보장한다.
-
deductedImpressionQuotas가 impressionQuotaKey를 포함하지 않으면:
-
추가를 수행하여 deductedImpressionQuotas에 impressionQuotaKey를 추가한다.
-
currentImpressionQuotaValue를 값을 가져오기로 impressionQuotaKey의 값을 에포크별 노출 사이트 할당량에서 가져온 결과로 두되, 기본값은 에포크별 노출 사이트 할당량으로 한다.
-
설정을 수행하여 에포크별 노출 사이트 할당량[impressionQuotaKey\]의 값을 currentImpressionQuotaValue − valueDeduction으로 설정한다.
-
-
-
-
어트리뷰션 예산 잠금을 false로 설정한다.
-
true를 반환한다.
-
currentValue를 값을 가져오기로 key의 값을 프라이버시 예산 저장소에서 가져온 값으로 설정하되, 기본값은 사이트별 프라이버시 예산으로 한다.
-
deduction이 currentValue보다 크면, false를 반환한다.
-
epoch를 key의 에포크 인덱스 구성요소로 둔다.
-
currentGlobalValue를 epoch의 값을 값을 가져오기로 전역 프라이버시 예산 저장소에서 가져온 값으로 설정하되, 기본값은 에포크별 전역 프라이버시 예산으로 한다.
-
valueDeduction이 currentGlobalValue보다 크면, false를 반환한다.
-
impressions의 각 impression에 대해 반복한다:
-
impressionSite를 impression의 노출 사이트로 둔다.
-
impressionQuotaKey를 그 항목이 epoch와 impressionSite인 프라이버시 예산 키로 둔다.
-
currentImpressionQuotaValue를 값을 가져오기로 impressionQuotaKey의 값을 노출 사이트 할당량 저장소에서 가져온 값으로 설정하되, 기본값은 에포크별 노출 사이트 할당량으로 한다.
-
valueDeduction이 currentImpressionQuotaValue보다 크면, false를 반환한다.
-
-
true를 반환한다.
4.2.2. Attribution API 활성화
Attribution API는 대략 일시적 활성화 소비 API를 본뜬 것으로, 여기서 사용자 활성화는 일시적으로 API를 사용할 수 있게 한다. 이 설계는 일시적 활성화 소비 API와 구별되는 여러 차이점이 있다:
-
다음 중 하나가 발생하면 API가 짧은 기간 동안 사용 가능해진다:
-
사용자 활성화 이벤트가 수신되는 경우 (즉, 클릭, 키 누름 또는 유사한 동작).
-
-
마지막 활성화 이후 구현 정의 기간 내에 saveImpression() 또는 measureConversion()를 호출하면, 해당 사이트에서 API가 활성화된다.
-
각 활성화는 API를 최대 하나의 최상위 사이트에서 사용할 수 있게 한다. 일시적 활성화와 유사하게, 활성화를 소비하는 것이 다른 유사한 API를 또 다른 활성화가 발생할 때까지 사용할 수 없게 만드는 것처럼, 한 사이트에서 API를 사용하면 다른 사이트에서는 그 API를 사용할 수 없게 된다.
-
API가 성공적으로 사용되면, API는 최상위 순회 가능 항목의 활성 문서의 모든 자손 navigable에서 사용할 수 있도록 활성화된다 (즉, 교차 사이트 프레임을 포함하여 현재 페이지의 모든 프레임이) 추가 가용성 검사 없이 API에 접근할 수 있다.
-
각 활성화는 API를 최대 하나의 사이트에서만 사용 가능하게 한다. 탐색으로 최상위 traversable이 다른 사이트로 이동하면 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에 대해 두 가지 상태를 추적한다:
-
attribution enabled flag는 API가 활성화되어 있는지를 추적하는 boolean 값이다. 이 값은 false로 초기화된다.
-
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로 설정하여
아래 단계를 수행한다.
단계는 다음과 같다:
-
navigable이 null이 아니라면, n을 navigable로 둔다.
-
그렇지 않으면 n을 document의 node navigable을 가져온 결과로 둔다.
-
top을 n의 최상위 traversable을 가져온 결과로 둔다.
-
top의 attribution activation timestamp를 current high resolution time으로 설정한다.
-
documentState의 initiator origin이 responseOrigin과 same site라면 반환한다.
-
top의 attribution enabled flag를 false로 설정한다.
Document
document가 주어졌을 때,
실패 시 "NotAllowedError"
DOMException을
throw하면서
check
attribution API activation하려면:
-
n을 document의 노드 navigable을 가져온 결과로 둔다.
-
top을 n의 최상위 traversable을 가져온 결과로 둔다.
-
top의 어트리뷰션 활성화 플래그가 true이면 반환한다.
-
lastActivation을 top의 어트리뷰션 활성화 타임스탬프로 둔다.
-
lastActivation에 어트리뷰션 활성화 기간을 더한 값이 현재 고해상도 시간보다 작으면,
"NotAllowedError"DOMException을 throw한다. -
어트리뷰션 활성화 타임스탬프를 유닉스 epoch로 설정한다.
-
top의 어트리뷰션 활성화 플래그를 true로 설정한다.
4.2.3. 에포크 시작 시각
privacy budget epoch는 (또는 epoch는) 일정 기간을 식별한다. epoch의 길이는 1주 또는 7 일로 고정되며, 여기서 일은 86400 초로 정의된다.
epoch start time은 wall clock의 moment이다. epoch는 각 사용자 에이전트에 대해 무작위로 선택된 한 주의 시간에 시작된다. 이는 privacy budget이 0에 도달함으로써 발생하는 집계의 편향이 모든 사용자의 모든 기여에 걸쳐 평균화되도록 보장한다.
시작 시간은 epoch가 처음 필요해질 때 사용자 에이전트에 의해 무작위로 선택된다—이는 현재 epoch를 얻는 알고리즘을 호출하는 부수 효과이다.
epoch index는 주어진 epoch를 참조하는 정수이다. epoch index는 impression과 epoch start time에 접근하는 데 사용된다.
Epoch index는 정해진 기준점을 기준으로 하는 정수로 저장된다. 이 명세의 epoch index는 epoch start time을 기준점으로 사용한다. 사용자 에이전트는 "0" 또는 기준 epoch를 나타내기 위해 다른 moment를 사용하도록 선택할 수도 있다.
이 명세의 알고리즘은 모두 더 추상적인 epoch가 아니라 구체적인 epoch index를 사용한다. 시간상의 지점은 현재 epoch를 얻는 알고리즘을 사용하여 해당 epoch의 epoch index로 변환된다.
-
epoch start time이 설정되어 있지 않으면, 이를 다음과 같이 지난 epoch 안에서 무작위로 선택된 시간으로 설정한다:
-
rand를 t에서 0(포함)과 period(제외) 사이에서 무작위로 선택된 duration을 뺀 값이라고 하자.
-
ms를 Unix epoch부터 rand까지의 duration from 안의 밀리초 수라고 하자.
-
hour를 ms를 3600000 (밀리초 단위의 한 시간)으로 나눈 뒤 0 쪽으로 반올림하고 다시 3600000을 곱한 값이라고 하자.
-
epoch start time을 Unix epoch에 duration으로서 hour를 더한 값으로 설정한다.
-
-
start를 epoch start time이라고 하자.
-
elapsed를 (t − start) / period라고 하자.
-
elapsed를 음의 무한대 쪽으로 반올림한 정수로 반환한다.
4.2.4. 마지막 브라우징 이력 삭제 시각
last browsing history clear는 wall clock을 사용하는 moment이며, browsing history가 마지막으로 삭제된 때를 추적한다. last browsing history clear 값은 현재 coarse된 wall time으로 갱신된다. 이는 사용자의 요청으로 어떤 site 수준 상태가 삭제될 때 이루어진다. 이 값은 처음에는 설정되어 있지 않다.
선택적 최적화로서, 다음 모두가 true이면 last browsing history clear를 갱신하는 것을 건너뛸 수 있다:
-
삭제되는 모든 상호작용이 삭제되지 않은 다른 상호작용을 가진 site들과의 상호작용이다.
-
epoch start time이 설정되어 있다.
세 조건이 모두 true이면, last browsing history clear는 갱신될 필요가 없다. 대신, 영향을 받은 모든 site와 epoch로부터 형성될 수 있는 모든 privacy budget key 조합에 대해 값 0을 설정하여 privacy budget store를 갱신해야 한다 (해당 epoch index 사용).
이 최적화는 사용자 에이전트가 영향을 받은 site들과의 상호작용에 관한 정보를 영향을 받은 epoch에서 유지하고 있는 것에 의존한다. 이는 유지된 상호작용 중 어느 것이든 budget을 소진시키는 결과를 낳았을 수 있기 때문에만 작동한다. budget을 재설정하는 것은 browsing history의 공백에 관한 정보가 노출되지 않도록 보장하기 위해 필요하다.
-
earliestEpochIndex를 now − maximum lookback 일과 함께 현재 epoch를 얻은 결과라고 하자.
이는 가능한 모든 impression을 질의할 수 있도록 보장한다.
-
startEpoch를 earliestEpochIndex라고 하자.
-
last browsing history clear가 설정되어 있으면, 다음 단계를 수행한다:
-
clearEpoch를 last browsing history clear의 값과 함께 현재 epoch를 얻은 결과라고 하자.
이 현재 epoch를 얻는 사용은 음수 값을 반환할 수 있다. 이는 epoch start time이 history가 마지막으로 삭제된 뒤의 시간으로 설정될 가능성이 높기 때문이다.
-
clearEpoch를 clearEpoch + 1로 설정한다.
1을 더하는 것은 attribution을 위한 epoch 범위가 browsing history가 삭제되기 전의 epoch와 겹치지 않도록 하기 위해 필요하다.
-
clearEpoch가 startEpoch보다 크면, clearEpoch를 반환한다.
-
-
startEpoch를 반환한다.
-
forgetVisits가 false이면:
-
sites 안의 각 site에 대해 반복한다:
-
startingEpoch를 now가 주어졌을 때 attribution을 위한 시작 epoch를 얻는 것을 호출한 결과라고 하자.
-
currentEpoch를 now가 주어졌을 때 현재 epoch를 얻는 것을 호출한 결과라고 하자.
-
startingEpoch부터 currentEpoch까지의 포함 범위 안의 각 epoch에 대해 반복한다:
-
key를 site와 epoch로부터 형성된 privacy budget key라고 하자.
-
privacy budget store[key]를 0으로 설정한다.
-
-
-
반환한다.
-
sites가 비어 있으면:
-
sites가 비어 있지 않으면:
-
impression store 안의 각 impression에 대해 반복하여, sites가 impression의 impression site를 포함하면, impression을 impression store에서 제거한다.
-
privacy budget store의 key 안의 각 key에 대해 반복하여, sites가 key의 site 구성요소를 포함하면, privacy budget store[key]를 제거한다.
-
impression site quota store의 key 안의 각 key에 대해 반복하여, sites가 key의 site 구성요소를 포함하면, impression site quota store[key]를 제거한다.
이 과정은 global privacy budget store를 건드리지 않는다. 주로 이는 일단 소진된 privacy budget이 잊혀지지 않도록 보장하기 위한 것이다.
-
-
last browsing history clear를 now로 설정한다.
last browsing history clear를 설정하면서 일부 site에 대해서만 상태를 삭제하면 (즉, sites가 비어 있지 않은 경우), 그 set에 존재하지 않는 site에 대해 일부 impression이 도달 불가능해진다. 구현은 그 결과 사용할 수 없게 된 사용 불가능한 impression 및 (예: global privacy budget store 안의 것 같은) budget record도 제거할 수 있다.
4.3. 노출 저장 알고리즘
saveImpression(options) 메서드 단계는
다음과 같다.
-
implicitInputs를 this에서 암시적 API 입력 얻기의 결과로 한다.
-
Assert: implicitInputs는 null이 아니다.
-
options와 implicitInputs로 노출 저장을 실행한 결과를 반환한다.
AttributionImpressionOptions
options와
implicit API
inputs implicitInputs가 주어졌을 때
impression을
저장하려면:
-
document를 implicitInputs의 associated document라고 하자.
-
realm을 document의 관련 realm이라고 하자.
-
document가 "
save-impression"라는 이름의 정책 제어 기능을 사용하도록 허용되어 있지 않으면, realm에서"NotAllowedError"DOMException으로 rejected된 promise를 반환한다. -
document가 주어졌을 때 attribution API 활성화를 검사하고, throw된 이유가 있으면 그것으로 rejected된 promise를 반환한다.
-
페이지가 제공한 API 입력을 검증한다:
-
options.
histogramIndex가 구현 정의 maximum histogram size보다 크거나 같으면, realm에서RangeError로 rejected된 promise를 반환한다. -
options.
lifetimeDays가 0이면, realm에서RangeError로 rejected된 promise를 반환한다. -
options.
lifetimeDays를 maximum lookback으로 clamp한다. -
options.
conversionSites의 size가 구현 정의 impression당 maximum number of conversion sites보다 크면, realm에서RangeError로 rejected된 promise를 반환한다. -
conversionSites를 options.
conversionSites안의 각 값에 대해 site를 파싱한 결과인 set이라고 하자. -
conversionSites 안의 어떤 결과라도 failure이면, realm에서
"SyntaxError"DOMException으로 rejected된 promise를 반환한다. -
options.
conversionCallers의 size가 구현 정의 impression당 maximum number of conversion callers보다 크면, realm에서RangeError로 rejected된 promise를 반환한다. -
conversionCallers를 options.
conversionCallers안의 각 값에 대해 site를 파싱한 결과인 set이라고 하자. -
conversionCallers 안의 어떤 결과라도 failure이면, realm에서
"SyntaxError"DOMException으로 rejected된 promise를 반환한다.
-
-
다음 단계를 병렬로 실행한다:
-
impression을 다음으로 구성된 저장된 impression으로 구성한다:
- Match Value
-
options.
matchValue - Impression Site
-
implicitInputs의 top-level site
- Intermediary Site
-
implicitInputs의 intermediary site
- Conversion Sites
-
conversionSites
- Conversion Callers
-
conversionCallers
- Timestamp
-
implicitInputs의 timestamp
- Lifetime
-
options.
lifetimeDays일 - Histogram Index
-
options.
histogramIndex - Priority
-
options.
priority
-
Attribution API가 활성화되어 있으면, impression을 impression store에 저장한다.
-
-
result를 새
AttributionImpressionResult라고 하자. -
realm에서 result로 resolved된 promise를 반환한다.
saveImpression()은 impression이 기록되었는지를 나타내는 상태를 반환하지 않는다. 이는 Attribution API가 비활성화되어 있는 때를 탐지하는 능력을 최소화한다.
구현은 API 상태를 드러낼 수 있는 side channel을 완화하려고 반드시 시도해야 한다. 예를 들어, 반환된 promise의 resolution은 impression을 impression store에 저장하는 것에 의존하지 않는다. 이는 resolve되는 데 걸리는 시간이 기존 impression의 수나 API가 활성화되어 있는지 여부에 의존하지 않도록 보장하기 위한 것이다.
implicit API inputs는 다음 필드를 가진 struct이다:
| Top-Level Site: | site. |
|---|---|
| Intermediary Site: | site 또는 undefined.
|
| Timestamp: | moment. |
| Associated Document: | Document.
|
-
window를 realm의 전역 객체라고 하자.
-
window가
Window가 아니면, null을 반환한다. -
settings를 realm의 settings object라고 하자.
-
timestamp를 settings의 current wall time이라고 하자.
-
topLevelOrigin을 settings의 top-level origin이라고 하자.
-
origin이 null이면, origin을 settings의 origin으로 설정한다.
-
topLevelSite를 topLevelOrigin에서 site를 얻은 결과라고 하자.
-
intermediarySite를 다음으로 하자:
-
다음 필드를 가진 implicit API inputs를 반환한다:
- top-level site
-
topLevelSite
- intermediary site
-
intermediarySite
- timestamp
-
timestamp
- associated document:
-
window의 associated document
4.4. 전환 측정 알고리즘
measureConversion() 메서드는 비동기적으로 완료되며, Attribution task source에 작업을 queue한다.
measureConversion(options) 메서드
단계는 다음과 같다:
-
implicitInputs를 this에서 implicit API inputs를 얻은 결과라고 하자.
-
Assert: implicitInputs는 null이 아니다.
-
options 및 implicitInputs와 함께 conversion을 측정한 결과를 반환한다.
AttributionConversionOptions
options와
implicit API
inputs implicitInputs가 주어졌을 때
conversion을
측정하려면:
-
document를 implicitInputs의 associated document라고 하자.
-
realm을 document의 관련 realm이라고 하자.
-
document가 "
measure-conversion"라는 이름의 정책 제어 기능을 사용하도록 허용되어 있지 않으면, realm에서"NotAllowedError"DOMException으로 rejected된 promise를 반환한다. -
어트리뷰션 API 활성화 확인 에 document가 주어지면, 던져진 모든 이유와 함께 거부된 promise를 반환한다.
-
validatedOptions를 options를 검증한 결과라고 하며, throw된 이유가 있으면 그것으로 rejected된 promise를 반환한다.
-
promise를 realm 안의 새 promise라고 하자.
-
다음 단계를 병렬로 실행한다:
-
report를 validatedOptions의 histogram size와 함께 all-zero histogram을 생성한 결과라고 하자.
-
Attribution API가 활성화되어 있으면, report를 validatedOptions, implicitInputs의 top-level site, implicitInputs의 intermediary site, 그리고 implicitInputs의 timestamp와 함께 attribution을 수행하고 histogram을 채운 결과로 설정한다.
-
aggregationService를 validatedOptions의 aggregation service라고 하자.
-
aggregationService.
protocol의 값에 대해 switch한다:dap-18-histogram-
다음 단계를 수행한다:
-
encryptedReport를 validatedOptions, implicitInputs의 최상위 site, implicitInputs의 중개 site, implicitInputs의 timestamp 및 report가 주어졌을 때, DAP report 구성을 호출한 결과로 둔다.
-
-
result를 다음 항목을 가진
AttributionConversionResult라고 하자:report-
encryptedReport
-
promise를 result로 resolve하도록, Attribution task source에 task를 queue한다.
-
-
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. |
AttributionConversionOptions를
검증하려면:
-
aggregationServices가 options.
aggregationService의 key를 가진 entry를 포함하지 않으면,ReferenceError를 throw한다. -
aggregationService를 options.
aggregationService가 주어졌을 때,AttributionAggregationServices에서 값을 얻은 결과라고 하자. -
options.
epsilon이 0 이하이거나 maximum epsilon보다 크면,RangeError를 throw한다. -
options.
histogramSize가 0이거나 구현 정의 maximum histogram size보다 크거나, options.aggregationService에 대한 maximum aggregation-service histogram size가 있다면 그보다 크면,RangeError를 throw한다. -
options.
value가 0이면,RangeError를 throw한다. -
options.
value가 options.maxValue보다 크면,RangeError를 throw한다. -
credit이 비어 있으면,
RangeError를 throw한다. -
credit의 항목 중 하나라도 유한하지 않거나 0 이하인 경우,
RangeError를 throw한다. -
credit의 size가 구현 정의 maximum number of credit values를 초과하면,
RangeError를 throw한다. -
lookback을 options.
lookbackDays가 존재하면 그 일 수로, 그렇지 않으면 maximum lookback 일로 하자. -
lookback이 maximum lookback 일보다 크면 그 maximum으로 설정한다.
-
lookback이 0 일이면,
RangeError를 throw한다. -
options.
matchValues의 size가 구현 정의 maximum number of match values보다 크면,RangeError를 throw한다. -
matchValues를 options.
matchValues와 함께 set를 생성한 결과라고 하자. -
options.
impressionSites의 size가 구현 정의 conversion에 대한 maximum number of impression sites보다 크면,RangeError를 throw한다. -
impressionSites를 options.
impressionSites안의 각 값에 대해 site를 파싱한 결과인 set이라고 하자. -
impressionSites 안의 어떤 결과라도 failure이면,
"SyntaxError"DOMException을 throw한다. -
options.
impressionCallers의 size가 구현 정의 conversion에 대한 maximum number of impression callers보다 크면,RangeError를 throw한다. -
impressionCallers를 options.
impressionCallers안의 각 값에 대해 site를 파싱한 결과인 set이라고 하자. -
impressionCallers 안의 어떤 결과라도 failure이면,
"SyntaxError"DOMException을 throw한다. -
다음 필드를 가진 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. 어트리뷰션 로직
어트리뷰션 로직은 전환 값이 히스토그램 버킷에 어떻게 할당되는지를 결정한다.
undefined intermediarySite, 그리고
moment now:
-
currentEpoch를 now로 현재 에포크 얻기를 수행한 결과로 한다.
-
startEpoch를 now로 어트리뷰션 시작 에포크 얻기를 수행한 결과로 한다.
-
earliestEpoch를 (now − options의 룩백)을 전달하여 현재 에포크 얻기를 호출한 결과로 한다.
-
currentEpoch가 earliestEpoch와 같으면 isSingleEpoch를 true로, 그렇지 않으면 false로 한다.
-
l1Norm을 0으로 한다.
-
isSingleEpoch가 true이면:
-
impressions를 options, topLevelSite, intermediarySite, currentEpoch, 및 now로 공통 매칭 로직을 호출한 결과로 한다.
-
impressions가 비어 있으면, options의 히스토그램 크기로 전부 0인 히스토그램 생성을 호출한 결과를 반환한다.
-
histogram을 impressions, options의 히스토그램 크기, options의 값, 및 options의 크레딧으로 last-n-touch 어트리뷰션으로 히스토그램 채우기를 수행한 결과로 한다.
-
l1Norm을 histogram 안의 항목의 합으로 설정한다.
-
-
deductedImpressionQuotas를 새 집합으로 한다.
-
deductedGlobalBudgets를 새 집합으로 한다.
-
startEpoch에서 currentEpoch까지의 각 epoch에 대해, 양 끝 포함:
-
impressions를 options, topLevelSite, intermediarySite, epoch, 및 now로 공통 매칭 로직을 호출한 결과로 한다.
단일 에포크의 경우, 이는 matchedImpressions를 다시 계산하는 것이다. 구현은 이 작업을 두 번 수행하지 않으려 할 것이다.
-
impressions가 비어 있지 않으면:
-
key를 항목이 epoch와 topLevelSite인 프라이버시 예산 키로 한다.
-
budgetAndSafetyOk를 key, impressions, options의 엡실론, options의 값, options의 최대 값, isSingleEpoch, l1Norm, deductedImpressionQuotas, 및 deductedGlobalBudgets로 프라이버시 및 안전 예산 차감을 호출한 결과로 한다.
-
budgetAndSafetyOk가 true이면, matchedImpressions를 impressions로 확장한다.
-
-
-
matchedImpressions가 비어 있으면, options의 히스토그램 크기로 전부 0인 히스토그램 생성을 호출한 결과를 반환한다.
-
histogram을 matchedImpressions, options의 히스토그램 크기, options의 값, 및 options의 크레딧으로 last-n-touch 어트리뷰션으로 히스토그램 채우기를 수행한 결과로 한다.
-
histogram을 반환한다.
4.4.2. 공통 노출 매칭 로직
undefined intermediarySite,
epoch index epoch, 그리고
moment now:
-
각각에 대해, 노출 저장소 안의 impression에 대해:
-
impressionEpoch를 impression의 타임스탬프를 전달하여 현재 에포크 얻기를 호출한 결과로 한다.
-
impressionEpoch가 epoch와 같지 않으면, 계속한다.
-
conversionCaller를 intermediarySite가
undefined가 아니면 그것으로, 그렇지 않으면 topLevelSite로 한다. -
impression의 전환 호출자가 비어 있지 않고 conversionCaller를 포함하지 않으면, 계속한다.
-
options의 노출 사이트가 비어 있지 않고 impression의 노출 사이트를 포함하지 않으면, 계속한다.
-
impressionCaller를 impression의 중개자 사이트가
undefined가 아니면 그것으로, 그렇지 않으면 impression의 노출 사이트로 한다. -
impression을 matching에 추가한다.
-
-
matching을 반환한다.
4.4.2.1. Last-N-Touch 어트리뷰션
-
sumCredit을 credit의 항목의 합으로 한다.
-
roundedCredit를 새 목록으로 한다.
-
credit의 각 item에 대해 반복한다.
-
normalizedCredit를 value * item / sumCredit로 한다.
-
normalizedCredit를 roundedCredit에 추가한다.
-
-
idx1을 0으로 한다.
-
첫 번째 항목을 제거한 roundedCredit의 인덱스 얻기의 각 n에 대해 반복한다.
-
idx2를 n으로 한다.
-
frac1을 roundedCredit[idx1] − floor(roundedCredit[idx1])로 한다.
-
frac2를 roundedCredit[idx2] − floor(roundedCredit[idx2])로 한다.
-
frac1과 frac2가 모두 0과 같으면, 계속한다.
-
frac1 + frac2가 1보다 크면, incr1을 1 − frac1로 하고 incr2를 1 − frac2로 한다.
-
그렇지 않으면, incr1을 −frac1로 하고 incr2를 −frac2로 한다.
incr1은 roundedCredit[idx1]이 정수가 되도록 증가시킬 양을 나타내며, incr2와 idx2에 대해서도 마찬가지다. 이 값들은 음수일 수 있음에 유의한다.
-
p1을 incr2 / (incr1 + incr2)로 한다.
p1 값은 idx1의 항목이 정수로 반올림될 확률을 나타낸다. 0으로 나누기는 incr1 + incr2가 0일 때 발생하며, 이는 frac1과 frac2가 모두 정수(둘 다 정확히 0 또는 1)인 경우에만 가능하다. 이 경우 idx2는 반올림될 필요가 없으므로 그냥 건너뛴다.
-
r을 0 이상 1 이하의 무작위 double로 한다.
-
r이 p1보다 작으면, incr를 incr1로 하고 idx1과 idx2의 값을 교환한다.
-
그렇지 않으면, incr를 incr2로 한다.
-
roundedCredit[idx2]를 incr만큼 증가시킨다.
-
roundedCredit[idx1]를 incr만큼 감소시킨다.
-
-
integerCredit를 roundedCredit의 항목 각각을 가장 가까운 정수로 반올림하고, 정확히 절반인 경우는 0에서 멀어지는 방향으로 반올림하여 정수로 변환한 결과로 한다.
-
integerCredit를 반환한다.
이 최종 반올림 단계는 극히 작은 부동소수점 더하기 및 빼기 오류가 roundedCredit[idx1]의 소수 부분을 완전히 제거하지 못하는 경우에만 여기에 있다. 절반에서의 반올림 모드는 실제로 발생하지 않으며, 구현을 쉽게 하기 위해 C++
std::round동작과 일치하도록 선택되었다.이 알고리즘은 1) 할당 전체에 정확히 value의 총 값을 할당하고, 2) integerCredit의 기대값이 정규화된 크레딧 (즉, 요소별 곱셈을 *로 나타낼 때 credit * value / sumCredit)과 정확히 같다는 속성을 유지하며, 3) 어떤 할당에서도 1보다 큰 오류가 발생하지 않도록 하는 것을 목표로 한다.
-
sortedImpressions를 matchedImpressions로 하고, 우선순위와 그다음 타임스탬프에 따라 내림차순으로 정렬한다.
-
lastNImpressions를 sortedImpressions의 처음 N개 엔트리로 한다.
-
credit의 처음 N개 엔트리를 제외한 나머지를 모두 제거한다.
-
normalizedCredit를 credit과 value로 크레딧을 공정하게 할당한 결과로 한다.
-
histogram을 histogramSize로 전부 0인 히스토그램 생성을 호출한 결과로 한다.
-
histogram을 반환한다.
4.5. 구현 정의 값 설정
이 명세는 여러 구현 정의 값을 식별한다. 이 절은 구현이 이러한 값을 가장 적절하게 설정하는 방법에 관한 몇 가지 권고를 포함한다.
구현은 lifetimeDays
및
lookbackDays에
대해
구현 정의 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
sites는
conversionSites의
값 개수에 대한 한계이다.
구현은 이 값을 최소 5로 설정해야 한다.
impression당 maximum number of conversion
callers
및 conversion에 대한 maximum number of impression
callers는
각각 conversionCallers
및 impressionCallers의
값 개수에 대한 한계이다.
구현은 이 값들을 각각 최소 10으로 설정해야 한다.
conversion에 대한 maximum number of impression
sites는
impressionSites의
값 개수에 대한 한계이다.
구현은 이 값을 최소 30으로 설정해야 한다.
구현 정의 값은
maximum
number of credit values에 대해 선택되며,
이는 credit의
값 개수에 대한 한계이다.
구현은 이 값을 최소 10으로 설정해야 한다.
구현 정의 값은
maximum
number of match values에 대해 선택되며,
이는 matchValues의
값 개수에 대한 한계이다.
구현은 이 값을 최소 30으로 설정해야 한다.
measureConversion()이 생성하는 histogram의 size에는 구현 정의 maximum histogram size 및 maximum aggregation-service histogram size 둘 다 적용된다. maximum histogram size에 대한 minimum 값은 설정되지 않는다. 집계 기술의 선택이 한계를 설정할 것으로 예상되기 때문이다. maximum aggregation-service histogram size는 aggregation service가 사용하는 기술 선택에 따라 결정되는 고정된 값이 된다. 이는 구현 정의가 아니다.
4.5.1. 프라이버시 및 안전 한계 매개변수 구성
사용자 에이전트는 다음에 대한 값을 정의하여 privacy budget 및 safety limit을 구성한다:
-
site별 privacy budget(εsite)은 구현 정의이다. 차등 프라이버시 aggregate를 이용한 실험은 1(더 private함)과 10(더 높은 성능) 사이의 범위에 있는 값으로 합리적인 성능을 달성할 수 있음을 보여 주었다.
-
epoch당 global privacy budget(εglobal)은 site 전체에서 epoch당 사용할 수 있는 maximum privacy budget이며, microepsilon으로 지정된다. 구현은 이 값을 epoch당 per-site privacy budget의 배수로 설정해야 한다.
-
epoch당 impression site quota (εimp-quota)는 단일 impression site가 epoch당 global privacy budget에서 소비되도록 할 수 있는 maximum privacy budget이며, microepsilon으로 지정된다. 구현은 이 값을 epoch당 per-site privacy budget의 배수로 설정해야 한다.
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이다.
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의 값으로, 양의 정수이다. 이 키는 선택 사항이다.
Save-Impression
헤더를 파싱하려면 다음 단계를 실행한다.
-
dict를 input_bytes를 input으로, field_type을 "
dictionary"로 설정하여 structured fields 파싱을 수행한 결과로 한다. -
파싱에 실패하면, 오류를 반환한다.
-
histogramIndex를 dict["
histogram-index"] 에서 가져오되, 기본값은undefined로 한다. -
histogramIndex가 32비트 부호 없는 정수 범위의 정수가 아니면, 오류를 반환한다.
-
opts를 다음 항목을 가진 새
AttributionImpressionOptions로 한다.histogramIndex-
histogramIndex
-
dict["
conversion-sites"] 가 존재하면:-
conversionSites를 그 값으로 한다.
-
conversionSites가 inner list가 아니거나, conversionSites의 항목 중 하나라도 문자열이 아니면, 오류를 반환한다.
-
opts.
conversionSites를 conversionSites로 설정한다.
-
-
dict["
conversion-callers"] 가 존재하면:-
conversionCallers를 그 값으로 한다.
-
conversionCallers가 inner list가 아니거나, conversionCallers의 항목 중 하나라도 문자열이 아니면, 오류를 반환한다.
-
opts.
conversionCallers를 conversionCallers로 설정한다.
-
-
dict["
match-value"] 가 존재하면:-
matchValue를 그 값으로 한다.
-
matchValue가 32비트 부호 없는 정수 범위의 정수가 아니면, 오류를 반환한다.
-
opts.
matchValue를 matchValue로 설정한다.
-
-
dict["
lifetime-days"] 가 존재하면:-
lifetimeDays를 그 값으로 한다.
-
lifetimeDays가 양의 정수가 아니면, 오류를 반환한다.
-
opts.
lifetimeDays를 lifetimeDays로 설정한다.
-
-
-
priority를 그 값으로 한다.
-
priority가 32비트 부호 있는 정수 범위의 정수가 아니면, 오류를 반환한다.
-
opts.
priority를 priority로 설정한다.
-
-
opts를 반환한다.
5.2. 전환 측정
`Measure-Conversion`은
사용자 에이전트가
measureConversion() API를 호출하도록 요청하는 response에
설정되는
Dictionary Structured Header이다.
measureConversion 예제의 HTTP 대응물이며,
결과 report가 POST될 report-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"이어야 한다. 이 키는 필수이다.
Measure-Conversion
헤더를 파싱하려면 다음 단계를 실행한다.
-
dict를 input_bytes를 input으로, field_type을 "
dictionary"로 설정하여 structured fields 파싱을 수행한 결과로 한다. -
파싱에 실패하면, 오류를 반환한다.
-
aggregationService를 dict["
aggregation-service"] 에서 가져오되, 기본값은undefined로 한다. -
aggregationService가 문자열이 아니면, 오류를 반환한다.
-
histogramSize를 dict["
histogram-size"] 에서 가져오되, 기본값은undefined로 한다. -
histogramSize가 32비트 부호 없는 정수 범위의 양의 정수가 아니면, 오류를 반환한다.
-
reportUrlString을 dict["
report-url"] 에서 가져오되, 기본값은undefined로 한다. -
reportUrlString이 문자열이 아니면, 오류를 반환한다.
-
reportUrl를 baseUrl과 함께 reportUrlString에 URL parser를 적용한 결과로 한다.
-
reportUrl가 failure이면, 오류를 반환한다.
-
reportUrl가 잠재적으로 신뢰할 수 있는 URL이 아니면, 오류를 반환한다.
-
reportUrl의 스킴이 "
https"가 아니면, 오류를 반환한다. -
opts를 다음 항목을 가진 새
AttributionConversionOptions로 한다.aggregationService-
aggregationService
histogramSize-
histogramSize
-
dict["
lookback-days"] 가 존재하면:-
lookbackDays를 그 값으로 한다.
-
lookbackDays가 양의 정수가 아니면, 오류를 반환한다.
-
opts.
lookbackDays를 lookbackDays로 설정한다.
-
-
dict["
match-values"] 가 존재하면:-
matchValues를 그 값으로 한다.
-
matchValues가 inner list가 아니거나, matchValues의 항목 중 하나라도 32비트 부호 없는 정수 범위의 정수가 아니면, 오류를 반환한다.
-
opts.
matchValues를 matchValues로 설정한다.
-
-
dict["
impression-sites"] 가 존재하면:-
impressionSites를 그 값으로 한다.
-
impressionSites가 inner list가 아니거나, impressionSites의 항목 중 하나라도 문자열이 아니면, 오류를 반환한다.
-
opts.
impressionSites를 impressionSites로 설정한다.
-
-
dict["
impression-callers"] 가 존재하면:-
impressionCallers를 그 값으로 한다.
-
impressionCallers가 inner list가 아니거나, impressionCallers의 항목 중 하나라도 문자열이 아니면, 오류를 반환한다.
-
opts.
impressionCallers를 impressionCallers로 설정한다.
-
-
-
value를 그 값으로 한다.
-
value가 32비트 부호 없는 정수 범위의 양의 정수가 아니면, 오류를 반환한다.
-
opts.
value를 value로 설정한다.
-
-
-
maxValue를 그 값으로 한다.
-
maxValue가 32비트 부호 없는 정수 범위의 양의 정수가 아니면, 오류를 반환한다.
-
opts.
maxValue를 maxValue로 설정한다.
-
-
(opts, reportUrl)를 반환한다.
-
Assert: url은 potentially trustworthy URL이다.
-
headers를 값이 "
application/dap-report"인"Content-Type"이라는 이름의 header를 포함하는 새 header list로 둔다.참고:
AttributionAggregationProtocol이 언젠가dap-18-histogram이외의 값을 갖게 되면 이를 갱신해야 한다. -
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
-
request를 fetch하고, 오류가 발생한 경우 선택적으로 재시도한다.
5.3. Fetch 몽키 패치
-
request의 destination이 다음 중 하나가 아니면, 반환한다:
"","audio","image","script","track","video". -
request의 client가 secure context가 아니면, 반환한다.
-
response의 URL이 잠재적으로 신뢰할 수 있는 URL이 아니면, 반환한다.
-
implicitInputs를 request의 client에서 response의 URL의 origin과 함께 암시적 API 입력 얻기를 수행한 결과로 한다.
-
implicitInputs가 null이면, 반환한다.
-
saveImpressionHeader를 response의 header list에서
`을 가져온 결과로 한다.Save-Impression` -
saveImpressionHeader가 null이 아니면:
-
measureConversionHeader를 response의 header list에서
`을 가져온 결과로 한다.Measure-Conversion` -
measureConversionHeader가 null이 아니면:
-
parseConversionResult를 measureConversionHeader를 파싱한 결과로 한다.
-
parseConversionResult가 오류가 아니면:
-
HTTP-network fetch를 다음과 같이 수정한다:
includeCredentials가 true이면, 사용자 에이전트는 request와 response가 주어진 상태에서 응답
Set-Cookie헤더를 파싱하고 저장하는 것이 좋다.
다음 단계를 추가한다
-
request와 response로 Attribution 헤더 처리를 수행한다.
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]은 이 애플리케이션에 필요하다:
-
수집자 신원 (
collector_identity)은 집계 요청을 담당하는 엔티티를 식별한다. 이 확장의 값은 API 호출자의 신원을 인코딩하며, 이는 중개 사이트 또는 전환 사이트일 수 있다. 수집자 신원 확장은 전체 DAP 작업에 적용된다. -
예산 출처 (
budget_source)는 프라이버시 예산을 소비한 엔티티를 식별한다. 이 확장의 값은 전환 사이트의 신원을 인코딩한다. 예산 출처 확장은 전체 DAP 작업에 적용된다. -
프라이버시 예산 (
privacy_budget)은 집계 서비스가 집계 작업에 설정된 것보다 더 적은 프라이버시 예산을 받은 보고서를 집계하지 않도록 보장한다. 프라이버시 예산 확장은 각 보고서에 적용된다.
사용자 에이전트는 이러한 확장을 사용하여 자신이 생성하는 보고서를 구성한다.
6.1.3. DAP용 보고서 암호화
undefined intermediarySite,
시점
now,
그리고 목록인 정수들
histogram이 주어졌을 때:
-
length를 histogram의 크기로 둔다.
-
maxValue를 options.최대값으로 둔다.
-
chunkLength를 (Math.ceil(log2(maxValue + 1)) + 1) * length의 제곱근을 가장 가까운 정수로 반올림한 값으로 둔다.
-
vdaf를 새로운 PrioL1BoundSum VDAF [PRIO-L1] 인스턴스로 두며, length, maxValue, chunkLength를 전달한다.
-
microEpsilon을 options.epsilon에 1,000,000을 곱한 뒤 양의 무한대 방향으로 반올림한 값으로 둔다.
-
caller를 intermediarySite가
undefined가 아니면 intermediarySite로, 그렇지 않으면 topLevelSite로 둔다. -
taskConfig를 바이트 시퀀스로 두며, 이는 섹션 4.2 of [DAP]에 정의된 대로
TaskConfiguration인스턴스를 다음 값으로 인코딩하여 생성된다:-
빈
task_info. -
leader_aggregator_endpoint는 DAP Leader의 직렬화된 URL로 설정되며, 이는 options.Aggregation Service에 있는 선택된 집계 서비스의 구현 정의 정의에서 가져온다. 인코딩된 값은 구성된 URL과false(프래그먼트 제외를 의미)를 사용하여 URL 직렬화기를 호출해 생성된다. -
helper_aggregator_endpoint는 DAP Helper의 직렬화된 URL로 설정되며, 이는 options.Aggregation Service에 있는 선택된 집계 서비스의 구현 정의 정의에서 가져오며,leader_aggregator_endpoint값과 같은 과정으로 생성된다. -
time_precision값 5. -
min_batch_size값 20. -
batch_mode값 TBD(Distributed Aggregation Protocol (DAP) Extensions for the Attribution API § batch-mode 참고). -
빈
batch_config. -
vdaf_type값 7(A Prio Instantiation for Vector Sums with an L1 Norm Bound on Contributions § dap 참고). -
vdaf_configuration은 PrioL1BoundSum A Prio Instantiation for Vector Sums with an L1 Norm Bound on Contributions § dap에 따라 length, maxValue, chunkLength로 인코딩된다. -
작업 확장 집합
extensions, 즉 맵인 16비트 부호 없는 정수에서 바이트 시퀀스로의 매핑:
-
-
taskID를 바이트 시퀀스로 두며, 이는 taskConfig를 전달하여 Task Binding and In-Band Provisioning for DAP § task-id에 설명된 과정으로 생성된다.
-
ctx를 바이트 시퀀스로 두며, 인코딩된 문자열
dap-18과 taskID를 연결하여 형성되고, 섹션 4.4.2.1 of [DAP]에 정의되어 있다. -
reportID를 암호학적으로 안전한 무작위 소스 [RFC4086]에서 샘플링한 16바이트로 둔다.
-
rand를 암호학적으로 안전한 무작위 소스 [RFC4086]에서 샘플링한 128바이트로 둔다.
-
publicShare, inputShares를 vdaf.
shard()를 호출한 결과로 두며, 이는 섹션 4.1 of [VDAF]에 정의된 대로, ctx, histogram, reportID(VDAF "nonce" 매개변수로), 그리고 rand를 사용한다. -
time을 Unix epoch부터 now까지의 duration from을 5초의 duration으로 나누고, 음의 무한대 방향으로 반올림하여 얻은 정수로 둔다.
-
extensions를 맵인 16비트 부호 없는 정수에서 바이트 시퀀스로의 매핑으로 두며, 다음으로 구성된다:
-
프라이버시 예산에 대한 확장 코드포인트는 microEpsilon 값에 매핑되며, UINT32, 값 microEpsilon, 그리고
false(isLittleEndian을 의미)를 사용해NumericToRawBytes를 호출하여 인코딩된다.
-
-
reportMetadata를 reportID, time, extensions에서 생성된 인코딩된 DAP
ReportMetadata로 둔다. -
inputShares의 각 share에 대해 반복하여, 섹션 4.4.2.1에 설명된 공유 암호화 방법을 따른다:
-
pkR를 options.Aggregation Service가 나타내는 집계 서비스에 대해 얻은 집계 서비스 HPKE 구성에서 해당 역할의 공개 키로 둔다.
"dap-18-histogram"에 대한 URL은 DAP Leader 역할을 식별할 것으로 예상된다. 구현은 두 Aggregator 모두에 대한 HPKE 구성을 정적으로 얻어야 한다; § 9.4 구성되지 않은 브라우저를 보라. HPKE 구성은 요청 시 가져와서는 안 된다. 그렇게 하는 데 걸리는 시간이
measureConversion()호출자에게 정보를 누설하기 때문이다. -
serverRole을 첫 번째 항목(Leader)에 대해서는 값 2, 두 번째 항목(Helper)에 대해서는 값 3을 갖는 바이트로 둔다.
-
info를 다음을 연결하여 형성된 바이트 시퀀스로 둔다: 문자열
dap-18 input share의 인코딩된 값, 값 0x01을 갖는 바이트, 그리고 serverRole. -
inputShareAAD를 taskID, reportMetadata, publicShare, 그리고 taskConfig로부터 구성하며,
InputShareAad구조를 따른다. -
plaintextShare를 빈 집합(
private_extensions용)과 share(payload용)로부터 구성하며,PlaintextInputShare구조를 따른다. -
encryptedShare를 pkR, info, inputShareAAD, 그리고 plaintextShare를 전달하여 hpke.
Seal<mode_base>()를 호출한 결과로 둔다. -
encryptedShare를 encryptedInputShares에 추가한다.
-
-
report를 reportMetadata, publicShare, encryptedInputShares (두 값은 각각 leader 및 helper 암호화된 입력 공유), 그리고 DAP 집계자로부터 얻은 집계 서비스 HPKE 구성으로부터 생성된 인코딩된 DAP
Report로 둔다. -
report를 반환한다.
이 알고리즘은 DAP 관련 명세의 일부 세부 사항을 복제한다. 이 문서와 해당 명세들 사이에 불일치가 있다면, 그것은 이 문서의 의도하지 않은 오류이다. DAP와 상호작용할 때는 항상 참조된 명세를 따른다.
6.2. 재전송 공격 방지 요구사항
브라우저가 생성한 전환 보고서는 보고서를 요청한 사이트가 소비한 프라이버시 예산의 양에 바인딩된다.
집계 서비스는 동일한 보고서를 두 번 이상 수락하지 않음을 반드시 보장해야 한다.
7. 차등 프라이버시
이 설계는 프라이버시 설계의 기반으로 차등 프라이버시 개념을 사용한다. [PPA-DP]
차등 프라이버시는 시스템이 공개하는 개인 정보의 양을 보장할 수 있는 프라이버시에 대한 수학적 정의이다. [DP] 차등 프라이버시는 이 시스템에서 프라이버시가 보호되는 유일한 수단은 아니지만, 가장 엄밀하게 정의되고 분석된 수단이다. 따라서 가장 강한 프라이버시 보장을 제공한다.
차등 프라이버시는 집계된 데이터셋에 대한 개인 데이터 기여를 숨기기 위해 무작위 노이즈를 사용한다. 노이즈의 효과는 데이터셋에 대한 개별 기여를 숨기면서도, 집계 분석의 유용성은 유지하는 것이다.
차등 프라이버시를 적용하려면, 어떤 정보가 보호되는지를 정의할 필요가 있다. 이 시스템에서 보호되는 정보는 단일 사용자 프로필의 노출이며, 단일 사용자 에이전트에서, 단일 에포크 동안, 전환을 등록하는 단일 웹사이트에 대한 것이다. § 7.1 프라이버시 단위는 이 설계의 함의를 더 자세히 설명한다.
이 어트리뷰션 설계는 개별 차등 프라이버시라고 하는 차등 프라이버시의 한 형태를 사용한다. 이 모델에서 사용자 에이전트는 각각 자신이 기여하는 정보를 제한하도록 보장할 별도의 책임을 진다.
이 API의 개별 차등 프라이버시 설계에는 세 가지 주요 구성 요소가 있다:
-
사용자 에이전트는 (프라이버시 예산을 사용하여) 노출에 관한 정보 중 전환 보고서를 통해 기기를 벗어나는 양을 제한한다. § 7.2 프라이버시 예산은 이를 더 깊이 살펴본다.
-
집계 서비스는 임의의 주어진 전환 보고서가 사용자 에이전트가 그 보고서에 대해 계산한 프라이버시 예산에 따라서만 사용되도록 보장한다. § 6.2 재전송 공격 방지 요구사항은 집계 서비스에 대한 요구사항을 더 자세히 설명한다.
-
노이즈는 집계 서비스가 추가한다. § 7.3 차등 프라이버시 메커니즘은 사용될 수 있는 메커니즘을 자세히 설명한다.
이러한 조치들은 함께 각 프라이버시 단위에 대해 공개되는 정보에 제한을 둔다.
7.1. 프라이버시 단위
차등 프라이버시 구현에는 무엇이 보호되는지에 대한 명확한 정의가 필요하다. 이는 프라이버시 단위로 알려져 있으며, 프라이버시 보호를 받는 엔티티를 나타낸다.
이 시스템은 세 값의 조합인 프라이버시 단위를 채택한다:
-
사용자 에이전트 프로필. 즉, 한 사람이 사용하는 사용자 에이전트의 인스턴스이다.
-
노출을 등록하는 사이트(노출 사이트)는 고려되지 않는다. 이러한 사이트는 이 시스템으로부터 직접 정보를 받지 않는다.
-
현재 에포크.
이 값들 중 하나가 변경되면 새로운 프라이버시 단위가 생성되며, 그 결과 별도의 프라이버시 예산이 생긴다. 사람이 방문하는 각 사이트는 각 에포크마다 제한된 양의 정보를 받는다.
이상적으로 프라이버시 단위는 한 사람이다. 이상적이기는 하지만, 여러 이유로 한 사람과 완벽하게 대응됨을 보장하는 유용한 시스템을 개발하는 것은 불가능하다:
-
사람들은 종종 조정 없이 여러 브라우저와 여러 기기를 사용한다.
-
모든 웹사이트를 포괄하는 단위는 한 사이트에 의해 소진되어, 다른 사이트가 어떠한 정보도 얻지 못하게 할 수 있다.
-
광고는 지속적인 활동이다. 새 데이터에 대해 프라이버시 예산을 할당하지 않으면, 사이트는 자신의 예산을 영구히 소진할 수 있다.
7.1.1. 프라이버시 속성 및 그 한계에 대한 형식적 분석
Attribution의 프라이버시 보호는 여러 계층으로 이루어진다:
-
사이트별 예산은 하나의 전환 사이트가 사용자에 대해 학습할 수 있는 양을 제한한다.
-
전역 예산은 모든 사이트가 사용자에 대해 학습할 수 있는 양에 대한 보조 제한을 제공한다.
-
노출 사이트 할당량은 전환 사이트가 한 노출 사이트에서의 사용자 활동에 대해 학습할 수 있는 양을 제한한다.
-
각 사용자 동작 후 유지되는 카운터는 몇 개의 사이트가 API에 데이터를 저장하거나 API에서 학습할 수 있는지를 제한한다.
이 명세의 형식적 프라이버시 분석은 두 논문을 기반으로 한다. 첫 번째 [PPA-DP]는 온디바이스 개별 DP 회계를 위한 이론을 확립한다. 두 번째 [PPA-DP-2]는 사이트별 예산과 전역 예산이 제공하는 수학적 프라이버시 보장으로 분석을 확장한다.
사이트별 예산은 기본 프라이버시 보호로 보아야 한다. 사이트별 예산은 의미 있는 DP 보장을 제공하도록 설정되어야 한다. 그러나 [PPA-DP-2]의 분석은 이러한 보장을 제한하는 두 가지 가정을 식별했다:
-
데이터 생성에서 교차 사이트 적응성이 없음. 사이트의 질의 가능한 데이터 스트림(노출 및 전환)은 다른 사이트의 과거 DP 어트리뷰션 결과와 독립적으로 생성되어야 한다.
-
교차 사이트 공유 제한을 통한 누출이 없음. 한 사이트의 질의는 다른 사이트에 어떤 보고서가 방출되는지에 영향을 주어서는 안 된다.
요컨대, 두 가정 모두 실제로는 성립할 수 없다.
교차 사이트 적응성이 없다는 가정이 필요한 이유는 시스템이 시간이 지남에 따라 같은 사용자와 상호작용할 수 있는 여러 사이트를 포함하기 때문이다. 사이트들은 서로의 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()을 호출할 때마다, 어트리뷰션 로직이 노출을 선택한 에포크에 대해 프라이버시 예산이 차감된다.
전환 보고서는 "현재"로 표시된 시점에 요청될 수 있다. 그 전환 보고서는 검은 원으로 표시된 노출을 선택하며, 이는 사이트 B, C, E의 노출에 해당한다.
그 결과, 전환 사이트의 프라이버시 예산은 에포크 1, 3, 4, 5에서 차감된다. 에포크 2에는 노출이 기록되지 않았으므로, 해당 에포크에서 예산은 차감되지 않는다.
사용자 에이전트가 프라이버시 예산의 소진을 어떻게 관리하는지는 선택된 어트리뷰션 로직에 따라 달라진다.
7.2.2. 안전성 제한
기본 프라이버시 단위는 여러 사이트에 걸쳐 같은 사람의 활동을 상호 연관시킬 수 있는 공격자에게 취약하다.
사이트 그룹은 때때로 공유 소유권이나 강한 합의가 있는 경우처럼 자신의 활동을 조정할 수 있다. 어떤 특정 방문자가 동일한 사람임을—FedCM [FEDCM] 같은 것을 포함한 어떤 수단으로든—확신할 수 있는 사이트 그룹은 이 API에서 얻은 정보를 결합할 수 있다.
이는 어트리뷰션에서 사이트가 정보를 얻는 속도를 조정이 발생하는 사이트 수에 비례하여 증가시키는 데 사용될 수 있다. 기본 프라이버시 단위는 이러한 방식으로 공개되는 정보에 어떠한 제한도 두지 않는다.
이 효과에 대응하기 위해, 사용자 에이전트는 사이트를 고려하지 않는 추가 프라이버시 예산인 안전성 제한을 구현할 수 있다. 안전성 제한은 사이트별 예산보다 상당히 높을 수 있으므로, 대부분의 일반적인 브라우징 활동에서는 도달하지 않는다. 목표는 그것들이 집중적인 활동이나 공격을 받는 경우에만 효과적이도록 보장하는 것이다.
사이트별 프라이버시 예산과 마찬가지로, 사이트가 자신의 전환 보고서 요청이 안전성 제한을 초과하게 했는지 여부를 판별할 수 없어야 한다는 점이 매우 중요하다.
7.3. 차등 프라이버시 메커니즘
차등 프라이버시 메커니즘—즉 노이즈가 추가되는 구체적인 방법—은 집계 서비스가 선택할 수 있다.
라플라스 노이즈를 추가하는 것은 노이즈의 전체 크기와 구현 및 분석의 단순성 사이에서 균형을 맞추어 좋은 결과를 낼 것으로 기대된다. 현재 설계는 L1 노름에 기반한 DP 민감도를 사용하며, 이는 집계에서 추가되는 라플라스 노이즈를 지원한다. 다른 노이즈 메커니즘을 지원하려면 민감도가 계산되고 전달되는 방식에 추가 변경이 필요할 수 있다.
이러한 집계 서비스에 대해 정의된 것처럼, 중앙 위치에서 노이즈를 추가하면 총 보고서 수가 증가해도 총 노이즈 양이 증가하지 않는다. 이는 보고서가 생성되는 지점에서 노이즈를 적용하는 차등 프라이버시 설계 (즉 로컬 차등 프라이버시 모델)에 비해 유용성 측면의 이점을 제공한다. 그런 설계에서는 노이즈가 총 보고서 수에 비례하여 증가한다.
8. 보안 고려사항
8.1. 노출 저장소
Attribution API가 사용하는 노출 저장소는 브라우징 활동과 관련된 정보를 보유하고 브라우징 세션 간에 지속된다. 노출 저장소를 통한 정보 흐름은 엄격하게 제어되지만, 일부 정보는 출처 간에 운반된다.
다음 조치들은 노출 저장소를 통한 유해한 정보 흐름의 가능성을 제한한다:
-
웹사이트는 노출 저장소에서 읽을 수 없다. 노출 저장소의 정보는 암호화된 전환 보고서를 통해서만 공개된다. 사용자 에이전트와 집계 서비스의 기능 조합으로 제공되는 차등 프라이버시는 집계 서비스가 출력한 집계 정보가 어떤 사용자의 기여도 없는 경우의 값과 구별될 확률에 대해 엄밀한 한계를 제공한다.
-
사용자는 저장된 노출을 명시적으로 지울 수 있다.
-
사용자 에이전트가 명시적인 사용자 동작이 없더라도 lifetimeDays의 최댓값을 부과함으로써, 데이터가 노출 저장소에 지속될 수 있는 기간을 제한할 것을 권장한다.
8.2. 구현에서의 사이드 채널 위험
Attribution API는 필요한 보안 및 프라이버시 속성을 유지하기 위해 신중하게 구현되어야 한다. API를 호출하는 사이트는 다음을 알 수 없어야 한다:
-
Attribution API가 활성화되어 있는지 여부.
-
어트리뷰션이 발생했는지 여부.
-
프라이버시 예산이 소진되었는지 여부.
-
어떤 histogramIndex가 전환 값에 할당되는지.
명시적인 반환 값이나 throw된 예외만이 사이트가 Attribution API로부터 학습할 수 있는 유일한 방법은 아니라는 점에 유의하라. 다음과 같은 사이드 채널에서 민감한 정보를 추론하는 것이 가능할 수 있다:
-
API가 완료되는 데 걸리는 시간의 변동.
-
메모리, 저장소, 네트워크, CPU와 같은 API의 공유 리소스 소비. 여기에는 그 소비에 대한 제한의 적용도 포함되며, 사이트가 이를 관찰할 수 있는 경우가 해당된다.
API 함수들의 실행 시간 변동은 보장을 유지하기 위한 주요 고려사항이다. 실행 시간과 관련하여 특히 우려되는 두 가지 요인이 있다:
-
measureConversion()이 처리하는 노출의 수. 사이트가 저장되는 노출 수와 그것을 선택하는 로직을 제어하기 때문에, 이는 사이트가 교차 사이트 타이밍 사이드 채널을 만들 수 있는 상당한 노출을 생성한다.
-
공유 전역 상태에 대한 접근. API에 대한 동시 접근은 정확성 오류를 방지하기 위해 단일 어트리뷰션 예산 잠금에 의해 관리된다. 그 잠금은 API에 동시에 접근하는 사이트 간 정보 누출 수단을 만든다.
전역 프라이버시 예산 저장소, 노출 사이트 할당량 저장소, 그리고 에포크 시작 시간의 공유 전역 상태는, 이러한 값들이 알고리즘 실행 시간에 직접 영향을 주지 않으므로 위험이 더 작다. 구현은 여전히 어떤 전역 상태도 fingerprint 또는 다른 정보 누출에 기여하지 않도록 보장해야 한다.
모든 사이드 채널을 완전히 제거하는 것은 비현실적이지만, 구현은 attribution API에서 민감한 정보가 누출되는 것을 방지하기 위해 합리적인 노력을 해야 한다. 누출을 방지하기 위한 전략에는 다음이 포함된다:
-
API가 비활성화되어 있더라도 모든 API 입력을 완전히 검증하기.
-
조건부 로직 피하기. 예를 들어, measureConversion()은 보고될 전환 값이 0일 때에도 전환 보고서를 구성하는 전체 과정을 항상 거쳐야 한다.
-
특정 작업에 대해 고정된 실행 시간 설정하기.
8.3. 집계 서비스
집계 서비스는 웹 플랫폼의 일부는 아니지만, 그 보안은 Attribution 메커니즘의 전체 보안에 매우 중요하다. measureConversion()이 생성하는 전환 보고서는 집계 서비스의 암호화 키를 사용하여 암호화된다. 따라서 이러한 보고서에 포함된 정보가 공개될 가능성의 상당 부분은 집계 서비스의 세부 사항에 달려 있다.
사용자 에이전트 개발자는 집계 서비스를 Attribution API의 지원 서비스로 추가하기 전에 집계 서비스의 설계와 집계 서비스 운영자의 신뢰성을 신중히 고려해야 한다. 이러한 문제에 대한 추가 논의는 § 6 집계 및 § 9 프라이버시 고려사항에서 찾을 수 있다.
8.4. 여러 사이트의 보고서 결합
Attribution API의 프라이버시 메커니즘은 주로 사이트의 단위로 작동한다. 악의적인 운영자는 여러 사이트에 대해 노출을 등록하려고 시도하여, 어트리뷰션을 통해 그렇지 않았다면 공개되었을 정보의 양을 초과하게 할 수 있다. § 7.2.2 안전성 제한은 이러한 가능성을 완화하기 위한 추가 교차 사이트 프라이버시 예산 설정을 논의한다.
8.5. 교차 사이트 참여 제어
집계 히스토그램을 생성하려면, 여러 사이트가 협력해야 한다. 모든 노출 사이트는 자신이 저장하는 노출에 대해 일관된 값을 생성해야 한다. 전환 사이트는 노출 사이트가 올바른 값을 기록한다고 신뢰해야 한다.
API는 집계를 오염시킬 수 있는 원치 않는 노출의 위험을 사이트가 관리할 수 있도록 여러 필터링 옵션을 제공한다.
-
노출 사이트는
conversionSites를 사용하여 특정 전환 사이트를 대상으로 할 수 있다. -
노출은
conversionCallers를 사용하여 전환 사이트에서 동작하는 특정 중개자로 제한될 수 있다. -
전환 사이트는
impressionSites를 사용하여 어트리뷰션의 일부로 질의하는 노출 사이트를 제한할 수 있다. -
전환은 또한
impressionCallers를 사용하여 특정 중개자가 저장한 노출로 질의를 제한할 수 있다.
필터링 옵션은 어떤 사이트가 어트리뷰션에 참여할 수 있는지를 제한하는 데 유용하며, 이는 집계 결과를 오염시킬 수 있는 엔티티 집합을 줄인다. 이러한 옵션을 효과적으로 사용하는 것은 원치 않는 노출이 실수로 포함되는 일을 방지하는 데 특히 유용하다.
이러한 필터링 옵션은 결과를 오염시키려는 악의적 시도에 대해서는 효과가 제한적이다. 신뢰는 이러한 제어가 기대하는 것만큼 엄격하게 이분법적인 경우가 드물다. 목록에 포함된 노출 사이트는 전환 사이트의 관점에서 진짜인 노출과 위조되거나 오류가 있는 노출을 섞을 수 있다. 오류가 있는 노출은 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는 사이트가 이러한 필드에 사용자 식별자를
인코딩하는 것을 막지 않는다.
어트리뷰션 과정은 전환 보고서를 구성할
때
이 데이터를 사용할 수 있으며,
이는 해당 식별 정보가 그 보고서를 수신하는 사이트에
제공될 수 있다는 위험을 내포한다.
다음 조치들이 이 위험을 완화한다:
-
노출 저장소는 직접 읽을 수 없다. 따라서 식별자는 전환 보고서에서 그것에 관한 정보가 공개되는 범위 내에서만 추적에 사용할 수 있다.
-
전환 보고서의 정보는 집계와 노이즈 추가 후에만 공개된다.
-
사용자는 노출 저장소를 지울 수 있다.
-
Attribution 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]의 저자들이 제공한 것이다.