빠른 답변
Puppeteer에서 인증된 프록시는 어떻게 사용하나요?
--proxy-server=http://gw.crawlrelay.com:7777로 Chrome을 실행한 후 첫 goto 전에 page.authenticate({ username, password })를 호출하세요. Chrome은 플래그에 적힌 인증 정보를 무시합니다. CrawlRelay 레지덴셜 프록시는 사용자 이름에서 국가와 고정 세션 정보를 읽어 각 페이지나 컨텍스트마다 고유한 출구를 갖습니다. 트래픽 비용은 US$0.50/GB에서 50 GB부터 시작하며, 암호화폐로 결제 가능하고 KYC 없이 이용할 수 있습니다.
Puppeteer 설정 요약
| 프록시 주소 | --proxy-server=http://gw.crawlrelay.com:7777가 args 내에 있거나, 브라우저 컨텍스트 내에서는 proxyServer 사용 |
|---|---|
| 인증 정보 | 탐색하기 전에 await page.authenticate({ username, password }) 호출 |
| 별도 세션 | browser.createBrowserContext({ proxyServer }): 세션별로 하나의 컨텍스트 사용 |
| SOCKS5 | Chrome에서는 인증 시 HTTP 포트 사용 |
| 트래픽 절감 | page.setRequestInterception(true)와 함께 이미지, 글꼴, 미디어 차단 |
단일 인증 프록시 설정 방법은?
이것이 최소 패턴입니다. try … finally 블록은 탐색 실패 시에도 Chrome을 종료하므로 서버에서 방치된 브라우저가 쌓이는 문제를 방지합니다.
import puppeteer from "puppeteer";
const browser = await puppeteer.launch({
args: ["--proxy-server=http://gw.crawlrelay.com:7777"],
});
try {
const page = await browser.newPage();
await page.authenticate({ username: "USERNAME-country-us", password: "PASSWORD" });
await page.setRequestInterception(true);
page.on("request", (req) =>
["image", "font", "media"].includes(req.resourceType()) ? req.abort() : req.continue()
);
const res = await page.goto("https://example.com/", { waitUntil: "domcontentloaded", timeout: 60000 });
console.log(res.status(), await page.title());
} finally {
await browser.close();
}한 브라우저에서 여러 세션이나 국가를 실행하려면?
세션마다 하나의 브라우저 컨텍스트를 만드세요. 컨텍스트는 쿠키, 캐시, 네트워크 상태가 분리된 프로필로, 하나의 컨텍스트에 부여한 인증 정보가 다른 컨텍스트에 새어나가지 않습니다. 각 컨텍스트에 고유한 국가 또는 세션 ID가 포함된 사용자 이름을 부여하세요.
import puppeteer from "puppeteer";
import { randomUUID } from "node:crypto";
const GATEWAY = "http://gw.crawlrelay.com:7777";
const browser = await puppeteer.launch();
async function visit(country, url) {
const session = randomUUID().replaceAll("-", "").slice(0, 10);
const context = await browser.createBrowserContext({ proxyServer: GATEWAY });
try {
const page = await context.newPage();
await page.authenticate({
username: `USERNAME-country-${country}-session-${session}-ttl-20`,
password: "PASSWORD",
});
await page.goto(url, { waitUntil: "domcontentloaded", timeout: 60000 });
return { country, session, ip: await page.evaluate(() => document.body.innerText.trim()) };
} finally {
await context.close();
}
}
try {
const results = await Promise.all([
visit("us", "https://api.ipify.org"),
visit("gb", "https://api.ipify.org"),
]);
console.table(results);
} finally {
await browser.close();
}Puppeteer가 407 또는 ERR_TUNNEL_CONNECTION_FAILED를 보이는 이유는?
Chrome이 인증 정보를 보내지 않거나 잘못 보냈기 때문입니다. 다음 세 가지를 확인하세요:
- 그 페이지에서 첫
goto전에page.authenticate()가 먼저 실행되는지. --proxy-server플래그 또는proxyServer에 스킴, 호스트, 포트만 있고user:pass@부분이 없는지.- 사용자 이름의 대상 부분에 오타가 없는지: 407 페이지]에서 curl로 먼저 테스트하세요.
curl이 같은 사용자 이름과 비밀번호로 성공하는데 Puppeteer가 실패하면 ERR_TUNNEL_CONNECTION_FAILED]를 확인하세요.
Puppeteer 페이지의 트래픽 비용은 얼마인가요?
Chrome이 다운로드하는 모든 것이 비용 청구 대상입니다: HTML, 스크립트, 스타일, 이미지, 글꼴, 그리고 페이지의 API 호출 포함. HTTP Archive Web Almanac 2025에 따르면 모바일 평균 페이지 크기는 2,164 KB, 데스크톱은 2,412 KB입니다. 요청 가로채기로 이미지, 글꼴, 미디어를 차단하면 수백 KB 정도로 줄이며, 자주 쓰이는 스크립트는 캐시 응답으로 또 절감 가능합니다. 필요한 페이지에만 4G 모바일 프록시]를 사용하세요: 모바일 트래픽 비용은 US$1.50/GB에서 5 GB부터, 레지덴셜 프록시는 US$0.50/GB에서 50 GB부터 시작합니다.
Puppeteer와 프록시에 관한 FAQ
사용자 이름과 비밀번호를 --proxy-server에 넣을 수 있나요?
아니요. Chrome은 --proxy-server 플래그 내 인증 정보를 무시하며, 첫 HTTPS 요청은 407 에러가 ERR_TUNNEL_CONNECTION_FAILED 뒤에 숨겨집니다. 플래그에는 오직 http://host:port만 넣고, 새로운 페이지마다 page.authenticate()로 인증 정보를 전달하세요.
Puppeteer에서 페이지 간 IP를 어떻게 교체하나요?
각 페이지를 새 브라우저 컨텍스트에서 열거나, 세션 ID 없이 각 페이지에 사용자 이름을 부여하세요. 새 컨텍스트는 새로운 연결을 열며, 각 연결마다 보통 다른 레지덴셜 출구를 받습니다. 한 페이지 내에서는 Chrome이 연결을 재사용하므로 같은 사이트 요청은 연결 종료 전까지 출구가 같을 수 있습니다.
page.authenticate()가 요청 가로채기와 함께 작동하나요?
네. Puppeteer가 프록시 인증 챌린지를 직접 처리하며, 가로채기 핸들러는 각 요청마다 continue()나 abort()만 호출하면 됩니다. 먼저 authenticate()를 설정한 뒤 가로채기를 켜세요, 첫 번째 예제와 같습니다.
프록시와 함께 puppeteer-extra 스텔스 플러그인을 써야 하나요?
우리는 자동화 숨기기나 봇 탐지 회피를 위한 도구를 문서화하거나 지원하지 않습니다. 이런 도구는 자동 방문자 필터링을 우회하는 목적이며, 우리의 Acceptable Use Policy에 위배됩니다. 공공 페이지는 예의 있는 속도로 렌더링하고, 사이트가 공식 API를 제공할 경우 이를 이용하세요.
프록시 사용 시 Puppeteer는 어떤 Chrome을 사용하나요?
최근 Puppeteer 버전은 자동으로 Chrome for Testing 빌드를 다운로드하여 기본으로 사용합니다. 프록시 플래그와 page.authenticate() 역시 정식 Chrome과 동일하게 동작합니다. 직접 executablePath에 Puppeteer를 연결할 경우 브라우저를 최신으로 유지하세요.
레지덴셜 프록시를 통한 Puppeteer 실행
10 GB용 US$5.94, 50 GB에서 가져온 US$0.50/GB.