1. 소개
이 절은 비규범적이다.
1.1. 동기
브라우저는 이제 저장소 분할과 서드파티 쿠키 제거를 포함하여 크로스 사이트 사용자 추적을 방지하기 위해 노력하고 있다. 사용자 개인정보를 존중하는 방식으로 정당한 사용 사례를 계속 지원하기 위한 다양한 API 제안이 있다. 이러한 API 중 다수는 Shared Storage API와 Protected Audience API를 포함하여, 잠재적으로 식별 가능한 크로스 사이트 데이터를 특수 컨텍스트 안에 격리하며, 이는 데이터가 사용자 에이전트 밖으로 빠져나갈 수 없도록 보장한다.
개별 사용자의 크로스 사이트 데이터와 비교할 때, 사용자 그룹에 대한 집계 데이터는 덜 민감할 수 있으면서도 광범위한 사용 사례에 충분할 수 있다. 노이즈가 추가된 집계된 크로스 사이트 데이터를 보고할 수 있도록 집계 서비스가 구축되었다. 이 서비스는 원래 Attribution Reporting API에서 사용하기 위해 만들어졌지만, 더 일반적인 집계를 허용하면 추가 사용 사례를 지원한다. 특히 Protected Audience와 Shared Storage API는 이 기능을 사용할 수 있기를 기대한다.
1.2. 개요
이 문서는 크로스 사이트 데이터에 접근할 수 있는 격리된 컨텍스트 (예: Shared Storage worklet)에서 호출할 수 있는 범용 API를 개괄한다. 이러한 컨텍스트 안에서, 잠재적으로 식별 가능한 데이터는 "집계 가능 보고서"로 캡슐화될 수 있다. 유출을 방지하기 위해 이 보고서의 크로스 사이트 데이터는 집계 서비스에서만 처리될 수 있도록 암호화된다. 처리 중 이 서비스는 노이즈를 추가하고 수행할 수 있는 쿼리 수에 제한을 부과한다.
이 API는 출처가 집계 가능 보고서를 구성하고, 나중에 집계 서비스를 통해 계산하기 위해 암호화된 페이로드에 포함할 값을 지정할 수 있는 함수를 제공한다. 이러한 호출의 결과로 집계 가능 보고서는 지연 후 스크립트 출처의 보고 엔드포인트로 전송되도록 큐에 들어간다. 엔드포인트가 보고서를 수신한 뒤에는 보고서를 배치 처리하고 처리를 위해 집계 서비스로 보낸다. 해당 과정의 출력은 (근사) 결과를 포함하는 요약 보고서이며, 이는 스크립트의 출처로 다시 전달된다.
1.3. 검토된 대안
선택된 API 형태 대신, 우리는 fetch()에
훨씬 더 가까운 설계와 맞추는 것을 검토했다.
그러나 이를 부적절하게 만드는 몇 가지
주요 차이가 있다:
-
이 API는
fetch()를 사용할 수 없는 격리된 컨텍스트에서 사용되도록 설계되었다. -
개발자가 집계 가능 보고서가 언제 전송되는지 제어하거나, 그것이 전송되었다는 사실을 (격리된 컨텍스트 밖에서) 알 수 있게 하는 것은 반목표이다. 단, 격리된 컨텍스트 밖에서 컨텍스트 ID를 제공하는 경우의 예외는 아래 보고서 수를 통한 유출로부터 보호를 참조하라.
-
보고서는 임의의 보고 엔드포인트로 보낼 수 없고, 스크립트 출처의 특정
.well-known경로로만 보낼 수 있다. -
보고서의 입력은 매우 구체적이며(
PAHistogramContribution들의 배열),fetch()의 범용 콘텐츠에 적합하지 않다. -
응답이라는 개념이 없다.
따라서 우리는 아래에 자세히 설명된 더 맞춤화된 API 형태를 선택했다.
2. 노출된 인터페이스
[Exposed =(InterestGroupScriptRunnerGlobalScope ,SharedStorageWorklet ),SecureContext ]interface {PrivateAggregation undefined contributeToHistogram (PAHistogramContribution );contribution undefined contributeToHistogramOnEvent (DOMString ,event record <DOMString ,any >);contribution undefined enableDebugMode (optional PADebugModeOptions = {}); };options dictionary {PAHistogramContribution required bigint ;bucket required long ;value bigint = 0; };filteringId dictionary {PADebugModeOptions required bigint ; };debugKey
Web Platform Design Principles에 따라,
long을 [EnforceRange] long long으로 전환하는 것을 고려해야 한다.
enableDebugMode(options)의
인수는 기본값 {}를 가져서는 안 된다. 또는 debugKey가
PADebugModeOptions에서
필수여서는 안 된다.
각 PrivateAggregation
객체는 다음 필드를 가진다:
- 범위 지정 세부 정보 (기본값 null)
-
범위 지정 세부 정보 또는 null
- 사용 허용됨 (기본값 false)
- 기본 contributeToHistogramOnEvent() 처리를 수행해야 함 (기본값 항상 true를 반환하는 알고리즘)
-
PrivateAggregation,DOMString및 (DOMString키를 가진) 맵을 받아 불리언 또는 예외 중 하나를 반환하는 알고리즘.참고: 이는 임베딩 API가 모든 호출 또는 특정 호출만에 대해 처리를 재정의할 수 있게 한다. 반환값 true는 이 호출이 이 명세의 기본 구현을 사용하여 처리됨을 나타낸다. 반환값이 예외이면 임베딩 API의 처리가 throw할 수 있게 한다.
참고: 아래 전역 스코프에 노출을 보라.
contributeToHistogram(PAHistogramContribution contribution)
메서드 단계는
다음과 같다:
-
validationResult를 contribution 및 this의 범위 지정 세부 정보가 주어졌을 때 히스토그램 기여 검증의 결과로 둔다.
기여 배열을 허용하는 것을 고려한다. [Issue #44]
contributeToHistogramOnEvent(event, contribution)
메서드 단계는 다음과 같다:
-
defaultProcessingResult를 this의 기본 contributeToHistogramOnEvent() 처리를 수행해야 함을 this, event 및 contribution가 주어졌을 때 실행한 결과로 둔다.
-
defaultProcessingResult가 예외이면, defaultProcessingResult를 throw한다.
-
defaultProcessingResult가 false이면, 반환한다.
-
contribution을 contribution의 JavaScript 값을 IDL 타입
PAHistogramContribution으로 변환한 결과로 설정한다.참고: contribution이 호환되지 않으면 이는
TypeError를 throw한다. -
validationResult를 contribution 및 this의 범위 지정 세부 정보가 주어졌을 때 히스토그램 기여 검증의 결과로 둔다.
-
unprefixedEvent를 event 안에서 "
reserved."의 길이부터 event의 길이까지의 코드 단위 부분 문자열로 둔다.
참고: 전방 호환성을 위해, "reserved."로
시작하는 인식되지 않은
이벤트에 대해서는 오류를 throw하지 않는다.
enableDebugMode(optional PADebugModeOptions options)
메서드 단계는 다음과 같다:
-
scopingDetails를 this의 범위 지정 세부 정보로 둔다.
-
debugScope를 scopingDetails의 디버그 범위 가져오기 단계를 실행한 결과로 둔다.
-
디버그 범위 맵[debugScope]이 존재하면, "
DataError"DOMException을 throw한다.참고: 이는
enableDebugMode()가 이 디버그 범위에 대해 이미 실행된 경우 발생한다. -
debugKey를 null로 둔다.
-
options가 주어졌다면:
-
debugDetails를 다음 항목을 가진 새 디버그 세부 정보로 둔다:
-
선택적으로, debugDetails를 새 디버그 세부 정보로 설정한다.
참고: 이는 사용자 에이전트가 디버그 모드를 전역적으로 또는 특정 호출자에 대해서만 사용할 수 없게 할 수 있도록 한다.
오류가 적절한 타입인지
보장하라. 예를 들어 InvalidAccessError는
폐기되었다.
3. 전역 스코프에 노출
이 API를 전역 스코프에 노출하려면, 타입이 PrivateAggregation인
privateAggregation 속성을 읽기 전용으로
전역 스코프에 노출해야 한다. 그 getter 단계는 this가 주어졌을 때 privateAggregation
가져오기 단계로 설정되어야 한다.
각 전역 스코프는 관련 문서가
"private-aggregation"
정책 제어 기능을 사용할 수 있는지에 따라, 자신이 노출하는 PrivateAggregation
객체의 사용 허용됨을 설정해야 한다.
또한 각 전역 스코프는 자신이 노출하는 PrivateAggregation
객체의 범위 지정
세부 정보를 null이 아닌 값으로 설정해야 한다.
전역 스코프는 API를 사용할 수 있게 하려는 시점까지 이 필드 설정을
기다려야 한다.
배치 범위 가져오기 단계에서 반환된 모든 배치 범위에 대해, 나중에 동일한 배치 범위, 전역 스코프의 관련 설정 객체의 출처, 어떤 컨텍스트 유형 및 timeout(또는 null)이 주어졌을 때 배치 범위에 대한 기여 처리 단계가 나중에 수행되어야 한다.
참고: 이 마지막 요구사항은 서로 다른 출처를 가진 전역 스코프가 같은 배치 범위를 공유할 수 없음을 의미한다. 동일 출처 정책 논의를 보라.
디버그 범위 가져오기 단계에서 반환된 모든 디버그 범위에 대해, 나중에 동일한 디버그 범위가 주어졌을 때 디버그 범위 완료 표시 단계가 수행되어야 한다.
참고: 나중의 알고리즘은 기여 캐시 항목이 기여 캐시 안에 있을 때마다, 그 항목의 배치 범위가 주어져 배치 범위에 대한 기여 처리 단계가 수행되기 전에, 그 항목의 디버그 범위가 주어져 디버그 범위 완료 표시 단계가 수행되었음을 assert한다.
3.1.
contributeToHistogramOnEvent() 처리 재정의
각 API는 자신이 노출하는 PrivateAggregation
객체에 대해 기본
contributeToHistogramOnEvent() 처리를 수행해야 함 알고리즘도 설정할 수 있다. 이 훅은 임베딩 API가
원하는 모든 contributeToHistogramOnEvent()
호출의 처리를 재정의할 수 있게 한다.
이 알고리즘은 이 명세에 정의된 일반 처리가 (해당 호출에 대해) 발생해야 함을 나타내기 위해 true를 반환해야 한다. 임베딩 API의 처리 중 오류가 발생했음을 나타내기 위해 예외를 반환해야 한다. 또는 임베딩 API가 호출을 처리하지만 예외가 throw되어서는 안 됨을 나타내기 위해 false를 반환해야 한다.
임베딩 API가 호출 처리를 재정의하는 경우(즉, 알고리즘이 true를 반환하지 않는 경우),
errorEvent가 내부 오류 이벤트인 « "reserved.", errorEvent »의
연결인 모든 event를 허용해야 하며, IDL 타입 PAHistogramContribution으로
변환 가능한 JavaScript 값을 가진 모든
contribution도 허용해야 한다. 즉, 그러한 경우에는 예외를 반환해서는 안 된다. 그러나
임베딩 API는 이 명세에 정의된 기본 처리에서
허용되지 않는 추가 event나 contribution을 허용할 수 있다.
임베딩 API가 내부 오류 이벤트를 조건으로 하는 기여를 지정하는 호출의 처리를 재정의하는 경우, 해당 기여를 버리려는 의도가 아니라면 임베딩 API는 적절한 항목으로 기여 캐시에 항목 추가를 호출해야 한다.
임베딩 API가 추가 오류 이벤트를 지원하기 위해 호출 처리를 재정의하는 경우,
관련 조건이 발생했는지 아닌지가 판정될 때까지 기다려야 한다. 사용자 정의 오류 이벤트가
트리거되었다면, 관련 기여의 오류 이벤트로
이미 트리거된 외부 오류를
사용해야 한다. 사용자 정의 오류 이벤트가
트리거되지 않았다면, 기여는 버려져야 하며 해당 기여에 대해 기여 캐시에 항목 추가 호출을
해서는 안 된다.
또한 임베딩 API가 처리를 재정의하는 경우, 기여 캐시에 항목 추가를 호출할 수 있기 전에
contribution을 IDL 타입 PAHistogramContribution으로
변환해야 한다.
이는 contribution이 IDL 타입으로 자동 변환 가능한 JavaScript 값을 가지는지
여부와 관계없이 적용된다.
3.2. Private Aggregation을 노출하는 API
이 절은 비규범적이다.
이 API는 현재 두 API의 명세에 정의된 전역 스코프에 노출된다:
4. 구조
4.1. 배치 범위
배치 범위는 어떤PAHistogramContribution들이
그들의 디버그 세부 정보가
다르지 않은 한 같은 집계 가능 보고서에
전송되어야 하는지를 식별하는
고유 내부 값이다.
고유 내부 값은 내보내진 정의가 아니다. infra/583을 보라.
4.2. 디버그 범위
디버그 범위는 같은 실행 기간 안에서enableDebugMode()
호출의 존재 여부에 따라 어떤 PAHistogramContribution들의
디버그 세부 정보가
영향을 받아야 하는지를 식별하는 고유 내부 값이다.
4.3. 범위 지정 세부 정보
범위 지정 세부 정보는 다음 항목을 가진 구조체이다:4.4. 디버그 세부 정보
디버그 세부 정보는 다음 항목을 가진 구조체이다:4.5. 오류 이벤트
내부 오류 이벤트는 다음 중 하나이다:- "
report-success" -
보고서가 예약되었고 기여가 하나도 버려지지 않았다.
- "
too-many-contributions" -
보고서는 예약되었지만, 보고서별 제한으로 인해 일부 기여가 버려졌다.
- "
empty-report-dropped" -
보고서에 기여가 없어 예약되지 않았다.
- "
pending-report-limit-reached" -
보고서는 예약되었지만 보류 중인 보고서의 제한에 도달했다. 즉, 보고서를 하나 더 예약하려고 하면 제한으로 인해 실패하게 된다.
- "
insufficient-budget" -
기여 예산이 충분하지 않아 보고서의 하나 이상의 기여가 버려졌거나 (또는 전체 보고서가 버려졌다).
- "
contribution-timeout-reached" -
기여 timeout이 발생했을 때 보고서와 관련된 컨텍스트가 아직 실행 중이었다.
오류 이벤트는 내부 오류
이벤트 또는 특수
값 이미 트리거된 외부 오류이다.
참고: 이 특수 값은 이미 발생한 모든 외부 오류 이벤트를 나타낸다. 외부 오류 이벤트는 임베딩 API에 의해 정의되며 내부 오류 이벤트와 구별된다. 자세한 내용은 contributeToHistogramOnEvent()를 보라.
모든 오류 이벤트는
위에 정의된 순서의 모든 내부
오류 이벤트와 그 뒤의
이미 트리거된 외부 오류로
구성된 오류 이벤트의
리스트이다.
4.6. 기여 캐시 항목
기여 캐시 항목은 다음 항목을 가진 구조체이다:- 기여
- 오류 이벤트 (기본값 null)
-
오류 이벤트 또는 null.
참고: 이는 해당 기여가 어떤 오류 이벤트에 조건부인지, 또는 기여가 무조건적이면 null임을 나타낸다.
- 배치 범위
- 디버그 범위
- 디버그 세부 정보 (기본값 null)
-
디버그 세부 정보 또는 null
4.7. 보류 중인 기여
보류 중인 기여는 다음 항목을 가진 구조체이다:
- 무조건 기여 (기본값: 새 리스트)
- 조건부 기여 (기본값: 새 맵)
- 트리거된 오류 이벤트 (기본값: 새 집합)
4.8. 집계 가능 보고서
집계 가능 보고서는 다음 항목을 가진 구조체이다:
- 보고 출처
- 원래 보고 시간
- 보고 시간
- 기여
- api
- 보고서 ID
- 디버그 세부 정보
- 집계 코디네이터
- 컨텍스트 ID
-
문자열 또는 null
- 필터링 ID 최대 바이트
-
양의 정수
- 최대 기여 수
-
양의 정수
- 큐에 들어감
4.9. 집계 코디네이터
집계 코디네이터는 허용된 집계 코디네이터 집합이 포함하는 출처이다.
여기 및 다른 곳에서 Attribution Reporting API가 사용하는 적합한 출처 개념으로 전환하는 것을 고려한다.
다른 구조들을 헤더를 통해 정의하는 대신 인라인으로 정의하도록 이동한다. 모든 하위 제목을 제거하는 것도 고려한다.
4.10. 컨텍스트 유형
컨텍스트 유형은PrivateAggregation
객체가 어떤 종류의 전역 스코프에 노출되었는지를 나타내는
문자열이다. Private
Aggregation을 노출하는 각 API는 이에 대해 고유한 문자열(또는 여러 개)을 선택해야 한다.
4.11. 사전 지정 보고서 매개변수
사전 지정 보고서 매개변수는 다음 항목을 가진 구조체이다:
- 컨텍스트 ID (기본값: null)
-
문자열 또는 null
- 필터링 ID 최대 바이트 (기본값: 기본 필터링 ID 최대 바이트)
-
양의 정수
- 최대 기여 수 (기본값: null)
-
양의 정수 또는 null
5. 저장소
사용자 에이전트는 집계 가능 보고서 캐시를 보유하며, 이는 집계 가능 보고서들의 리스트이다.
사용자 에이전트는 집계 코디네이터 맵을 보유하며, 이는 배치 범위에서 집계 코디네이터로 가는 맵이다.
사용자 에이전트는 사전 지정 보고서 매개변수 맵을 보유하며, 이는 배치 범위에서 사전 지정 보고서 매개변수로 가는 맵이다.
사용자 에이전트는 기여 캐시를 보유하며, 이는 기여 캐시 항목들의 리스트이다.
사용자 에이전트는 디버그 범위 맵을 보유하며, 이는 디버그 범위에서 디버그 세부 정보로 가는 맵이다.
다른 곳에서 사용자 에이전트를 사용할 때 정의에 링크하라.
5.1. 저장소 지우기
사용자 에이전트는 사용자가 집계 가능 보고서 캐시의 데이터와 예산 쿼리 알고리즘을 위해 저장된 모든 기여 이력 데이터를 삭제할 수 있게 하는 제어 수단을 노출해야 한다.
사용자 에이전트는 사용자가 기여 캐시, 디버그 범위 맵 및 사전 지정 보고서 매개변수 맵의 데이터를 삭제할 수 있게 하는 제어 수단을 노출할 수 있다.
6. 상수
기본 필터링 ID 최대 바이트는 명시적으로 선택된 것이 없을 때 사용되는 최대 바이트를 제어하는 양의 정수이다. 그 값은 1이다.
유효한 필터링 ID 최대 바이트 범위는 max bytes의 허용 값을 제어하는 양의 정수들의 집합이다. 그 값은 1부터 8까지의 범위(양끝 포함)이다.
7. 구현 정의 값
허용된 집계 코디네이터 집합은 어떤 출처가 유효한 집계 코디네이터인지 제어하는 출처들의 집합이다. 이 집합의 모든 항목은 잠재적으로 신뢰할 수 있는 출처여야 한다.
기본 집계 코디네이터는 명시적으로 선택된 것이 없을 때 보고서에 사용할 것을 제어하는 집계 코디네이터이다.
최대 maxContributions는 집계 가능 보고서당 기여 수의 상한을 정의하는 양의 정수이다.
API별 기본 maxContributions는 컨텍스트 유형에서 양의 정수로 가는 맵이다. 의미상으로, 이는 Shared Storage와 같은 모든 종류의 호출 컨텍스트에 대해 보고서당 기본 기여 수를 정의한다. 호출자가 다른 값을 구체적으로 요청하지 않을 때 이 맵의 값이 사용된다. 이 맵의 각 값은 최대 maxContributions보다 작거나 같아야 한다.
최소 보고 지연은 집계 가능 보고서를 전달하기 위한 최소 지연을 제어하는 음이 아닌 기간이다.
무작위 보고 지연은 집계 가능 보고서를 전달하기 위한 무작위 지연을 제어하는 양의 기간이다. 이 지연은 최소 보고 지연에 추가된다.
8. Permissions Policy 통합
이 명세는 문자열
"private-aggregation"으로
식별되는 정책 제어 기능을 정의한다.
그 기본 허용 목록은 "*"이다.
참고: 사용 허용됨 필드는 이 API와 통합되는 다른 명세가 이 정책 제어 기능에 따라 설정한다.
9. 알고리즘
정수를 직렬화하려면, 가능한 가장 짧은 십진수의 문자열로 나타낸다.
이는 이상적으로 Infra의 더 설명적인 알고리즘으로 대체되어야 한다. infra/201을 보라.
9.1. 내보낸 알고리즘
참고: 이 알고리즘들은 다른 명세가 이 API와 통합할 수 있게 한다.
PrivateAggregation
this가 주어졌을 때
privateAggregation 가져오기:
-
scopingDetails를 this의 범위 지정 세부 정보로 둔다.
-
scopingDetails가 null이면, 이름이 "
NotAllowedError"인DOMException을 throw한다.참고: 이는 예를 들어 로드 후 스크립트의 초기 실행이 완료되지 않았기 때문에 API를 아직 사용할 수 없음을 나타낸다.
-
this의 사용 허용됨이 false이면, "
InvalidAccessError"인DOMException을 throw한다. -
this를 반환한다.
오류가 적절한
타입인지 보장하라. 예를 들어 InvalidAccessError는
폐기되었다.
-
debugDetails를 debugDetailsOverride로 둔다.
-
debugDetails가 null이면, debugDetails를 새 디버그 세부 정보로 설정한다.
-
preSpecifiedParams의 컨텍스트 ID가 null이 아니면, true를 반환한다.
-
preSpecifiedParams의 필터링 ID 최대 바이트가 기본 필터링 ID 최대 바이트가 아니면, true를 반환한다.
-
effectiveMaxContributions를 api 및 preSpecifiedParams의 최대 기여 수로 최대 기여 수 결정을 수행한 결과로 둔다.
-
defaultMaxContributions를 API별 기본 maxContributions[api]로 둔다.
-
effectiveMaxContributions가 defaultMaxContributions가 아니면, true를 반환한다.
-
false를 반환한다.
참고: 기여가 없었다는 사실을 숨기기 위해 'null 보고서'를 보내야 하는 경우가 있다. 예를 들어, 예산 자체가 크로스 사이트 데이터이므로 요청된 기여에 충분하지 않았을 수 있다. 또는 호출자가 크로스 사이트 데이터를 읽은 뒤 기여하지 않기로 선택했을 수도 있다. 이러한 종류의 시나리오에서는 보고서의 부재가 크로스 사이트 데이터를 보고 엔드포인트에 드러낼 수 있다. 보고서 수를 통한 유출로부터 보호를 보라.
참고: 임베딩 API는 보고서가 결정론적이 아니거나 timeout에 이미 도달한 경우, 즉 timeout이 이 호출을 트리거하게 한 경우 timeout을 null로 설정할 것으로 기대된다. (결정론적 보고서에는 항상 timeout이 설정되어야 한다.)
-
batchEntries를 새 리스트로 둔다.
-
-
entry의 배치 범위가 batchingScope이면:
-
Assert: entry의 디버그 세부 정보는 null이 아니다.
참고: 이는 배치 범위에 대한 기여 처리 단계 전에 디버그 범위 완료 표시 단계가 실행되었음을 assert한다.
-
entry를 batchEntries에 추가한다.
-
-
-
aggregationCoordinator를 기본 집계 코디네이터로 둔다.
-
집계 코디네이터 맵[batchingScope]이 존재하면:
-
aggregationCoordinator를 집계 코디네이터 맵[batchingScope]으로 설정한다.
-
집계 코디네이터 맵[batchingScope]을 제거한다.
-
-
preSpecifiedParams를 새 사전 지정 보고서 매개변수로 둔다.
-
사전 지정 보고서 매개변수 맵[batchingScope]이 존재하면:
-
preSpecifiedParams를 사전 지정 보고서 매개변수 맵[batchingScope]으로 설정한다.
-
사전 지정 보고서 매개변수 맵[batchingScope]을 제거한다.
-
-
isDeterministicReport를 preSpecifiedParams 및 contextType가 주어졌을 때 보고서를 결정론적으로 보내야 하는지 결정의 결과로 둔다.
-
isDeterministicReport가 false이면, assert: timeout은 null이다.
참고: Timeout은 결정론적 보고서에만 사용할 수 있다.
-
batchEntries가 비어 있고 isDeterministicReport가 false이면, 반환한다.
-
batchedContributions를 새 순서 있는 맵으로 둔다.
-
batchEntries의 각 entry에 대해 반복한다:
-
batchedContributions가 비어 있으면:
-
batchedContributions의 각 debugDetails → pendingContributions에 대해 반복한다:
-
reportingOrigin, contextType, pendingContributions, debugDetails, aggregationCoordinator, preSpecifiedParams 및 timeout로 보고서 생성 및 예약 단계를 수행한다.
-
참고: 이 단계들은 각 보고서가 하나의 메타데이터 집합만 가질 수 있으므로 기여를 그들의 디버그 세부 정보에 따라 나눈다.
USVString
originString이 주어졌을 때 Private Aggregation 코디네이터 획득은 다음 단계를 수행한다.
이들은 집계
코디네이터 또는
DOMException을
반환한다.
-
url를 originString에 대해 URL 파서를 실행한 결과로 둔다.
-
url가 실패 또는 null이면, 이름이 "
SyntaxError"인 새DOMException을 반환한다. -
origin을 url의 출처로 둔다.
-
origin이 주어졌을 때 출처가 집계 코디네이터인지 결정의 결과가 false이면, 이름이 "
DataError"인 새DOMException을 반환한다. -
origin을 반환한다.
-
집계 코디네이터 맵[batchingScope]을 origin으로 설정한다.
다른 곳에서
알고리즘을 일치하도록 <div algorithm> 블록으로 둘러싸고,
bikeshed/1472에 따라 모든 알고리즘에
스타일링을 추가한다.
-
contextId를 params의 컨텍스트 ID로 둔다.
-
filteringIdMaxBytes를 params의 필터링 ID 최대 바이트로 둔다.
-
Assert: filteringIdMaxBytes는 유효한 필터링 ID 최대 바이트 범위에 포함된다
-
maxContributions를 params의 최대 기여 수로 둔다.
-
Assert: maxContributions는 null이거나 0보다 크다.
-
사전 지정 보고서 매개변수 맵[batchingScope]을 params로 설정한다.
PAHistogramContribution
contribution 및 범위
지정 세부 정보 scopingDetails가 주어졌을 때
히스토그램
기여 검증은 다음 단계를 수행한다. 이들은 기여 캐시 항목 또는 예외를 반환한다.
-
contribution["
bucket"]가 0부터 2128까지의 범위(양끝 제외)에 포함되어 있지 않으면,RangeError를 반환한다. -
contribution["
value"]가 음수이면,RangeError를 반환한다. -
batchingScope를 scopingDetails의 배치 범위 가져오기 단계를 실행한 결과로 둔다.
-
filteringIdMaxBytes를 기본 필터링 ID 최대 바이트로 둔다.
-
사전 지정 보고서 매개변수 맵[batchingScope]이 존재하면:
-
filteringIdMaxBytes를 사전 지정 보고서 매개변수 맵[batchingScope]의 필터링 ID 최대 바이트로 설정한다.
-
-
contribution["
filteringId"]가 0부터 256filteringIdMaxBytes까지의 범위(양끝 제외)에 포함되어 있지 않으면,RangeError를 반환한다. -
다음 항목을 가진 새 기여 캐시 항목을 반환한다:
- 기여
-
contribution
- 배치 범위
-
batchingScope
- 디버그 범위
-
scopingDetails의 디버그 범위 가져오기 단계를 실행한 결과.
오류가 적절한
타입인지 보장하라. 예를 들어 InvalidAccessError는
폐기되었다.
9.2. 보고서 예약
-
Assert: reportingOrigin은 잠재적으로 신뢰할 수 있는 출처이다.
-
선택적으로 반환한다.
참고: 이 구현 정의 조건은 사용자 에이전트가 여러 이유로 보고서를 버릴 수 있게 하려는 것이다. 예를 들어 사용자 옵트아웃, 출처가 등록되지 않음 또는 보류 중인 보고서 제한에 도달한 경우가 있다.
-
currentWallTime을 현재 벽시계 시간으로 둔다.
-
allUnmergedContributions을 reportingOrigin, api, pendingContributions, preSpecifiedParams, timeout 및 currentWallTime이 주어졌을 때 병합되지 않은 모든 기여 컴파일의 결과로 둔다.
-
isDeterministicReport를 preSpecifiedParams 및 api가 주어졌을 때 보고서를 결정론적으로 보내야 하는지 결정의 결과로 둔다.
-
effectiveMaxContributions를 api 및 preSpecifiedParams의 max contributions로 max contributions 결정을 수행한 결과로 둔다.
-
keptMergeKeys를 새 집합으로 둔다.
-
allUnmergedContributions의 각 contribution에 대해 반복한다:
-
keptMergeKeys에 포함되지 않은 병합 키를 가진 모든 항목을 allUnmergedContributions에서 제거한다.
-
finalBudgetResults를 allUnmergedContributions, reportingOrigin, api, currentWallTime 및 true가 주어졌을 때 예산 쿼리의 결과로 둔다.
-
Assert: finalBudgetResults의 크기는 allUnmergedContributions의 크기와 같다.
-
0부터 finalBudgetResults의 크기까지의 범위(끝 제외)의 각 i에 대해 반복한다:
-
finalBudgetResults[i]가 false이면, allUnmergedContributions[i]의
value를 0으로 설정한다.
-
-
mergedContributionsMap을 새 순서 있는 맵으로 둔다.
-
allUnmergedContributions의 각 contribution에 대해 반복한다:
-
mergedContributions를 mergedContributionsMap의 값으로 둔다.
-
Assert: mergedContributions는 effectiveMaxContributions보다 작거나 같은 크기를 가진다.
-
mergedContributions가 비어 있고 isDeterministicReport가 false이면 반환한다.
-
report를 reportingOrigin, api, mergedContributions, debugDetails, aggregationCoordinator, preSpecifiedParams, timeout 및 currentWallTime이 주어졌을 때 집계 가능 보고서 획득의 결과로 둔다.
-
report를 사용자 에이전트의 집계 가능 보고서 캐시에 추가한다.
PAHistogramContribution들의
리스트를 반환한다.
-
wasTimeoutReached를 isDeterministicReport가 true이고 timeout이 null인지 여부를 나타내는 불리언으로 둔다.
-
pendingContributions, "
contribution-timeout-reached" 및 wasTimeoutReached가 주어졌을 때 내부 오류 이벤트 결과 기록을 수행한다. -
provisionalBudgetResults를 pendingContributions의 무조건 기여, reportingOrigin, api, currentWallTime 및 false가 주어졌을 때 예산 쿼리의 결과로 둔다.
-
Assert: provisionalBudgetResults의 크기는 pendingContributions의 무조건 기여의 크기와 같다.
-
insufficientBudget을 provisionalBudgetResults의 어떤 값이 false인지 여부를 나타내는 불리언으로 둔다.
-
pendingContributions, "
insufficient-budget" 및 insufficientBudget가 주어졌을 때 내부 오류 이벤트 결과 기록을 수행한다. -
pendingReportLimitReached를 구현 정의 알고리즘에 의해 결정되는 불리언으로 둔다.
참고: 이는 예산 쿼리에서 동시에 보류 중인 보고서 수의 제한에 도달했지만 초과하지는 않았을 때를 나타내기 위한 것이다.
-
pendingContributions, "
pending-report-limit-reached" 및 pendingReportLimitReached가 주어졌을 때 내부 오류 이벤트 결과 기록을 수행한다. -
isEmptyAndWouldBeDropped를 isDeterministicReport가 false이고 pendingContributions의 무조건 기여가 비어 있는지 여부를 나타내는 불리언으로 둔다.
-
pendingContributions, "
empty-report-dropped" 및 isEmptyAndWouldBeDropped가 주어졌을 때 내부 오류 이벤트 결과 기록을 수행한다. -
effectiveMaxContributions를 api 및 preSpecifiedParams의 max contributions로 max contributions 결정을 수행한 결과로 둔다.
-
tooManyContributions를 false로 둔다.
-
provisionallyApprovedMergeKeys를 새 집합으로 둔다.
-
pendingContributions, "
too-many-contributions" 및 tooManyContributions가 주어졌을 때 내부 오류 이벤트 결과 기록을 수행한다. -
provisionallyApprovedMergeKeys에 포함되지 않은 병합 키를 가진 모든 항목을 pendingContributions의 무조건 기여에서 제거한다.
-
reportSuccess를 다음 중 어느 것도 true가 아닌지 여부를 나타내는 불리언으로 둔다: isEmptyAndWouldBeDropped, tooManyContributions, insufficientBudget, pendingReportLimitReached.
-
pendingContributions, "
report-success" 및 reportSuccess가 주어졌을 때 내부 오류 이벤트 결과 기록을 수행한다. -
allUnmergedContributions를 새 리스트로 둔다.
-
모든 오류 이벤트의 각 errorEvent에 대해 반복한다:
-
pendingContributions의 조건부 기여[errorEvent]가 존재하지 않으면, continue한다.
-
Assert: pendingContributions의 트리거된 오류 이벤트는 errorEvent를 포함하거나, errorEvent는 "
already triggered external error"이다.참고: 내부 오류 이벤트가 트리거되지 않았다고 결정되면, 그 조건부 기여는 내부 오류 이벤트 결과 기록에 의해 제거된다.
-
allUnmergedContributions를 pendingContributions의 조건부 기여[errorEvent]로 확장한다.
-
-
allUnmergedContributions를 pendingContributions의 무조건 기여로 확장한다.
참고: 오류의 성공적인 측정을 우선하기 위해 무조건 기여는 마지막에 온다.
-
allUnmergedContributions를 반환한다.
PAHistogramContribution
contribution은 다음 튜플인 병합
키를 가진다: (contribution의 bucket,
contribution의 filteringId).
참고: 같은 보고서에 대한 두 PAHistogramContribution는
같은 병합 키를 가질 때 그리고 그때에만 병합될 수 있다.
PAHistogramContribution들의
리스트
contributions, 출처 origin, 컨텍스트 유형 api 및 순간 currentTime
및 불리언
consumeIfPermitted가 주어졌을 때 예산 쿼리는
다음 단계를 수행한다. 이들은 contributions와 같은 크기를 가진
불리언들의
리스트를 반환한다.
-
approvedValueSum을 0으로 둔다.
-
contributions의 각 contribution에 대해 반복한다:
-
valueToRequest를 approvedValueSum + contribution의
value로 둔다.참고: 이는 각 기여에 대한 결과가 이 호출에서 이전에 승인된 기여를 고려하도록 보장한다 (consumeIfPermitted가 false인 경우에도).
-
sufficientBudget을 valueToRequest, origin, api 및 currentTime이 주어졌을 때 구현 정의 알고리즘에 의해 결정되는 불리언으로 둔다. 이 알고리즘은 시간에 따른 사용량으로 예산을 제한해야 한다. 예를 들어 지난 24시간 동안의 기여 합계가 있다.
-
sufficientBudget이면, contribution의
value를 approvedValueSum에 더한다. -
sufficientBudget를 resultForEachContribution에 추가한다.
참고: 반환값의 i번째 요소는 contributions[i]의
value를 보내기에 충분한 예산이 남아 있는지 여부를 나타낸다.
-
-
consumeIfPermitted이면, approvedValueSum, origin, api 및 currentTime이 주어졌을 때 구현 정의 알고리즘을 사용하여 예산을 소비한다.
-
resultForEachContribution를 반환한다.
-
wasTriggered이면, errorEvent를 pendingContributions의 트리거된 오류 이벤트에 추가한다.
PAHistogramContribution들의
리스트
contributions, 디버그
세부 정보 debugDetails, 집계 코디네이터 aggregationCoordinator,
사전 지정 보고서 매개변수
preSpecifiedParams, 순간 또는 null timeout 및 순간
currentTime가 주어졌을 때
집계 가능
보고서 획득은 다음 단계를 수행한다. 이들은 집계 가능 보고서를 반환한다.
-
Assert: reportingOrigin은 잠재적으로 신뢰할 수 있는 출처이다.
-
reportTime을 currentTime 및 timeout이 주어졌을 때 보고서 전달 시간 획득을 실행한 결과로 둔다.
-
report를 다음 항목을 가진 새 집계 가능 보고서로 둔다:
- 보고 출처
-
reportingOrigin
- 원래 보고 시간
-
reportTime
- 보고 시간
-
reportTime
- 기여
-
contributions
- api
-
api
- 보고서 ID
-
무작위 UUID 생성의 결과.
- 디버그 세부 정보
-
debugDetails
- 집계 코디네이터
-
aggregationCoordinator
- 컨텍스트 ID
-
preSpecifiedParams의 컨텍스트 ID
- 필터링 ID 최대 바이트
-
preSpecifiedParams의 필터링 ID 최대 바이트
- max contributions
-
api 및 preSpecifiedParams의 max contributions로 max contributions 결정을 수행한 결과.
- 큐에 들어감
-
false
-
report를 반환한다.
-
timeout이 null이 아니면:
-
timeout을 반환한다.
-
-
자동화 로컬 테스트 모드 활성화됨이 true이면, currentTime을 반환한다.
-
r을 0(포함)과 1(제외) 사이의 균등 확률을 가진 무작위 double로 둔다.
-
maxContributions가 null이면, API별 기본 maxContributions[api]를 반환한다.
-
maxContributions가 최대 maxContributions보다 크면, 최대 maxContributions를 반환한다.
-
maxContributions를 반환한다.
9.3. 보고서 전송
참고: 이 절은 필요한 대로 수정하면서 Attribution Reporting API 명세에서 대부분 복사한 것이다.
여기에서 queue a task 알고리즘을 사용해야 하는가?
사용자 에이전트는 자신의 집계 가능 보고서 캐시가 주어졌을 때 주기적으로 보고서를 전송하기 위해 큐에 넣기 시도를 수행해야 한다.
-
reports의 각 report에 대해, 다음 단계를 병렬로 실행한다:
-
다음 단계를 실행하되, 사용자 에이전트가 종료될 때 중단한다:
-
report의 queued 값이 true이면 반환한다.
-
report의 queued 값을 true로 설정한다.
-
currentWallTime을 현재 벽시계 시간으로 둔다.
-
report의 보고 시간이 currentWallTime보다 이전이면, report의 보고 시간을 currentWallTime에 구현 정의 무작위의 음이 아닌 기간을 더한 값으로 설정한다.
참고: 시작 시 브라우저가 닫혀 있는 동안 보고 시간이 지난 많은 보고서를 사용자 에이전트가 보내야 할 수 있다. 무작위 지연을 추가하면 보고서의 시간적 결합을 방지한다.
-
선택적으로, 추가 구현 정의 음이 아닌 기간을 더 기다린다.
참고: 이는 사용자 에이전트가 장치 리소스 사용량을 최적화하고, 사용자 에이전트가 온라인 상태가 될 때까지 기다릴 수 있게 하기 위한 것이다.
-
report로 보고서 전달 시도를 실행한다.
-
-
중단된 경우, report의 queued 값을 false로 설정한다.
참고: 이 단계는 사용자 에이전트가 다음에 시작될 때 수행하는 것이 더 실용적일 수 있다.
-
-
url을 report의 보고 출처 및 report의 api가 주어졌을 때 보고 엔드포인트 획득의 결과로 둔다.
-
data를 report가 주어졌을 때 집계 가능 보고서 직렬화의 결과로 둔다.
-
data가 오류이면, report를 집계 가능 보고서 캐시에서 제거한다.
-
request를 url 및 data가 주어졌을 때 보고 요청 생성의 결과로 둔다.
-
request에 대해 fetch를 수행하도록 task를 큐에 넣는다. processResponse는 다음 단계이다:
-
Assert: reportingOrigin은 잠재적으로 신뢰할 수 있는 출처이다.
-
path를 «"
.well-known/private-aggregation/report-", api»의 연결로 둔다.이 well-known 디렉터리를 등록한다. [Issue #67]
-
Assert: base는 failure가 아니다.
-
result를 base와 함께 path에 대해 URL 파서를 실행한 결과로 둔다.
-
Assert: result는 failure가 아니다.
-
result를 반환한다.
-
request를 다음 속성을 가진 새 요청으로 둔다:
- method
-
"
POST" - URL
-
url
- 헤더 리스트
-
«("
Content-Type", "application/json")» - unsafe-request flag
-
설정됨
- body
-
body
- client
-
null - service-workers mode
-
"
none" - initiator
-
""
- referrer
-
"
no-referrer" - mode
-
"
cors" - credentials mode
-
"
omit" - cache mode
-
"
no-store"
-
request를 반환한다.
9.4. 보고서 직렬화
참고: 이 절은 필요한 대로 수정하면서 Attribution Reporting API 명세에서 대부분 복사한 것이다.
-
aggregationServicePayloads를 report가 주어졌을 때 집계 서비스 페이로드 획득의 결과로 둔다.
-
aggregationServicePayloads가 오류이면, aggregationServicePayloads를 반환한다.
-
data를 다음 키/값 쌍의 순서 있는 맵으로 둔다:
- "
aggregation_coordinator_origin" - "
aggregation_service_payloads" -
aggregationServicePayloads
- "
shared_info" -
report가 주어졌을 때 보고서의 공유 정보 획득의 결과.
- "
-
debugKey가 null이 아니면, data["
debug_key"]를 debugKey로 설정한다. -
contextId를 report의 컨텍스트 ID로 둔다.
-
contextId가 null이 아니면, data["
context_id"]를 contextId로 설정한다. -
data에 대해 infra 값을 JSON 바이트로 직렬화를 실행한 결과인 바이트 시퀀스를 반환한다.
-
publicKeyTuple을 report의 집계 코디네이터가 주어졌을 때 암호화를 위한 공개 키 획득의 결과로 둔다.
-
publicKeyTuple이 오류이면, publicKeyTuple을 반환한다.
-
(pkR, keyId)를 publicKeyTuple으로 둔다.
-
plaintextPayload를 report가 주어졌을 때 평문 페이로드 획득의 결과로 둔다.
-
sharedInfo를 report가 주어졌을 때 보고서의 공유 정보 획득의 결과로 둔다.
-
encryptedPayload를 plaintextPayload, pkR 및 sharedInfo가 주어졌을 때 페이로드 암호화의 결과로 둔다.
-
encryptedPayload가 오류이면, encryptedPayload를 반환한다.
-
aggregationServicePayloads를 새 리스트로 둔다.
-
aggregationServicePayload를 다음 키/값 쌍의 순서 있는 맵으로 둔다:
- "
key_id" -
keyId
- "
payload" -
encryptedPayload, base64 인코딩됨
- "
-
report의 디버그 세부 정보의 활성화됨 필드가 true이면:
-
aggregationServicePayload[
debug_cleartext_payload]를 plaintextPayload로 설정하며, base64 인코딩됨.
-
-
aggregationServicePayload를 aggregationServicePayloads에 추가한다.
-
aggregationServicePayloads를 반환한다.
-
url을 새 URL 레코드로 둔다.
-
url의 경로를 «"
.well-known", "aggregation-service", "v1", "public-keys"»로 설정한다. -
url에서 가져온 공개 키와 그 공개 키를 고유하게 식별해야 하는 문자열로 구성된 구현 정의 튜플을 반환하거나, 사용자 에이전트가 url에서 공개 키를 획득하지 못한 경우 오류를 반환한다. 이 단계는 비동기일 수 있다.
이를 fetch 관점에서 지정한다. 사용할 암호화 표준, 길이 요구사항 등에 대한 세부 정보를 추가한다.
참고: 사용자 에이전트는 정기적인 키 교체를 강제하는 것이 권장된다. 여러 키가 있으면, 사용자 에이전트는 각 암호화 작업마다 독립적으로 균등 무작위로 키를 선택할 수 있다.
-
payloadData를 새 리스트로 둔다.
-
contributions를 report의 기여로 둔다.
-
maxContributions를 report의 max contributions로 둔다.
-
contributions의 크기가 maxContributions보다 작은 동안 반복한다:
-
nullContribution을 다음 항목을 가진 새
PAHistogramContribution으로 둔다:bucket-
0
value-
0
filteringId-
0
-
nullContribution를 contributions에 추가한다.
참고: 이 패딩은 암호화된 페이로드 크기를 통해 기여 수가 유출되는 것을 방지한다. 아래 논의를 보라.
-
-
report의 기여의 각 contribution에 대해 반복한다:
-
filteringIdMaxBytes를 report의 filtering id max bytes로 둔다.
-
Assert: contribution["
filteringId"]는 0부터 256filteringIdMaxBytes까지의 범위(끝 제외)에 포함된다. -
contributionData를 다음 키/값 쌍의 순서 있는 맵으로 둔다:
- "
bucket" -
contribution["
bucket"] 및 16이 주어졌을 때 페이로드용 정수 인코딩의 결과. - "
value" -
contribution["
value"] 및 4가 주어졌을 때 페이로드용 정수 인코딩의 결과. - "
id" -
contribution["
filteringId"] 및 filteringIdMaxBytes가 주어졌을 때 페이로드용 정수 인코딩의 결과.
- "
-
contributionData를 payloadData에 추가한다.
-
-
payload를 다음 키/값 쌍의 순서 있는 맵으로 둔다:
- "
data" -
payloadData
- "
operation" -
"
histogram"
- "
-
info를 « "
aggregation_service", sharedInfo »의 연결을 UTF-8 인코딩한 결과로 둔다. -
(kem_id, kdf_id, aead_id)를 (0x0020, 0x0001, 0x0003)으로 둔다.
참고: 위의 ciphersuite 삼중항은 HPKE 알고리즘 식별자로 구성되며, KEM을 DHKEM(X25519, HKDF-SHA256)로, KDF 함수를 HKDF-SHA256으로, AEAD 함수를 ChaCha20Poly1305로 지정한다.
-
(enc, hpkeContext)를 공개 키 pkR, 애플리케이션 제공 정보 info, KEM kem_id, KDF kdf_id, 및 AEAD aead_id로
SetupBaseS()를 호출하여 HPKE 송신자 컨텍스트를 설정한 결과로 둔다. 이 작업이 실패하면 오류를 반환한다.참고: 명확성을 위해, RFC9180이 의사 코드에서 매개변수를 생략하더라도 위에서 KEM, KDF, AEAD 식별자를
SetupBaseS()에 명시적으로 전달했다. -
aad를 `` (빈 바이트 시퀀스)로 둔다.
-
ciphertext를 추가 인증 데이터 aad와 평문 plaintextPayload로 hpkeContext 객체에 대해
ContextS.Seal()을 호출하여 페이로드를 봉인한 결과로 둔다. 이 작업이 실패하면 오류를 반환한다. -
encryptedPayload를 바이트 시퀀스 « enc, ciphertext »의 연결로 둔다.
참고: 선택한 KEM이 생성한 캡슐화된 대칭 키 enc의 길이는 RFC9180의 KEM IDs 표에 표시된 것처럼 정확히 32바이트이다.
-
바이트 시퀀스 encryptedPayload를 반환한다.
-
scheduledReportTime을 UNIX epoch부터 report의 원래 보고 시간까지의 기간으로 둔다.
-
sharedInfo를 다음 키/값 쌍의 순서 있는 맵으로 둔다:
-
sharedInfo가 주어졌을 때 infra 값을 JSON 문자열로 직렬화한 결과를 반환한다.
10. 사용자 에이전트 자동화
사용자 에이전트는 자동화 로컬 테스트 모드 활성화됨 불리언을 보유한다(기본값 false).
사용자 에이전트 자동화와 웹사이트 테스트를 위해, 이 문서는 API 구성을 제어하기 위한 아래의 [WebDriver] 확장 명령을 정의한다.
10.1. 로컬 테스트 모드 설정
| HTTP 메서드 | URI 템플릿 |
|---|---|
| POST | /session/{session id}/private-aggregation/localtestingmode
|
-
parameters가 JSON 형식 Object가 아니면, invalid argument 오류 코드를 가진 WebDriver 오류를 반환한다.
-
enabled를 parameters에서
"enabled"라는 이름의 속성 가져오기의 결과로 둔다. -
enabled가
undefined이거나 불리언이 아니면, invalid argument 오류 코드를 가진 WebDriver 오류를 반환한다. -
자동화 로컬 테스트 모드 활성화됨을 enabled로 설정한다.
-
데이터
null과 함께 success를 반환한다.
참고: 이것이 없으면 집계 가능 보고서가 지연 대상이 되어 테스트가 어려워진다.
11. 개인정보 보호 고려사항
이 절은 비규범적이다.
11.1. 크로스 사이트 정보 공개
이 API는 크로스 사이트 데이터에 접근할 수 있는 격리된 컨텍스트(즉, Shared Storage worklet/Protected Audience script runner)가 네트워크를 통해 집계 가능 보고서를 보낼 수 있게 한다.
집계 가능 보고서는 키-값 쌍(즉, 히스토그램에 대한 기여)의 형태로 암호화된 고엔트로피 크로스 사이트 정보를 포함한다. 기여에 포함된 정보는 임의적이지만 브라우징 기록 및 기타 크로스 사이트 활동 같은 것을 포함할 수 있다. 이 API는 이 정보가 한 사이트에서 다른 사이트로 전달되는 것을 방지하는 것을 목표로 한다.
11.1.1. 제한된 기여 처리
히스토그램 기여는 직접 노출되지 않는다. 대신 신뢰할 수 있는 집계 서비스에서만 처리될 수 있도록 암호화된다. 이 신뢰할 수 있는 집계 서비스는 각 키에 대해 보고서 전반의 값을 합산하고, 각 값에 노이즈를 추가하여 ‘요약 보고서’를 생성한다.
그 처리의 출력은 집계되고 노이즈가 추가된 히스토그램이 된다. 이 서비스는 어떤 보고서도 여러 번 처리될 수 없도록 보장한다. 또한, 정보 노출은 사용자 에이전트의 기여 예산으로 제한된다. 원칙적으로 이 프레임워크는 차등 개인정보 보호를 만족하는 노이즈 매개변수 지정을 지원할 수 있다.
11.1.2. 암호화되지 않은 메타데이터
이 보고서들은 크로스 사이트 데이터에 기반하지 않는 제한된 양의 메타데이터도 노출한다. 보고서 수신자는 보고서가 전송된 시간 또는 송신자의 IP 주소 같은 사이드 채널 정보도 관찰할 수 있다.
11.1.3. 보고서 수를 통한 유출로부터 보호
그러나 주어진 메타데이터를 가진 보고서의 수는 일부 크로스 사이트 정보를 노출할 수 있다. 이를 방지하기 위해, 이 API는 특정 이벤트에서 보고서가 전송되었는지 여부를 판별하기 어렵게 만들도록 무작위 시간만큼 보고서 전송을 지연한다. 컨텍스트 ID가 제공되거나, 기본값이 아닌 필터링 ID 최대 바이트가 지정되거나, 기본값이 아닌 max contributions가 지정되는 경우, 이 API는 전송되는 보고서 수를 결정론적으로 만든다(필요하면 'null reports'를 전송하며 — 각각 페이로드 안에 값이 0인 기여만 포함한다). 예를 들어 보고서 수에 노이즈를 추가하는 것 같은 추가 완화책도 향후 가능할 수 있다.
11.1.4. 페이로드 크기를 통한 유출로부터 보호
암호화된 페이로드의 길이는 평문 페이로드에 존재하는 기여 수라는 일부 크로스 사이트 정보를 추가로 노출할 수 있다. 이 사이드 채널을 제거하기 위해, Private Aggregation은 암호화 전에 페이로드가 미리 정해진 수의 기여를 포함하도록 보장하며, 목표에 맞추기 위해 null 기여로 잘라내거나 패딩할 수 있다.
max contributions가 null이 아니면, Private Aggregation은 이를 사용하여 목표 기여 수를 알린다. 그렇지 않으면 목표 수는 호출자의 컨텍스트 유형에 기반하여 API별 기본 maxContributions에서 가져온다.
11.1.5. 임시 디버깅 메커니즘
enableDebugMode()
메서드는 테스트와 통합을 쉽게 하기 위해 이 API의 많은 보호 장치를 우회할 수 있게 한다.
구체적으로, 디버그 모드가 활성화되면 페이로드의 내용, 즉 히스토그램 기여가
평문으로 드러난다. 선택적으로 보고서를 호출 컨텍스트와 연결하기 위해 디버그 키도
설정할 수 있다. 향후 이 메커니즘은 서드파티 쿠키를 설정할 자격이 있는 호출자에게만
제공될 것이다. 그 경우 API 호출자는 이미 크로스 사이트로 정보를 전달할 수 있는
능력을 가지고 있다.
enableDebugMode()를
서드파티 쿠키
자격과 연결한다. [Issue
#57]
11.1.6. 개인정보 보호 매개변수
이 API가 노출하는 정보의 양은 사용되는 개인정보 보호 매개변수(예: 기여 제한과 집계 서비스에서 사용되는 노이즈 분포)의 산물이다. 우리는 노출되는 정보의 양을 최소화하는 것을 목표로 하지만, 동시에 광범위한 사용 사례를 지원하는 것도 목표로 한다. 개인정보 보호 매개변수는 정보 노출과 유용성 사이의 절충에서 서로 다르고 진화하는 선택을 허용하기 위해 구현 정의로 남겨진다.
11.2. 사이트 데이터 지우기
집계 가능 보고서 캐시 및 예산 쿼리 알고리즘을 위해 저장된 모든 기여 이력 데이터는 사용자의 웹 활동에 대한 데이터를 포함한다. 따라서 이 데이터를 삭제하기 위한 사용자 제어 수단이 요구된다. 저장소 지우기를 보라.
반면에, 기여 캐시, 디버그 범위 맵 및 사전 지정 보고서 매개변수 맵은 특정 배치 범위와 디버그 범위에 묶인 단기 데이터만 포함하므로 제어 수단이 요구되지 않는다.
11.3. 보고 지연 관련 우려
API 호출 후 보고서 전송을 지연하면 일부 상황에서 사이드 채널 유출이 가능해질 수 있다.
11.3.1. 크로스 네트워크 보고 출처 유출
보고서는 브라우저가 한 네트워크에 연결된 동안 저장되었다가 브라우저가 다른 네트워크에 연결된 동안 전송될 수 있으며, 이로 인해 보고 출처의 크로스 네트워크 유출이 가능해질 수 있다.
예: 사용자가 자신의 홈 네트워크에서 특정 브라우징 프로필로 브라우저를 실행한다. 특정 보고 출처를 가진 집계 가능 보고서가 미래의 보고 시간으로 저장된다. 보고 시간에 도달한 뒤, 사용자는 고용주의 네트워크에서 같은 브라우징 프로필로 브라우저를 실행하고, 이때 브라우저는 보고서를 보고 출처로 전송한다. 보고서 자체가 HTTPS로 전송될 수는 있지만, 보고 출처는 DNS 또는 TLS client hello를 통해 네트워크 관리자에게 보일 수 있다(ECH로 완화할 수 있다). 일부 보고 출처는 민감한 사이트에서만 또는 주로 운영되는 것으로 알려져 있을 수 있으므로, 이는 사용자의 인지나 동의 없이 사용자 브라우징 활동에 대한 정보를 고용주에게 유출할 수 있다.
가능한 완화책은 다음과 같다:
-
브라우저가 같은 네트워크에서 해당 출처에 이미 요청을 한 경우에만 주어진 보고 출처의 보고서를 보낸다: 이는 네트워크 관리자가 Private Aggregation API에서 추가 정보를 얻는 것을 방지한다. 그러나 보고서 손실과 보고서 지연을 증가시켜, 보고 출처에 대한 API의 유용성을 낮춘다. 또한 출처가 보고서를 해제할 수 있게 한 사용자의 요청과 보고서를 더 잘 연결할 수 있으므로 타이밍 공격의 효과를 높일 수도 있다.
-
보고서를 즉시 보낸다: 이는 보고서가 서로 다른 네트워크에서 저장되고 전송될 가능성을 줄인다. 그러나 보고 출처가 원래 API 호출과 보고서 전송을 상관시킬 가능성을 높여, API의 개인정보 보호 제어를 약화시킨다. 보고서 수를 통한 유출로부터 보호를 보라.
-
신뢰할 수 있는 프록시 서버를 사용하여 보고서를 보낸다: 이는 사실상 보고 출처를 보고서 본문 안으로 이동시키므로, 네트워크 관리자에게는 프록시 서버만 보이게 된다.
-
DNS over HTTPS를 요구한다: 이는 사실상 보고 출처를 네트워크 관리자에게 숨기지만, 강제하기에는 실용적이지 않을 가능성이 높고, 예를 들어 IP 주소를 대신 모니터링하는 방식으로 네트워크 관리자에게 우회될 수도 있다.
11.3.2. 사용자 존재 추적
브라우저는 실행 중이고 인터넷 연결이 있을 때만 보고서 전송을 시도하므로 (연결 상태에 대한 명시적 확인이 없더라도, 연결이 없다면 보고서는 자연스럽게 전송에 실패한다), 원래 보고 시간에 집계 가능 보고서가 (직렬화된) 수신되거나 수신되지 않는 것은 사용자의 존재에 대한 정보를 유출한다. 또한 보고 요청은 본질적으로 IP 주소를 포함하므로, 이는 집/직장 여부 또는 대략적인 실제 지리적 위치를 포함하여 사용자의 IP 유래 위치를 보고 출처에 드러내거나, 사용자의 브라우징 활동 패턴을 드러낼 수 있다.
가능한 완화책은 다음과 같다:
-
보고서를 즉시 보낸다: 이는 원래 보고 출처로 이루어진 요청이 보고 요청과 시간적으로 매우 가까우므로 존재 추적을 사실상 제거한다. 그러나 보고 출처가 원래 API 호출과 보고서 전송을 상관시킬 가능성을 높여, API의 개인정보 보호 제어를 약화시킨다. 보고서 수를 통한 유출로부터 보호를 보라.
-
보고서를 신뢰할 수 있는 프록시 서버로 즉시 보내고, 그 프록시 서버가 자체적으로 추가 지연을 적용한다: 이는 사용자의 IP 주소와 온라인-오프라인 존재를 보고 출처로부터 사실상 숨긴다.
12. 보안 고려사항
이 절은 비규범적이다.
12.1. 동일 출처 정책
집계 가능 보고서 캐시, 기여 캐시, 디버그 범위 맵 및 사전 지정 보고서 매개변수 맵에 대한 쓰기는 보고 출처에 귀속되며, 주어진 보고 출처를 가진 모든 보고서에 포함된 데이터는 그 출처의 데이터만으로 생성된다.
주목할 만한 한 가지 예외는 예산 쿼리 알고리즘이다. 이는 구현 정의이며 다른 출처의 기여 이력을 고려할 수 있다. 예를 들어, 알고리즘은 특정 사이트의 모든 이력을 고려할 수 있다. 이는 여러 출처가 API의 동작에 영향을 줄 수 있으므로 동일 출처 정책의 명시적 완화가 된다. 이런 종류의 공유 제한에서 특히 위험한 점은 서비스 거부 공격의 도입이다. 여기서 출처 그룹이 공모하여 사용 가능한 모든 예산을 의도적으로 소비함으로써 이후 출처가 API에 접근하지 못하게 할 수 있다. 이는 보안을 개인정보 보호와 맞바꾸는 것으로, 그 제한은 많은 출처가 함께 공모하여 개인정보를 침해하는 효과를 줄이기 위해 존재한다. 그러나 제한되는 출처 집합이 모두 same site라면 이 보안 위험은 줄어든다. 사용자 에이전트는 예산 쿼리 알고리즘을 선택할 때 이러한 절충을 고려해야 한다.
12.2. 히스토그램 기여 보호
위에서 논의한 것처럼, 히스토그램 기여의 처리는 개인정보 보호를 위해 제한된다. 이 제한은 신뢰할 수 있는 집계 서비스만이 암호화되지 않은 히스토그램 기여에 접근할 수 있다는 점에 의존한다.
이를 보장하기 위해, 이 API는 현대적인 암호화 명세인 HPKE를 사용한다. 또한 각 사용자 에이전트는 집계 서비스가 정기적으로 키를 교체하도록 요구하는 것이 권장된다. 이는 같은 키로 암호화되는 데이터의 양을 제한하고, 따라서 키가 손상되는 경우 취약한 데이터의 양을 제한한다.
여기에 지정되어 있지는 않지만, 각 사용자 에이전트는 암호화를 위한 공개 키 획득이 공개 키를 반환하도록 허용하기 전에 모든 집계 서비스 설계의 보안을 고려할 것이 강력히 권장된다.