User-Agent 변경과 --lang 옵션을 활용한 탐지 우회
웹 자동화를 수행할 때, 많은 사이트들은 Selenium을 사용하는 브라우저를 감지하여 차단합니다.
특히, Cloudflare와 같은 보안 서비스는 특정 패턴을 감지하여 봇 트래픽을 차단하는데, 이 과정에서 User-Agent가 중요한 역할을 합니다. User-Agent는 나의 접속이 어디서 왔는지를 변경하는 역할을 하신다고 생각하면 됩니다.
UserAgent를 직접 실습 해보기에는 BeautifulSoup가 매우 편리하고 쉽기 때문에 BeautifulSoup 사용하여 실습 하는 방법도 추천합니다. UserAgent를 사용하게 된다면 나의 출처가 Python이 아닌 Chrome으로 변경할 수 있는 장점이 있습니다.
이번 게시글에서는 Selenium에서 User-Agent를 변경하는 방법과 --lang 옵션을 활용하여 탐지를 우회하는 이유에 대해 깊이 알아보겠습니다.
User-Agent란 무엇인가?
User-Agent(UA)는 웹 브라우저가 서버와 통신할 때 자신의 정보를 전달하는 문자열입니다
. 이 문자열에는 브라우저 종류, 운영 체제, 렌더링 엔진 등이 포함되어 있으며, 서버는 이를 기반으로 클라이언트의 환경을 파악합니다. 렌더링 엔진에 대해서는 자세하게 설명할 수 있는 위치에 있지 않아 아시는 분은 댓글로 도와주시면 감사하겠습니다!
예제 User-Agent
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36
웹사이트는 User-Agent를 확인하여 특정 브라우저나 봇을 차단할 수 있습니다.
따라서 Selenium을 사용할 때 기본적으로 설정된 User-Agent는 매우 중요합니다.
(selenium, BeautifulSoup 의 User-Agent설정 방법은 모델마다 다릅니다! 필요에 맞는 모델을 선정해서 알아보시는 법을 추천합니다. 앞으로의 게시글에서는 Selnenium이 기준이 됩니다.)
Selenium 기본 User-Agent 탐지 문제
Selenium을 사용하여 브라우저를 실행하면, 기본적으로 자동화된 브라우저라는 것을 나타내는 특정 User-Agent 패턴이 존재합니다. 예를 들어, Selenium으로 크롬을 실행하면 기본적으로 다음과 같은 User-Agent가 설정됩니다:
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) HeadlessChrome/120.0.0.0 Safari/537.36
문제점
- HeadlessChrome 문자열 포함 → 많은 사이트에서 봇 탐지의 주요 요소
- Selenium의 기본 User-Agent 값은 탐지 대상
- 웹사이트는 User-Agent를 기반으로 자동화 여부를 판단
Cloudflare와 같은 보안 시스템은 HeadlessChrome 또는 비정상적인 User-Agent를 감지하여 차단할 수 있습니다.
User-Agent 변경을 통한 탐지 우회 방법
Selenium에서 User-Agent를 변경하면 브라우저가 일반 사용자처럼 보이게 할 수 있으며, 탐지를 어렵게 만들 수 있습니다
User-Agent 변경 방법
from selenium import webdriver
import undetected_chromedriver as uc
options = uc.ChromeOptions()
options.add_argument("--user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36")
browser = uc.Chrome(options=options)
browser.get("https://www.아무사이트/")
이렇게 한다면 기본 Selenium User-Agent 대신 일반적인 크롬 브라우저 User-Agent가 사용됩니다.
또한 웹사이트가 자동화된 환경임을 감지하기 어려워집니다.
User-Agent를 동적으로 변경하는 방법 (Chrome DevTools Protocol 사용) - ChatGpt의견
Selenium의 execute_cdp_cmd를 사용하면 동적으로 User-Agent를 변경할 수도 있다고 합니다.
browser.execute_cdp_cmd('Network.setUserAgentOverride', {
"userAgent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
})
이 방법은 크롬의 네트워크 레벨에서 User-Agent를 변경하는 방식이므로, 더욱 강력한 탐지 우회가 가능하다고 합니다.
--lang 옵션을 활용한 탐지 우회 (--lang=ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7)
웹사이트는 단순히 User-Agent뿐만 아니라 브라우저의 언어 설정을 확인하여 자동화 여부를 탐지할 수 있습니다.
options.add_argument("--lang=ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7")
이 옵션의 역할
- ko-KR,ko;q=0.9 → 브라우저의 기본 언어가 한국어(ko-KR)로 설정됨
- en-US;q=0.8,en;q=0.7 → 영어(en-US, en)를 보조 언어로 추가
탐지 우회를 위한 핵심 원리:기본 Selenium 환경에서는 언어 설정이 존재하지 않거나 기본값이 설정됩니다.
대부분의 사용자는 특정 언어 설정을 사용하므로, 이 설정이 없으면 봇으로 의심받을 가능성이 큽니다.
--lang 옵션을 설정하면 실제 사용자가 설정한 브라우저 환경처럼 위장할 수 있습니다.
예제
- 한국에서 접속하는 일반 사용자의 Accept-Language 헤더:
- ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
- Selenium 기본값(봇 탐지 가능성이 높은 값):
- en-US,en;q=0.9
- 따라서 --lang 옵션을 추가하면 탐지를 우회할 가능성이 높아진다고 생각합니다.
이는 개인적인 생각이고 보편적으로 알려져있는 방법은 아니니 이러한 방법이 있다고 넘어가시면 될 거 같습니다.
'Bypassing Cloudflare' 카테고리의 다른 글
--disable-blink-feautures=AutomationControlled (2) | 2025.02.18 |
---|