왜 필요한가?
기존 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
- 프라이버시 - OS 버전, CPU, 브라우저 정확한 버전이 매 요청마다 노출되어 fingerprinting에 쓰인다.
- 파싱의 고통 -
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 소스 | 설명 |
|---|---|---|
browsers | Sec-CH-UA-Full-Version-List | 브라우저 브랜드 + 정확한 버전 |
platform.brand | Sec-CH-UA-Platform | OS 이름 |
platform.version | Sec-CH-UA-Platform-Version | OS 버전 |
mobile | Sec-CH-UA-Mobile | 모바일 여부 (0 또는 1) |
architecture | Sec-CH-UA-Arch | CPU 아키텍처 |
bitness | Sec-CH-UA-Bitness | 32/64비트 |
model | Sec-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-CH나 Delegate-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 Internet | O |
| Firefox | X |
| Safari | X |
Firefox와 Safari는 UA 문자열을 축소하는 자체 방식을 택했지만, UA-CH 같은 대체 API는 제공하지 않고 있다.
핵심 요약
- Chromium 전용 - Firefox, Safari는 UA-CH를 구현하지 않는다. 이 두 브라우저에서는 기존 UA 문자열 파싱에 의존해야 한다.
- 광고 시스템은
device.sua로 대응 - OpenRTB 2.6의sua필드가 축소된 UA 문자열을 대체한다. 비더는ua보다sua를 우선 사용해야 한다. - Prebid.js에서는
uaHints설정 하나 - 퍼블리셔가uaHints배열을 설정하면 Prebid.js가 high-entropy 수집과device.sua변환을 모두 처리한다. 서버 헤더 설정은 불필요하다.
참고자료
- Naver D2 - User-Agent Client Hints — UA-CH 도입 배경과 동작 원리에 대한 한국어 해설
- Chrome for Developers - User-Agent Client Hints — Chrome 공식 UA-CH 가이드
- MDN - User-Agent Client Hints API — Web API 레퍼런스