이 가이드에서는 다음을 배우게 됩니다:
- CAPTCHA란 무엇이며 우회할 수 있는지
- 단계별 튜토리얼을 통해 Puppeteer로 CAPTCHA 우회하는 방법
- Puppeteer로 진행한 과정이 작동하지 않을 때의 대처 방법
자, 시작해 보겠습니다!
CAPTCHA란 무엇인가요? 그리고 우회할 수 있나요?
CAPTCHA (컴퓨터와 인간을 구분하기 위한 완전 자동화된 공개 튜링 테스트)는 인간과 자동화된 봇을 구분하는 도전-응답 테스트입니다. CAPTCHA는 인간에게는 쉽게 풀리지만 소프트웨어에는 어렵게 설계되어 목표를 달성합니다.
주요 CAPTCHA 제공업체로는 Google reCAPTCHA, hCaptcha, BotDetect 등이 있으며, 일반적인 CAPTCHA 유형은 다음과 같습니다:
- 텍스트 기반: 사용자가 글자와 숫자를 인식하여 입력해야 합니다.
- 이미지 기반: 사용자가 이미지 그리드에서 올바른 이미지를 선택하여 특정 물체를 식별해야 합니다.
- 음성 기반: 사용자가 들리는 문자를 입력해야 합니다.
- 퍼즐 과제: 이 유형의 과제는 사용자가 조각을 지정된 위치로 밀어 넣는 간단한 퍼즐을 풀어야 합니다.
CAPTCHA는 자동화된 소프트웨어나 봇이 우회하기 어렵도록 설계되었습니다. 따라서 가능한 방법은 CAPTCHA 해결 라이브러리나 인간 운영자에 의존하는 서비스를 소프트웨어에 통합하여 이러한 도전을 자동화하고 해결하는 것입니다.
그러나 하드코딩된 CAPTCHA는 웹사이트의 전반적인 사용자 경험에 부정적인 영향을 미치기 때문에 흔하지 않습니다. 이러한 이유로 CAPTCHA는 WAF(웹 애플리케이션 방화벽)와 같은 광범위한 봇 방지 솔루션의 일부로 사용되는 경우가 더 일반적입니다:

이러한 경우 시스템은 웹사이트에서 봇 활동이 의심될 때 동적으로 CAPTCHA를 표시합니다. 이를 우회하려면 인간 행동을 모방하는 봇을 개발해야 합니다. 가능은 하지만, 새로운 봇 탐지 기술과 방법에 대응하기 위해 스크립트를 자주 업데이트해야 하므로 상당한 노력이 필요합니다.
좋은 소식은 CAPTCHA 우회를 위한 더 효과적인 솔루션이 있다는 점입니다: Bright Data의 CAPTCHA Solver! 이 항상 최신 상태를 유지하는 도구는 CAPTCHA 우회와 관련된 모든 문제를 번거로움 없이 해결해 줍니다.
Puppeteer로 CAPTCHA 우회하는 방법: 단계별 튜토리얼
이제 CAPTCHA를 우회하기 위해 인간의 행동을 모방하는 자동화된 스크립트를 만들 시간입니다.
이를 위해 웹 브라우저를 제어하는 고급 API를 제공하는 자바스크립트 라이브러리인 Puppeteer를 사용할 수 있습니다.
시작해 봅시다!
1단계: 프로젝트 설정
프로젝트의 메인 폴더 이름을 bypass_captcha_puppeteer라고 가정합니다. 저장소의 구조는 다음과 같아야 합니다:
bypass_captcha_puppeteer/
├── index.js
└── package.json
다음 명령어로 생성할 수 있습니다:
mkdir bypass_captcha_puppeteer
그런 다음 프로젝트 폴더로 이동하여 npm init을 실행하여 Node.js 애플리케이션을 초기화합니다:
cd bypass_captcha_puppeteer
npm init -y
다음으로, 해당 폴더 내에 index.js 파일을 생성합니다.
아래와 같이 Puppeteer를 설치합니다:
npm install puppeteer
단계 #2: ESM 자바스크립트 표기법 사용
자바스크립트에서 ECMAScript 모듈 표기법을 사용하려면 package.json 파일에 "type": "module" 옵션이 있어야 합니다.
package.json 파일은 다음과 같이 작성해야 합니다:
{
"name": "bypass_captcha_puppeteer",
"version": "1.0.0",
"description": "",
"main": "index.js",
"type": "module",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"puppeteer": "^23.10.4"
}
}
3단계: Puppeteer로 CAPTCHA 우회 시도
Puppeteer가 봇으로 인식되는지 확인하려면 index.js 파일에 다음 코드를 작성하세요:
import puppeteer from 'puppeteer';
const visitBotAnalyzerPage = async () => {
try {
// 브라우저 초기화
const browser = await puppeteer.launch();
// 새 브라우저 페이지 열기
const page = await browser.newPage();
// 대상 URL로 이동
const url = 'https://bot.sannysoft.com/';
console.log(`${url}로 이동 중...`);
await page.goto(url, { waitUntil: 'networkidle2' });
// 전체 페이지 스크린샷 저장
console.log('전체 페이지 스크린샷 촬영 중...');
await page.screenshot({ path: 'anti-bot-analysis.png', fullPage: true });
console.log('스크린샷 촬영 완료');
// 브라우저 닫기
await browser.close();
console.log('브라우저 닫힘');
} catch (error) {
console.error('오류 발생:', error);
}
};
// 스크립트 실행
visitBotAnalyzerPage();
이 코드의 동작은 다음과 같습니다:
- 브라우저 실행:
puppeteer.launch()메서드는 가시적인 UI(headless: false)를 가진 새 브라우저 인스턴스를 시작합니다. - 새 브라우저 페이지 열기:
browser.newPage()는 추가 작업을 수행할 수 있는 새 빈 브라우저 페이지를 생성합니다. - 대상 페이지로 이동:
page.goto()메서드는 대상 페이지( Intoli.com 테스트 페이지)로 리디렉션합니다. 이 페이지는 요청이 봇에서 왔는지 여부를 파악하기 위해 설계되었습니다. - 결과 스크린샷 저장:
page.screenshot()메서드는 결과 화면의 스크린샷을 캡처하여 저장합니다. - 브라우저를 닫고 오류를 처리합니다:
browser.close()는 브라우저를 닫고 발생할 수 있는 오류를 차단합니다.
코드를 실행하려면 다음을 입력하세요:
node index.js
이제 저장된 이미지를 열 수 있습니다. 예상 결과는 다음과 같습니다:

이미지에서 볼 수 있듯이, Puppeteer는 몇 가지 테스트를 통과하지 못했습니다. 따라서 WAF(웹 애플리케이션 방화벽)는 Puppeteer로 페이지와 상호작용할 때 CAPTCHA를 표시할 가능성이 높습니다.
이러한 문제를 해결하기 위해 Puppeteer Stealth를 사용해 보겠습니다!
4단계: 스텔스 플러그인 설치
Puppeteer Extra는 Puppeteer를 둘러싼 경량 래퍼로, 여러 구성 항목을 재정의하여 브라우저 인스턴스가 자연스럽고 “인간과 유사한” 것처럼 보이게 함으로써 봇 탐지를 방지하는 Stealth 플러그인을 설치할 수 있게 해줍니다.
다음과 같이 라이브러리를 설치하세요:
npm install puppeteer-extra puppeteer-extra-plugin-stealth
puppeteer 대신 puppeteer-extra 에서 Puppeteer를 임포트하세요:
import puppeteer from 'puppeteer-extra';
훌륭합니다! 이제 Puppeteer로 CAPTCHA를 우회하기 위해 Stealth 플러그인을 사용할 준비가 되었습니다.
단계 #5: Stealth 플러그인으로 테스트 반복하기
이제 다음 코드 줄로 Stealth 플러그인을 구현하세요:
puppeteer.use(StealthPlugin()).
따라서 코드는 다음과 같이 변경됩니다:
import puppeteer from 'puppeteer-extra';
import StealthPlugin from 'puppeteer-extra-plugin-stealth';
// Puppeteer에 스텔스 플러그인 추가
puppeteer.use(StealthPlugin());
const visitBotAnalyzerPage = async () => {
try {
// 스텔스 설정으로 브라우저 실행
const browser = await puppeteer.launch();
console.log('스텔스 모드로 브라우저 실행 중...');
// 새 페이지 열기
const page = await browser.newPage();
// 대상 페이지로 이동
const url = 'https://bot.sannysoft.com/';
console.log(`${url}로 이동 중...`);
await page.goto(url, { waitUntil: 'networkidle2' });
// 전체 페이지 스크린샷 저장
console.log('전체 페이지 스크린샷 촬영 중...');
await page.screenshot({ path: 'anti-bot-analysis.png', fullPage: true });
console.log(`스크린샷 촬영 완료`);
// 브라우저 닫기
await browser.close();
console.log('브라우저 닫힘. 스크립트 성공적으로 완료됨');
} catch (error) {
console.error('오류 발생:', error);
}
};
// 스크립트 실행
visitBotAnalyzerPage();
이제 다음 코드로 다시 실행하면:
node index.js
예상 결과는 다음과 같습니다:

만세! 이제 스크립트가 봇 탐지 테스트를 통과합니다. 즉, Puppeteer 사용 시 CAPTCHA가 표시될 가능성이 줄어듭니다!
위 방법으로도 Puppeteer로 CAPTCHA 우회가 안 될 때
안타깝게도 Puppeteer Extra가 항상 완벽한 해결책은 아닙니다. 그 이유는 브라우저 설정이 자동화 소프트웨어 차단에 초점을 맞추는 유일한 방법이 아니기 때문입니다.
예를 들어, 사용자 에이전트(User Agent)는 자동화된 소프트웨어를 차단하기 위해 안티봇 시스템이 사용하는 또 다른 요소입니다. 이 문제를 해결하려면 사용자 에이전트를 익명화하는 puppeteer-extra-plugin-anonymize-ua 라이브러리를 사용할 수 있습니다.
그러나 앞서 설명한 플러그인 기반 접근법은 기본적인 봇 방지 조치에만 효과적입니다: Cloudflare와 같은 더 복잡한 도구를 상대할 때는 더 강력한 솔루션이 필요합니다.
그렇다면… 진정한 Playwright CAPTCHA 솔버를 찾고 계신가요? Bright Data 웹 스크래핑 솔루션을 사용해 보세요!
이 솔루션은 전용 CAPTCHA 해결 기능을 통해 우수한 잠금 해제 기능을 제공하며,reCAPTCHA, hCaptcha, px_captcha, SimpleCaptcha, GeeTest CAPTCHA, FunCaptcha, Cloudflare Turnstile, AWS WAF Captcha, KeyCAPTCHA 등 다양한 CAPTCHA를 자동으로 처리합니다.
Bright Data의 CAPTCHA Solver는 모든 HTTP 클라이언트 또는 브라우저 자동화 도구와 호환되므로 스크립트에 쉽게 통합할 수 있습니다.
Bright Data의 CAPTCHA Solver 사용 방법에 대해 자세히 알아보고 모든 통합 및 구성 세부 사항에 대한 문서를 확인하세요.
결론
이 글에서는 Puppeteer로 CAPTCHA를 우회하는 것이 어려운 이유와, 스텔스 플러그인을 사용하여 기본 브라우저 설정을 재정의하여 봇 탐지를 우회하는 방법을 알아보았습니다.
이 접근 방식의 문제점은 단순한 시나리오에서만 작동한다는 것입니다. 고급 봇 탐지 시스템은 여전히 사용자를 봇으로 식별하여 차단할 수 있습니다.
따라서 CAPTCHA 우회 시 진정한 해결책은 모든 웹 페이지의 CAPTCHA 없는 HTML을 원활하게 반환할 수 있는 언락킹 API를 통해 대상 페이지에 연결하는 것입니다. 이 솔루션은 Web Unlocker로 존재합니다. 이 솔루션은 프록시 통합을 통해 요청마다 출구 IP를 자동으로 회전시키고, 브라우저 지문 인식 처리, 자동 재시도, CAPTCHA 해결을 자동으로 처리합니다.
지금 바로 가입하여 Bright Data의 스크래핑 제품 중 귀하의 요구에 가장 적합한 솔루션을 확인해 보세요.
무료 체험으로 시작하세요!