핵심 요약
- 웹 브라우저의 User-Agent 정보는 쉽게 조작될 수 있어 HTTP 헤더 순서나 TCP/IP 옵션 같은 수동적 신호로 실제 브라우저 여부를 판별합니다.
- 브라우저 종류와 OS마다 헤더 전송 순서와 패킷 옵션 나열 순서가 고유하기 때문에 시뮬레이터나 봇을 쉽게 식별할 수 있습니다.
- 과거에는 브라우저별 난수 생성기(Math.random) 특성으로도 구별이 가능했으나 최신 버전들은 공통 알고리즘을 채택해 무력화되었습니다.
요약 웹 브라우저의 HTTP User-Agent(유저 에이전트) 값은 마음만 먹으면 얼마든지 위조할 수 있어 그대로 신뢰하기 어렵습니다. 이 글에서는 사용자 몰래 패시브(수동적) 방식으로 실제 브라우저와 시뮬레이터(봇)를 구별해내는 다양한 기법을 소개합니다.
가장 대표적인 방법은 HTTP 헤더의 순서를 대조하는 것입니다. 실제 브라우저마다 요청을 보낼 때 헤더 필드를 나열하는 고유한 순서가 있습니다. 예를 들어 파이어폭스는 Host, User-Agent, Accept 순으로 시작하는 반면, 크롬은 Host, Connection, Accept 순으로 전송합니다. 오래된 MSIE(인터넷 익스플로러)는 Accept나 Referer를 먼저 보내는 등 확연한 차이를 보입니다. 봇이나 브라우저 시뮬레이터는 실제 브라우저와 똑같은 순서로 헤더를 구성하지 못하는 경우가 많아 이를 데이터베이스화해 두면 가짜 브라우저를 손쉽게 걸러낼 수 있습니다.
네트워크 계층의 IP/TCP 옵션 순서 역시 유용한 식별 단서가 됩니다. 운영체제(OS)마다 패킷 내 옵션 순서가 다른데, 리눅스는 SACKOK, TSTAMP, NOP, WINDOWSCALE 순서를 따르고, 윈도우는 항상 NOP를 맨 앞에 둡니다. 맥OS는 TSTAMP와 SACKOK 뒤에 1바이트 패딩된 EOL이 붙습니다. 방화벽이 특정 옵션을 제거하더라도 순서 자체를 뒤바꾸지는 않기 때문에 시뮬레이터를 잡아내는 데 효과적입니다.
또한 과거 브라우저들은 캐시 무효화(cache busting) 등에 쓰이는 Math.random() 난수 생성 알고리즘(LFSR, MWC 등)이 서로 달라, 연속된 몇 개의 난수 값만 수집해 내부 상태를 역산하면 브라우저 종류를 정확히 판별할 수 있었습니다. 다만 최신 크롬, 파이어폭스, 사파리는 모두 동일한 Xorshift128 알고리즘을 사용하게 되면서 난수 기반 식별은 더 이상 불가능해졌습니다.
Sponsored · 광고