신뢰 토큰 시작하기

신뢰 토큰은 웹사이트가 한 탐색 컨텍스트에서 다른 컨텍스트로 (예: 사이트 전반에서) 제한된 양의 정보를 전달하여 수동적인 추적 없이 사기를 방지할 수 있도록 하는 새로운 API입니다.



요약

신뢰 토큰을 사용하면 출처에서 신뢰할 수 있는 사용자에게 암호화 토큰을 발급할 수 있습니다. 토큰은 사용자의 브라우저에 의해 저장됩니다. 그러면 브라우저가 다른 컨텍스트의 토큰을 사용하여 사용자의 진위성을 평가할 수 있습니다.

Trust Token API를 사용하면 사용자를 식별하거나 두 ID를 연결하지 않고도 한 컨텍스트에 있는 사용자의 신뢰가 다른 컨텍스트로 전달될 수 있습니다.

Chrome DevTools 네트워크애플리케이션 탭에서 데모검사 토큰을 사용하여 API를 사용해 볼 수 있습니다.

Chrome DevTools Network 탭의 신뢰 토큰을 보여주는 스크린샷
Chrome DevTools 네트워크 탭의 신뢰 토큰
Chrome DevTools Application 탭의 Trust Tokens를 보여주는 스크린샷
Chrome DevTools 애플리케이션 탭의 신뢰 토큰

신뢰 토큰이 필요한 이유

웹은 사용자가 실제 사람 또는 서비스를 속이는 봇이나 악의적인 서드 파티가 아닌 실제 사용자임을 보여주는 신뢰 신호를 설정할 방법이 필요합니다. 사기 방지는 광고주, 광고 제공업체, CDN에 특히 중요합니다.

안타깝게도 신뢰성을 측정하고 전파하는 기존 메커니즘(예: 사이트와의 상호작용이 실제 사람에게서 발생한 것인지 확인하는 방법)은 디지털 지문 수집에도 사용할 수 있는 기술을 활용합니다.

API는 개인 정보를 보호하여 개별 사용자를 추적하지 않고도 사이트 간에 신뢰가 전파될 수 있도록 해야 합니다.

신뢰 토큰 제안에는 어떤 내용이 포함되어 있나요?

웹은 사기 및 스팸을 감지하기 위해 신뢰 신호를 구축합니다. 이를 위한 한 가지 방법은 전역 크로스 사이트 사용자별 식별자로 탐색을 추적하는 것입니다. 이는 개인 정보 보호 API의 경우에는 허용되지 않습니다.

제안서 설명 내용:

이 API는 서드 파티 컨텍스트에서 액세스할 수 있는 '개인 정보 보호 패스' 스타일 암호화 토큰을 위한 새로운 출처별 저장소 영역을 제안합니다. 이러한 토큰은 맞춤설정되지 않으며 사용자를 추적하는 데 사용할 수 없지만 암호화 서명되어 있으므로 위조할 수 없습니다.

출처가 사용자를 신뢰하는 맥락인 경우 브라우저에 토큰 배치를 발행할 수 있습니다. 이 토큰은 나중에 사용자를 알 수 없거나 신뢰도가 낮은 상황에서 '지출'될 수 있습니다. 결정적으로 토큰은 서로를 구분할 수 없으므로 웹사이트에서 이를 통해 사용자를 추적할 수 없습니다.

Google은 브라우저에서 특정 토큰 사용에 바인딩된 키를 사용하여 발신 요청에 서명할 수 있는 확장 메커니즘을 제안합니다.

샘플 API 사용

다음은 API 설명의 샘플 코드에서 수정한 것입니다.

사용자가 서드 파티 광고 네트워크 (foo.example)의 광고가 삽입된 뉴스 웹사이트 (publisher.example)를 방문한다고 가정해 보겠습니다. 이 사용자는 이전에 신뢰 토큰 (issuer.example)을 발급하는 소셜 미디어 사이트를 사용했습니다.

아래 순서는 신뢰 토큰의 작동 방식을 보여줍니다.

1.사용자가 issuer.example을 방문하여 계정 활동이나 보안문자 인증 질문 통과와 같이 사이트에서 실제 사람이라고 믿도록 유도하는 작업을 실행합니다.

2.issuer.example는 사용자가 사람인지 확인하고 다음 JavaScript를 실행하여 사용자의 브라우저에 신뢰 토큰을 발급합니다.

fetch('https://issuer.example/trust-token', {
  trustToken: {
    type: 'token-request',
    issuer: 'https://issuer.example'
  }
}).then(...)

3.사용자의 브라우저는 신뢰 토큰을 저장하여 issuer.example와 연결합니다.

4.잠시 후에 사용자가 publisher.example을(를) 방문합니다.

5.publisher.example에서는 사용자가 실제 사람인지 알고 싶어 합니다. publisher.exampleissuer.example을 신뢰하므로 사용자의 브라우저에 이 출처의 유효한 토큰이 있는지 확인합니다.

document.hasTrustToken('https://issuer.example');

6.true로 확인되는 프로미스가 반환되면 사용자가 issuer.example의 토큰을 가지고 있으므로 publisher.example에서 토큰 사용을 시도할 수 있습니다.

fetch('https://issuer.example/trust-token', {
trustToken: {
  type: 'token-redemption',
  issuer: 'https://issuer.example',
  refreshPolicy: {none, refresh}
}
}).then(...)

이 코드를 사용하면 다음 작업을 수행할 수 있습니다.

  1. 코드를 사용하는 사용자 publisher.example님이 사용을 요청합니다.
  2. 사용에 성공하면 발급기관 issuer.example에서 특정 시점에 이 브라우저에 유효한 토큰을 발급했음을 나타내는 사용 기록을 반환합니다.

    7.fetch()에서 반환한 프로미스가 해결되면 후속 리소스 요청에서 사용 레코드를 사용할 수 있습니다.

fetch('https://foo.example/get-content', {
  trustToken: {
    type: 'send-redemption-record',
    issuers: ['https://issuer.example', ...]
  }
});

이 코드를 사용하면 다음 작업을 수행할 수 있습니다.

  1. 사용 레코드는 요청 헤더 Sec-Redemption-Record로 포함됩니다.
  2. foo.example는 사용 레코드를 수신하고 레코드를 파싱하여 issuer.example에서 이 사용자가 사람이라고 생각했는지 확인할 수 있습니다.
  3. foo.example에서 적절하게 응답합니다.
웹사이트에서 나를 신뢰할 수 있는지 판단하는 방법은 무엇인가요?

전자상거래 사이트의 쇼핑 기록, 위치 플랫폼에서의 체크인 또는 은행 계좌 기록이 있을 수 있습니다. 또한 발급기관은 계정 보유 기간이나 실제 사람일 가능성에 대한 발급기관의 신뢰를 높이는 기타 상호작용 (예: 보안문자 또는 양식 제출)과 같은 다른 요소를 살펴볼 수도 있습니다.

신뢰 토큰 발급

issuer.example와 같은 신뢰 토큰 발급기관에서 사용자를 신뢰할 수 있다고 간주하면 발급기관은 trustToken 매개변수로 fetch() 요청을 실행하여 사용자의 신뢰 토큰을 가져올 수 있습니다.

fetch('issuer.example/trust-token', {
  trustToken: {
    type: 'token-request'
  }
}).then(...)

그러면 새 암호화 프리미티브를 사용하여 개인 정보 보호 패스 발급 프로토콜의 확장이 호출됩니다.

  1. nonce라고 하는 의사 난수 집합을 생성합니다.

  2. nonce를 블라인드하고 (발급기관이 콘텐츠를 볼 수 없도록 인코딩) Sec-Trust-Token 헤더의 요청에 연결합니다.

  3. 제공된 엔드포인트에 POST 요청을 전송합니다.

엔드포인트가 블라인드 토큰(블라인드 nonce의 서명)으로 응답하면 토큰은 블라인드가 해제되고 브라우저에서 연결된 nonce와 함께 신뢰 토큰으로 내부적으로 저장됩니다.

신뢰 토큰 사용

게시자 사이트 (예: 위 예의 publisher.example)는 사용자에게 신뢰 토큰이 있는지 확인할 수 있습니다.

const userHasTokens = await document.hasTrustToken('issuer.example/trust-token');

사용 가능한 토큰이 있는 경우 게시자 사이트에서는 토큰을 사용하여 사용 기록을 얻을 수 있습니다.

fetch('issuer.example/trust-token', {
  ...
  trustToken: {
    type: 'token-redemption',
    refreshPolicy: 'none'
  }
  ...
}).then(...)

게시자는 다음과 같이 fetch() 호출을 사용하여 신뢰 토큰이 필요한 요청(예: 댓글 게시, 페이지에 좋아요 표시, 설문조사에서 투표)에 사용 기록을 포함할 수 있습니다.

fetch('https://foo.example/post-comment', {
  ...
  trustToken: {
    type: 'send-redemption-record',
    issuers: ['issuer.example/trust-token', ...]
  }
  ...
}).then(...);

사용 레코드는 Sec-Redemption-Record 요청 헤더로 포함됩니다.

개인정보 보호 고려사항

토큰은 '연결할 수 없도록' 설계되었습니다. 발급기관은 사용자가 방문하는 사이트에 관한 집계 정보를 학습할 수 있지만 발급과 사용을 연결할 수는 없습니다. 사용자가 토큰을 사용할 때 발급기관은 토큰을 자신이 생성한 다른 토큰과 구별할 수 없습니다. 하지만 신뢰 토큰은 현재 외부와 단절된 상태로 존재하지 않습니다. 이론상으로는 발급기관이 서드 파티 쿠키나 은밀한 추적 기술 등 여러 사이트에서 사용자의 ID에 참여할 수 있는 다른 방법이 존재합니다. 사이트에서 지원을 계획할 때 이러한 생태계 전환을 이해하는 것이 중요합니다. 이는 많은 개인 정보 보호 샌드박스 API의 일반적인 전환 과정이므로 여기서 더 자세히 다루지 않습니다.

보안 고려사항

신뢰 토큰 소진: 악성 사이트에서 사용자가 특정 발급기관에서 제공한 토큰을 의도적으로 소진시킬 수 있습니다. 이러한 종류의 공격을 완화할 수 있는 몇 가지 방법이 있습니다. 예를 들어 발급기관이 한 번에 여러 토큰을 제공하도록 하여 사용자는 브라우저에서 최상위 페이지 조회당 하나의 토큰만 사용할 수 있도록 충분히 공급합니다.

이중 지출 방지: 멀웨어가 사용자의 모든 신뢰 토큰에 액세스하려고 시도할 수 있습니다. 하지만 모든 패스 사용이 동일한 토큰 발급기관으로 전송되어 각 토큰이 한 번만 사용되었음을 확인할 수 있으므로 시간이 지남에 따라 토큰이 소진됩니다. 위험을 완화하기 위해 발급기관에서 더 적은 수의 토큰에 서명할 수도 있습니다.

요청 메커니즘

내비게이션 요청과 같이 fetch() 외부로 사용 기록을 전송하도록 허용할 수 있습니다. 사이트에서 페이지 로드와 동시에 토큰 사용을 사용 설정하기 위해 HTTP 응답 헤더에 발급기관 데이터를 포함할 수도 있습니다.

다시 말씀드리지만 이 제안서에는 여러분의 의견이 필요합니다. 의견이 있으면 신뢰 토큰 설명 저장소에서 문제를 생성하세요.

자세히 알아보기


이 게시물의 작성과 리뷰 작성에 도움을 주신 모든 분께 감사드립니다.

사진: ZSun Fu, Unsplash