왜 필요한가?

기존 User-Agent 문자열:

Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/123.0.6312.58 Safari/537.36
  1. 프라이버시 - OS 버전, CPU, 브라우저 정확한 버전이 매 요청마다 노출되어 fingerprinting에 쓰인다.
  2. 파싱의 고통 - Mozilla/5.0, KHTML, like Gecko 등 의미 없는 레거시 토큰이 가득하다.

Chrome은 이 문자열을 점진적으로 축소(User-Agent Reduction)하고, 대신 User-Agent Client Hints(UA-CH) 를 도입했다.

서버가 필요한 정보만 명시적으로 요청하고, 브라우저가 허락한 정보만 응답한다.


Low-Entropy vs High-Entropy

UA-CH 정보는 두 가지로 구분된다. Low-entropy 힌트(Sec-CH-UA, Sec-CH-UA-Mobile, Sec-CH-UA-Platform)는 매 요청에 자동으로 포함되며, 브라우저 브랜드·메이저 버전·OS 이름·모바일 여부 정도만 담는다. High-entropy 힌트는 OS 세부 버전, CPU 아키텍처, 기기 모델 등 식별력이 높은 정보로, 서버가 Accept-CH 헤더로 명시적으로 요청하거나 클라이언트가 getHighEntropyValues()를 직접 호출해야 받을 수 있다.


Prebid.js는 Client Hints를 어떻게 처리할까?

광고 네트워크는 기기 타겟팅, 부정 트래픽 탐지를 위해 UA 정보에 의존한다. User-Agent 축소에 대응하여 OpenRTB 2.6은 device.sua (Structured User Agent)를 도입했고, Prebid.js가 이를 구현한다.

OpenRTB 2.6의 device.sua

{
  "device": {
    "ua": "Mozilla/5.0 ...",
    "sua": {
      "browsers": [
        { "brand": "Google Chrome", "version": ["123", "0", "6312", "58"] },
        { "brand": "Chromium", "version": ["123", "0", "6312", "58"] }
      ],
      "platform": { "brand": "macOS", "version": ["14", "4"] },
      "mobile": 0,
      "architecture": "arm",
      "bitness": "64",
      "model": "",
      "source": 2
    }
  }
}

UA-CH와 SUA 필드 매핑:

SUA 필드UA-CH 소스설명
browsersSec-CH-UA-Full-Version-List브라우저 브랜드 + 정확한 버전
platform.brandSec-CH-UA-PlatformOS 이름
platform.versionSec-CH-UA-Platform-VersionOS 버전
mobileSec-CH-UA-Mobile모바일 여부 (0 또는 1)
architectureSec-CH-UA-ArchCPU 아키텍처
bitnessSec-CH-UA-Bitness32/64비트
modelSec-CH-UA-Model기기 모델명
source-데이터 출처 (아래 참고)

source 값: 0 알 수 없음 / 1 low-entropy만 사용 / 2 high-entropy 사용 / 3 UA 문자열 파싱

스펙 권장사항: sua가 존재하면 비더는 ua(문자열) 대신 sua를 우선 사용해야 한다.

Prebid.js 설정

퍼블리셔가 할 일은 uaHints 설정 하나뿐이다.

pbjs.setConfig({
  firstPartyData: {
    uaHints: [
      "architecture",
      "model",
      "platform",
      "platformVersion",
      "fullVersionList",
    ],
  },
});

Prebid.js가 내부적으로 getHighEntropyValues()를 호출하고, device.sua 형식으로 변환하여 모든 비더에게 전달한다. uaHints를 설정하지 않으면 low-entropy만 수집된다.

Prebid.js는 클라이언트 JS에서 직접 수집하여 입찰 요청 본문에 넣으므로, Accept-CHDelegate-CH 서버 헤더 설정이 필요 없다.

비더 어댑터에서 sua 읽기

buildRequests: function(validBidRequests, bidderRequest) {
  const sua = bidderRequest.ortb2.device?.sua;
  return {
    method: "POST",
    url: ENDPOINT,
    data: { device: { ua: bidderRequest.ortb2.device?.ua, sua } },
  };
};

브라우저 지원 현황

브라우저지원
Chrome 89+O
Edge 89+O
Opera 75+O
Samsung InternetO
FirefoxX
SafariX

Firefox와 Safari는 UA 문자열을 축소하는 자체 방식을 택했지만, UA-CH 같은 대체 API는 제공하지 않고 있다.


핵심 요약

  1. Chromium 전용 - Firefox, Safari는 UA-CH를 구현하지 않는다. 이 두 브라우저에서는 기존 UA 문자열 파싱에 의존해야 한다.
  2. 광고 시스템은 device.sua로 대응 - OpenRTB 2.6의 sua 필드가 축소된 UA 문자열을 대체한다. 비더는 ua보다 sua를 우선 사용해야 한다.
  3. Prebid.js에서는 uaHints 설정 하나 - 퍼블리셔가 uaHints 배열을 설정하면 Prebid.js가 high-entropy 수집과 device.sua 변환을 모두 처리한다. 서버 헤더 설정은 불필요하다.

참고자료