user-agent 스푸핑이란
모든 HTTP 클라이언트는 자신을 설명하는 User-Agent 헤더를 보낼 수 있습니다. 브라우저 이름과 버전, 크롤러 이름, 라이브러리 식별자 등이 여기에 해당합니다. 이 헤더는 자기 신고 방식입니다. HTTP 안에는 그 내용이 사실인지 확인하는 장치가 없기 때문에, 어떤 클라이언트든 어떤 값이든 보낼 수 있습니다. user-agent 스푸핑은 클라이언트를 실제와 다르게 보이게 하는 값을 보내는 관행을 말합니다. 예를 들면 다음과 같습니다.
- 자동화 스크립트가 최신 데스크톱 브라우저인 것처럼 자신을 표시하는 경우,
- 스크레이퍼가 우대 처리를 받기 위해 잘 알려진 검색 크롤러라고 주장하는 경우,
- AI 에이전트가 일반적인 브라우저 문자열을 사용해 사람처럼 취급되게 하는 경우.
왜 중요한가
많은 시스템은 여전히 user-agent 문자열을 기준으로 결정을 내립니다. 알려진 크롤러를 allowlisting 하거나, 봇에게 다른 콘텐츠를 제공하거나, 분석에서 자동화를 제외하는 식입니다. 이런 결정은 모두 이 헤더의 약점을 그대로 이어받습니다. 정책이 "crawler X라고 주장하는 것은 모두 허용"이라고 말하면, crawler X의 문자열을 복사한 모든 주체를 허용하게 됩니다.
AI 에이전트 트래픽을 받는 애플리케이션에서는 시간이 갈수록 이 점이 더 중요해집니다. 에이전트는 점점 실제 브라우저 안에서 또는 headless browser framework 위에서 실행되므로, user-agent 문자열이 사람의 브라우저와 완전히 같아 보입니다. 어떤 에이전트는 정직하게 자신을 식별하기도 합니다. 그러나 헤더만으로는 무엇이 무엇인지 구분할 수 없습니다. 웹사이트 트래픽이 AI 에이전트에서 오는지 확인하는 방법에 대한 글에서는 더 잘 작동하는 신호를 살펴봅니다.
헤더보다 나은 증거
- 암호학적 서명. HTTP Message Signatures와 Web Bot Auth 작업을 사용하면, 클라이언트는 자신이 이름으로 밝힌 운영자가 게시한 키를 보유하고 있음을 증명할 수 있습니다. 복사한 user-agent 문자열로는 서명을 재현할 수 없습니다.
- 운영자 공개 검증. 일부 크롤러 운영자는 IP 범위를 공개하거나 reverse DNS 검사를 지원합니다. 이를 통해 헤더만으로는 불가능한 수준으로 가장을 어렵게 만들 수 있습니다. Google은 자사 크롤러에 대해 reverse DNS와 IP 범위 확인을 문서화하고, Microsoft는 Verify Bingbot 도구를 제공하며, OpenAI는 각 봇의 IP address 파일을 공개합니다. Anthropic의 호스팅 browser agent 안내는 누구나 같은 User-Agent 헤더를 보낼 수 있다고 분명히 밝히고, 공개된 IP 주소를 확인하라고 권장합니다.
- 일관성 검사. 주장한 클라이언트와 프로토콜 세부 사항, 상호작용 신호를 비교하면 그 주장이 맞지 않을 때를 드러낼 수 있습니다. 다만 이것은 추론이지 증명은 아닙니다.
- 자격 증명. API의 경우 API key나 token은 헤더에 무엇이 적혀 있든, 어떤 account가 호출하는지 알려줍니다.
흔한 오해
- "브라우저 user-agent면 사람이다." headless browser와 agent framework는 보통 브라우저 문자열을 그대로 보냅니다.
- "크롤러 user-agent면 그 크롤러다." 서명이나 운영자 검증이 없으면, 그것은 단지 주장일 뿐입니다.
- "스푸핑은 항상 악의적이다." 일부 정당한 도구는 깨진 페이지가 제공되는 것을 피하기 위해 일반적인 문자열을 보냅니다. 스푸핑은 헤더의 신뢰도를 낮출 이유이지, 악의적 의도의 증거는 아닙니다.
Proof of Actor가 user-agent 문자열을 다루는 방식
Proof of Actor는 user-agent 주장을 declared 증거로 기록합니다. 즉, 클라이언트가 그렇게 말했을 뿐이며 사실일 수도 있고 아닐 수도 있다는 뜻입니다. Proof of Actor는 선언을 스스로 verified로 승격하지 않습니다. 식별 근거가 crawler user-agent 문자열뿐인 요청은 그에 맞게 표시되며, 증거가 부족하면 결과는 확신에 찬 추측이 아니라 Unknown으로 처리됩니다. 그런 다음 Route의 정책은 검증된 서명된 에이전트와 자기 선언형 에이전트를 다르게 다룰 수 있습니다. 예를 들어 읽기 전용 route에서는 둘 다 허용하되, 선언형 에이전트에는 더 엄격한 제한을 적용할 수 있습니다.
증거 기반이 어떻게 동작하는지 또는 조기 액세스를 신청하는 방법을 확인하세요.
출처
- RFC 9110: HTTP Semantics, User-Agent: 헤더는 클라이언트가 자기 신고하는 값입니다
- Google: Verifying Google's crawlers and fetchers: reverse DNS와 공개 IP 범위 확인
- Microsoft Bing: Verify Bingbot tool: IP address가 Bingbot에 속하는지 확인하는 방법
- OpenAI: Overview of OpenAI Crawlers: user agent와 공개된 IP address 파일
- Anthropic: how Anthropic-hosted browsers identify themselves: User-Agent 헤더는 복사될 수 있다는 경고