봇 감지하는 서버를 만들어 테스트해보자
봇을 감지하는 간단한 서버를 만들어 확인해보자
봇 감지하는 서버를 만들어 테스트해보자
봇 감지하는 서버를 만들어 테스트해보자
봇을 감지하는 간단한 서버를 만들어 확인해보자
1. 서론 (Introduction)
- 문제/상황 (Problem):
- 크롤링 기술이 발전함에 따라 서버 측에서도 무분별한 데이터 수집을 막기 위한 정교한 봇 탐지 기법이 도입되고 있다.
- 목적 (Purpose):
- 요청 헤더와 핑거프린팅 데이터를 분석하여 자동화된 도구(Bot)를 판별하는 보안 서버를 구축하고 감지 원리를 이해한다.
- 대상 (Target Audience):
- 웹 보안 및 탐지 우회 기술에 관심이 있는 개발자나 자신의 사이트를 봇으로부터 보호하려는 엔지니어
2. 방법 및 과정 (Methods & Process)
- 배경 조사 및 데이터 (Data Collection):
- User-Agent, Client Hints, Sec-Fetch-* 등 현대적인 브라우저가 전송하는 표준 헤더 세트를 조사하였다.
| 탐지 항목 | 설명 | 판별 기준 |
|---|---|---|
| User-Agent 분석 | 요청 라이브러리 명칭 포함 여부 확인 | requests, httpx 등 특정 문자열 포함 시 봇 의심 |
| Client Hints 검증 | 브라우저 엔진 및 플랫폼 상세 정보 확인 | 필수적인 Sec-CH-UA 헤더 누락 시 비브라우저 판단 |
| Fetch Metadata | 요청의 출처와 목적지 정보 확인 | Sec-Fetch-Site 등의 메타데이터 부재 시 자동화 도구 의심 |
| 필수 헤더 누락 | Accept-Language 등 표준 헤더 확인 | 브라우저에서 기본적으로 보내는 헤더 부재 시 감지 |
| JS 핑거프린팅 | navigator.webdriver 속성 등 확인 | 브라우저 내부 속성을 통한 자동화 엔진 식별 |
- 접근 방법 (Approach Methods):
- [방법 1]: Flask를 사용하여 HTTP 요청 헤더를 실시간으로 분석하는 보안 미들웨어 로직을 구현한다.
- [방법 2]: 분석 결과를 HTML 메타 태그와 HTTP 응답 헤더에 주입하여 클라이언트에게 감지 상태를 리포트한다.
- 분석 및 해결 프로세스 (Analysis Flow):
- 도구/기술: Python, Flask, Jinja2
- 주요 단계: DemoServer 클래스 설계 $\rightarrow$ 다단계 요청 분석 로직(_analyze_request) 구현 $\rightarrow$ 봇 신뢰도 점수 산출 엔진 개발 $\rightarrow$ 동적 템플릿 렌더링 $\rightarrow$ 멀티 스레드 서버 구동
- 결과 도출 및 검증: 다양한 클라이언트(브라우저, requests 스크립트 등)로 접속하여 서버의 봇 감지 로그가 정확히 기록됨을 확인한다.
3. 결과 (Results)
- 분석 결과 요약:
- 단순한 User-Agent 비교를 넘어, 현대 브라우저의 고유한 헤더 조합(Client Hints 등)을 검증함으로써 봇 판별의 정확도를 높일 수 있었다.
- 감지된 신호를 바탕으로 ‘Yes’, ‘Maybe’, ‘No’의 3단계 봇 상태를 정의하고, 감지 근거를 상세 로그로 남겨 분석 편의성을 확보하였다.
4. 인사이트 및 액션 (Insights & Action)
- 인사이트 (Insight):
- 기존 웹 데이터 획득 방식이 봇으로 감지되는지 확인해보자. 해당 봇 감지를 우회할 수 있는 것을 고민해보자.
- 봇 감지는 창과 방패의 싸움이며, 서버가 확인하는 단서들을 이해하는 것이 우회 기술의 핵심이다.
- 실행 방안 (Action Plan):
- 구축된 보안 서버를 벤치마킹하여 현재 운영 중인 서비스의 비정상 접근 탐지 시스템을 강화한다.
- 한 줄 결론 (Key Takeaway):
- 서버 측 보안 가시성을 확보하면 보다 정교한 봇 차단 및 트래픽 관리가 가능하다. 샘플 코드
- 다음 스텝 (Next Step):
- Playwright와 httpx를 결합한 하이브리드 방식으로 이러한 탐지 시스템을 효율적으로 우회하는 기법을 실무에 적용한다.
This post is licensed under CC BY 4.0 by the author.