웹 서비스를 운영하다 보면 방문자가 실제 사용자인지, 아니면 Googlebot 같은 검색 엔진 봇(spider)인지 구분해야 할 때가 있습니다. 이럴 때 검색 엔진 스파이더 이름 목록을 참고 자료로 활용하면 좋습니다. PHP에서는 $_SERVER['HTTP_USER_AGENT'] 값을 확인하여 현재 접속한 에이전트가 봇인지 손쉽게 판별할 수 있습니다.
방법 1: strtolower와 strstr 함수 활용
사용자 에이전트 문자열을 소문자로 변환한 뒤, 특정 봇 이름이 포함되어 있는지 검사하는 기본적인 방법입니다.
if(strstr(strtolower($_SERVER['HTTP_USER_AGENT']), "some_bot_name")) {
// 봇으로 판별된 경우 실행할 작업
}코드 설명
먼저 사용자 에이전트 값이 strtolower 함수에 전달되어 모두 소문자로 변환됩니다. 그 결과가 다시 strstr 함수로 넘어가며, 대상 봇 이름과 비교되어 해당 스파이더가 봇인지 아닌지를 판단합니다. 문자열을 미리 소문자로 통일하기 때문에 대소문자 차이로 인한 오탐을 줄일 수 있습니다.
방법 2: preg_match와 정규식 활용
여러 봇을 한 번에 처리하려면 정규식을 사용하는 것이 더 효율적입니다. 아래 예제처럼 함수 형태로 만들어 재사용할 수도 있습니다.
function _bot_detected() {
return (
isset($_SERVER['HTTP_USER_AGENT'])
&& preg_match('/bot|crawl|slurp|spider|mediapartners/i', $_SERVER['HTTP_USER_AGENT'])
);
}코드 설명
preg_match 함수는 문자열 안에서 특정 패턴을 찾아내는 데 사용됩니다. 위 코드에서는 'bot', 'crawl', 'slurp', 'spider', 'mediapartners'라는 키워드를 하나의 정규식 패턴으로 묶어 사용자 에이전트와 비교하며, 일치하면 해당 스파이더가 검색 엔진 봇임을 의미합니다. 패턴 끝의 i 플래그는 대소문자를 구분하지 않도록 해줍니다.
참고: 자주 사용되는 주요 검색 엔진 봇
- Googlebot – Google의 웹 크롤러
- Bingbot – Microsoft Bing의 크롤러
- Slurp – Yahoo의 크롤러
- DuckDuckBot – DuckDuckGo의 크롤러
- Baiduspider – 바이두(Baidu)의 크롤러
다만 사용자 에이전트 문자열은 조작될 수 있으므로, 로그 분석이나 IP 역방향 조회(reverse DNS lookup)와 함께 활용하면 더욱 정확하게 봇을 식별할 수 있습니다.