사용자 에이전트 (UA) 축소는 패시브 디지털 지문 수집에 사용될 수 있는 사용자 에이전트 문자열에서 공유되는 식별 정보의 양을 최소화합니다. 이제 이러한 변경사항이 정식 버전으로 출시되었으므로 모든 리소스 요청에 User-Agent 헤더가 줄어듭니다. 따라서 navigator.userAgent, navigator.appVersion, navigator.platform을 비롯한 특정 Navigator 인터페이스의 반환 값이 줄어듭니다.
웹 개발자는 사이트 코드에서 사용자 에이전트 문자열의 사용을 검토해야 합니다. 사이트에서 User-Agent 문자열을 파싱하여 기기 모델, 플랫폼 버전 또는 전체 브라우저 버전을 읽는 경우 User-Agent 클라이언트 힌트 API를 구현해야 합니다.
User-Agent Client Hints (UA-CH)
사용자 에이전트 클라이언트 힌트를 사용하면 전체 사용자 에이전트 데이터에 액세스할 수 있지만 서버가 특정 데이터에 대한 명시적 필요성을 적극적으로 선언하는 경우에만 가능합니다.
수동적으로 노출된 사용자 데이터를 삭제하면 요청 헤더, JavaScript API, 기타 메커니즘에 의해 의도적으로 노출되는 정보의 양을 더 잘 측정하고 줄일 수 있습니다.
축소된 UA 및 UA-CH가 필요한 이유는 무엇인가요?
이전에는 사용자 에이전트 문자열이 모든 HTTP 요청과 함께 사용자의 브라우저, 운영체제, 버전에 관한 대량의 데이터 문자열을 브로드캐스트했습니다. 이는 두 가지 이유로 문제가 되었습니다.
- 세부정보의 세부성과 풍부함으로 인해 사용자가 식별될 수 있습니다.
- 이 정보의 기본 가용성으로 인해 은밀한 추적이 발생할 수 있습니다.
UA 및 UA-CH가 축소되면 기본 정보만 기본적으로 공유되므로 사용자 개인 정보 보호가 개선됩니다.
축소된 사용자 에이전트에는 브라우저의 브랜드와 주요 버전, 요청이 발생한 위치 (데스크톱 또는 모바일), 플랫폼이 포함됩니다. 더 많은 데이터에 액세스하기 위해 사용자 에이전트 클라이언트 힌트를 사용하면 사용자의 기기 또는 조건에 관한 특정 정보를 요청할 수 있습니다.
또한 시간이 지남에 따라 User-Agent 문자열이 길어지고 복잡해져 오류가 발생하기 쉬운 문자열 파싱이 발생했습니다. UA-CH는 해석하기 쉬운 구조화되고 신뢰할 수 있는 데이터를 제공합니다. UA 문자열을 파싱하는 기존 코드는 작동이 중단되지 않으며 (데이터는 적게 반환됨) 사이트에 특정 클라이언트 정보가 필요한 경우 UA-CH로 이전해야 합니다.
축소된 UA 및 UA-CH는 어떻게 작동하나요?
다음은 축소된 사용자 에이전트 문자열과 UA-CH가 작동하는 방식의 간단한 예입니다. 자세한 예는 사용자 에이전트 클라이언트 힌트를 사용하여 사용자 개인 정보 보호 및 개발자 환경 개선을 참고하세요.
사용자가 브라우저를 열고 주소 표시줄에 example.com를 입력합니다.
브라우저가 웹페이지를 로드하라는 요청을 보냅니다.
- 브라우저에는 축소된 사용자 에이전트 문자열이 포함된
User-Agent헤더가 포함됩니다. 예를 들면 다음과 같습니다.User-Agent: Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.0.0 Mobile Safari/537.36 브라우저는 기본 User-Agent Client Hint 헤더에 동일한 정보를 포함합니다. 예를 들면 다음과 같습니다.
Sec-CH-UA: "Chrome"; v="98" Sec-CH-UA-Mobile: ?1 Sec-CH-UA-Platform: "Android"
- 브라우저에는 축소된 사용자 에이전트 문자열이 포함된
서버는
Accept-CH응답 헤더를 사용하여 브라우저에 기기 모델과 같은 추가 클라이언트 힌트를 전송하도록 요청할 수 있습니다. 예를 들면 다음과 같습니다.Accept-CH: Sec-CH-UA, Sec-CH-UA-Mobile, Sec-CH-UA-Platform, Sec-CH-UA-Model브라우저는 정책과 사용자 구성을 적용하여 후속 요청 헤더에서 서버로 반환할 수 있는 데이터를 결정합니다. 예를 들면 다음과 같습니다.
Sec-CH-UA: "Chrome"; v="93" Sec-CH-UA-Mobile: ?1 Sec-CH-UA-Platform: "Android" Sec-CH-UA-Model: "Pixel 2"
중요한 클라이언트 힌트
초기 요청에 특정 클라이언트 힌트가 필요한 경우 Critical-CH 응답 헤더를 사용할 수 있습니다. Critical-CH 값은 Accept-CH에서 요청한 값의 하위 집합이어야 합니다.
예를 들어 초기 요청에는 Device-Memory 및 Viewport-Width 요청이 포함될 수 있으며 여기서 Device-Memory는 중요한 것으로 간주됩니다.
GET / HTTP/1.1
Host: example.com
HTTP/1.1 200 OK
Content-Type: text/html
Accept-CH: Device-Memory, Viewport-Width
Vary: Device-Memory, Viewport-Width
Critical-CH: Device-Memory
브라우저에서 웹페이지를 올바르게 렌더링하는 데 중요한 힌트 (Critical-CH)가 필요한 경우 서버는 Accept-CH 헤더를 사용하여 이 추가 정보를 요청할 수 있습니다. 그러면 브라우저가 중요한 힌트를 포함하여 페이지에 대한 새 요청을 보낼 수 있습니다.
요약하자면 Accept-CH는 페이지에 필요한 모든 값을 요청하는 반면 Critical-CH는 페이지를 올바르게 로드하기 위해 로드 시에 필요한 값의 하위 집합만 요청합니다. 자세한 내용은 클라이언트 힌트 안정성 사양을 참고하세요.
UA-CH API로 태블릿 기기 감지
휴대기기, 태블릿, 데스크톱 기기 간의 경계가 계속 모호해지고 동적 폼 팩터 (접는 화면, 노트북과 태블릿 모드 간 전환)가 더 일반화됨에 따라 반응형 디자인과 기능 감지를 사용하여 적절한 사용자 인터페이스를 표시하는 것이 좋습니다.
하지만 사용자 에이전트 문자열과 사용자 에이전트 클라이언트 힌트 모두에 대해 브라우저에서 제공하는 정보는 동일한 소스에서 가져오므로 동일한 형태의 로직이 작동해야 합니다.
예를 들어 UA 문자열에서 이 패턴을 확인하는 경우
- 전화 패턴:
'Android' + 'Chrome/[.0-9]* Mobile' - 태블릿 패턴:
'Android' + 'Chrome/[.0-9]* (?!Mobile)'
일치하는 기본 UA-CH 헤더 인터페이스는 다음을 확인할 수 있습니다.
- 전화번호 패턴:
Sec-CH-UA-Platform: "Android",Sec-CH-UA-Mobile: ?1 - 태블릿 패턴:
Sec-CH-UA-Platform: "Android",Sec-CH-UA-Mobile: ?0
또는 이에 상응하는 JavaScript 인터페이스:
- 전화 패턴:
navigator.userAgentData.platform === 'Android' && navigator.userAgentData.mobile === true - 태블릿 패턴:
navigator.userAgentData.platform === 'Android' && navigator.userAgentData.mobile === false
하드웨어 관련 사용 사례의 경우 높은 엔트로피 Sec-CH-UA-Model 힌트를 통해 기기 모델 이름을 요청할 수 있습니다.
축소된 UA를 사용하고 테스트하려면 어떻게 해야 하나요?
먼저 사이트 코드에서 사용자 에이전트 문자열의 인스턴스와 사용을 검토합니다. 사이트에서 사용자 에이전트 문자열을 파싱하여 기기 모델, 플랫폼 버전 또는 전체 브라우저 버전을 읽는 경우 UA-CH API를 구현해야 합니다.
UA-CH API로 업데이트한 후에는 사용자 에이전트에서 예상한 데이터를 가져오는지 테스트해야 합니다. 테스트 방법에는 세 가지가 있으며 각각 복잡성이 증가합니다.
사용자 에이전트 축소의 확장된 가용성은 모든 Chrome 기기에 완전히 축소된 UA 문자열이 제공됨을 의미합니다. 감소는 2022년 2분기에 Chrome 부 버전 출시와 함께 시작되었습니다.
로컬에서 맞춤 문자열 테스트
맞춤 사용자 에이전트 문자열을 사용하여 다양한 기기를 시뮬레이션하여 사이트를 테스트하려면 --user-agent="Custom string here" 명령줄 플래그를 사용하여 Chrome을 실행하세요. 명령줄 플래그에 대해 자세히 알아보세요.
또는 Chrome DevTools에서 기기 에뮬레이터를 사용합니다.
사이트 코드에서 문자열 변환
클라이언트 측 또는 서버 측 코드에서 기존 Chrome user-agent 문자열을 처리하는 경우 해당 문자열을 새 형식으로 변환하여 호환성을 테스트할 수 있습니다. 문자열을 재정의하고 대체하거나 새 버전을 생성하여 나란히 테스트할 수 있습니다.
클라이언트 힌트 및 중요 힌트 지원
브라우저 이름과 주요 버전, 브라우저가 모바일 기기에 있는지 나타내는 불리언, 운영체제 이름을 포함하여 서버에 반환되는 세 가지 기본 클라이언트 힌트가 있습니다. 이는 전송 계층 보안 프로토콜 (TLS) 핸드셰이크 후에 전송됩니다. 이러한 기능은 이미 브라우저에서 사용할 수 있으며 지원됩니다.
하지만 사이트를 렌더링하기 위해 중요한 정보를 가져와야 하는 경우가 있을 수 있습니다.
중요 힌트 최적화
TLS 핸드셰이크는 브라우저와 웹 서버 간에 보안 연결을 만드는 첫 번째 단계입니다. 개입이 없으면 Critical-CH 응답 헤더는 첫 번째 요청이 중요 힌트 없이 전송된 경우 브라우저에 요청을 즉시 재시도하도록 지시하도록 설계되었습니다.
Sec-CH-UA-Model에 대한 힌트가 두 번 요청됩니다. 한 번은 Accept-CH와 함께 클라이언트 힌트로, 다른 한 번은 Critical-CH와 함께 중요 힌트로 요청됩니다.중요한 힌트 (Critical-CH 헤더)를 최적화하려면 이 핸드셰이크를 가로채고 클라이언트 힌트 모델을 제공해야 합니다. 이러한 단계는 복잡할 수 있으며 고급 지식이 필요합니다.
ACCEPT_CH HTTP/2 및 HTTP/3 프레임은 TLS ALPS 확장 프로그램과 결합되어 첫 번째 HTTP 요청에 맞춰 서버의 클라이언트 힌트 환경설정을 제공하는 연결 수준 최적화입니다. 이러한 기능에는 복잡한 구성이 필요하며 정말 중요한 정보에만 사용하는 것이 좋습니다.
BoringSSL (OpenSSL의 포크)을 사용하면 Chromium에서 Google의 실험용 기능을 사용할 수 있습니다. 현재 ALPS는 BoringSSL에서만 구현됩니다.
중요 힌트를 사용해야 하는 경우 중요 힌트 안정성 및 최적화에 관한 가이드를 참고하세요.
FAQ
Accept-CH 헤더를 통해 지정된 힌트는 얼마나 오래 전송되나요?
Accept-CH 헤더를 통해 지정된 힌트는 브라우저 세션이 지속되거나 다른 힌트가 지정될 때까지 전송됩니다.
UA-CH는 HTTP/2 및 HTTP/3와 함께 작동하나요?
UA-CH는 HTTP/2 및 HTTP/3 연결 모두에서 작동합니다.
하위 도메인 (및 CNAME)에서 엔트로피가 높은 UA-CH에 액세스하려면 최상위 페이지 Permissions-Policy가 필요한가요?
요청 헤더의 엔트로피가 높은 UA-CH는 DNS 측에서 출처가 어떻게 정의되든 교차 출처 요청에서 제한됩니다. 위임은 교차 출처 하위 리소스의 경우 Permissions-Policy를 통해 처리하거나 교차 출처 컨텍스트에서 실행되는 JavaScript를 통해 획득해야 합니다.
사용자 에이전트 축소는 봇 감지에 어떤 영향을 미치나요?
Chrome의 사용자 에이전트 문자열 변경사항은 봇이 전송하도록 선택한 사용자 에이전트 문자열에 직접적인 영향을 미치지 않습니다.
봇은 Chrome에서 전송하는 정보가 줄어든 것을 반영하기 위해 자체 문자열을 업데이트할 수 있지만 이는 전적으로 구현 선택사항입니다. Chrome은 여전히 동일한 사용자 에이전트 형식을 전송하며 Chrome 사용자 에이전트 문자열 끝에 자체 식별자를 추가하는 봇은 계속해서 그렇게 할 수 있습니다.
특정 봇에 문제가 있는 경우 소유자에게 직접 연락하여 사용자 에이전트 문자열을 변경할 계획이 있는지 문의하는 것이 좋습니다.
참여 및 의견 공유
- 오리진 트라이얼: 이전 오리진 트라이얼에 대한 의견을 공유하세요.
- 데모: 사용자 에이전트 축소 데모를 사용해 보세요.
- GitHub: UA-CH 설명서를 읽고 질문을 게시하고 토론을 살펴보세요.
자세히 알아보기
- 사용자 개인 정보 보호 및 개발자 환경 개선: 웹 개발자를 위한 개요
- UA 문자열에서 UA-CH로 이전하기: 웹 개발자를 위한 튜토리얼
- 개인 정보 보호 샌드박스 자세히 살펴보기