User-Agent 문자열과 Client Hints: 무엇이 드러나고 무엇이 고정되었나

User-Agent 문자열은 웹에서 가장 오래된 식별 신호이면서 최근 몇 년간 가장 크게 바뀐 신호입니다. 이를 제대로 읽으려면 지금도 무엇이 남아 있는지, 무엇이 의도적으로 고정되었는지, 제거된 세부 정보가 어디로 갔는지를 알아야 합니다.
문자열이 말해 주는 것
Windows의 현재 Chromium 문자열은 Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/154.0.0.0 Safari/537.36 같은 모양입니다. 역사적인 토큰(Mozilla/5.0, AppleWebKit, like Gecko, Safari)은 수십 년 전에 작성된 스크립트와의 호환성을 위해 남아 있을 뿐 아무 정보도 담고 있지 않습니다. 유용한 부분은 플랫폼(Windows 11에서도 Windows NT 10.0), 아키텍처, 브라우저의 메이저 버전입니다.
예전에 있던 정보는 의도적으로 제거되었습니다. 마이너 버전과 패치 버전은 이제 0.0.0입니다. Windows 버전은 10.0으로 고정됩니다. Android 문자열에는 더 이상 기기 모델이 들어 있지 않습니다. 이것이 Chromium이 2022년과 2023년 사이에 도입한 “User-Agent 축소”이며, 문자열이 핑거프린팅 표면이 되었기 때문에 이루어진 조치입니다.
Client Hints: 같은 데이터를 요청이 있을 때만
제거된 세부 정보는 사라진 것이 아니라 User-Agent Client Hints로 옮겨 갔습니다. 서버는 Accept-CH 헤더로 특정 필드를 요청할 수 있고, 그러면 브라우저가 이후 요청에서 Sec-CH-UA-Platform-Version이나 Sec-CH-UA-Model 같은 헤더를 보냅니다. 엔트로피가 낮은 힌트(브랜드와 메이저 버전, 플랫폼, 모바일 여부)는 기본으로 전송됩니다. 엔트로피가 높은 힌트(전체 버전, 아키텍처, 비트 수, 모델, 플랫폼 버전)는 요청한 사이트에만 전송되며, 스크립트는 navigator.userAgentData.getHighEntropyValues()를 통해 같은 집합을 요청할 수 있습니다.
설계 목표는 사이트가 원하는 것을 선언해야 하도록 하여 수집을 눈에 보이고 감사 가능하게 만드는 것입니다. 실제로는 핑거프린팅을 하려는 사이트가 여전히 모든 것을 요청할 수 있습니다. 달라진 점은 요청하는 행위가 브라우저가 보고, 기록하고, 거부할 수 있는 요청이라는 것입니다.
일관성 문제
같은 정보를 이제 두 곳에서 얻을 수 있으므로 서로 비교할 수 있습니다. macOS라고 주장하도록 User-Agent 문자열을 바꾸고서 navigator.userAgentData.platform은 Windows로 그대로 둔 브라우저는 쉽게 탐지되는 모순을 만든 것입니다. navigator.platform 속성, 페이지에 보이는 OS 고유의 글꼴, 하나의 운영체제에만 존재하는 그래픽 드라이버 이름을 담은 WebGL 렌더러 문자열도 마찬가지입니다. 문자열만 위조하는 것은 수년 전부터 실패하는 전략이었습니다.
내 값 읽어 보기
진단 도구는 원본 문자열, 거기서 파싱한 브라우저와 버전, 그리고 엔진(Blink, Gecko 또는 WebKit)을 보여 줍니다. iOS의 모든 브라우저는 브랜드와 상관없이 WebKit을 보고하는데, Apple이 그렇게 요구하기 때문입니다. 파싱된 브라우저 이름이 의외라면 확장 프로그램이나 프로필 설정이 문자열을 바꾸고 있는 것입니다. 그것이 문제인지는 나머지 브라우저가 그 변경에 동의하는지에 달려 있습니다.


