번개애비의 라이프스톼일
Cloudflare Workers를 통해 크롤링(스크래핑)할 때 SmartProxy로 아이피를 매번 변경하기 본문
요즘 Cloudflare를 통해 자동 수집을 처리하는 기능을 만들고 있다.
Cloudflare의 FaaS는 간단한 Javascript만으로도 손쉽게 Functional 한 기능을 만들 수 있으면서, 넉넉한 무료사용량 덕분에 접근성이 좋은 편이라고 생각한다.
![]() |
![]() |
![]() |
| Workers 무료 사용량 | D1 데이터베이스 무료 사용량 | R2 스토리지 무료 사용량 |
Workers의 경우 하루에 100,000 request 까지 무료이다.
이를 트리거로 사용한다면 1분당 1회씩 실행한다고 했을 때 하루에 1,400 request만 소진하게 된다.
D1 데이터베이스는 SQLite기반이라 다른 관계형데이터베이스에 비해 엄청나게 강력하진 않지만, 간단한 SQL 쿼리를 빠르게 수행할 수 있다. 이 제품도 하루에 5백만 rows를 읽고 10만 rows를 무료로 쓰기가 가능하다.
R2 스토리지는 AWS의 S3버킷과 동일한 기능을 제공하는데, 매월 10GB의 용량 업로드, 하루 1,000만회 GET호출 다운로드가 무료이다. 심지어, Outbound 비용을 따로 받지 않는다!

이런 Cloudflare의 무료기능을 활용해서 크롤링기능을 구현하다보면, 동일 아이피의 반복 수집에 따른 차단이 발생되기도 한다.
이를 우회하기 위해 Workers 내부 코드에 Proxy기능을 처리하게 만들 수 있는데, 문제는 Cloudflare Workers의 외부데이터를 긁어오는 방법은 fetch() 함수가 유일하다.

나는 아이피 우회를 위해서 SmartProxy를 사용했고,
정말 다행히도 SOCKS5 프로토콜을 지원하기 때문에 fetch()를 사용하지 않으면서 한국 아이피를 별도로 활용할 수 있었다.


SmartProxy 가입하기 : https://www.smartproxy.org/register/?invitation_code=A2DZGJ
추천인코드 : A2DZGJ
SmartProxy를 활용해서 Cloudflare Workers에 연동하기 위해서 서칭을 조금 해봤으나, 레딧에도 별다른 자료가 없어서 대략적인 코드를 공유한다. 네이버쇼핑을 크롤링하는 예시 코드이다.
이 방식은 Workers내부에서 외부웹사이트를 접근할때 사용하는 fetch() 대신
Socks5 방식으로 프록시 서버를 경유하여 수집하는 방법이다.
import { socksFetch } from "cf-fetch-socks";
export default {
async fetch(request, env) {
try {
const proxy =
`socks5://${encodeURIComponent(env.PROXY_USERNAME)}` +
`:${encodeURIComponent(env.PROXY_PASSWORD)}` +
`@${env.PROXY_HOST}:${env.PROXY_PORT}`;
const url =
"https://search.shopping.naver.com/search/all" +
"?query=" +
encodeURIComponent("맥북");
const response = await socksFetch(url, {
proxy,
method: "GET",
headers: {
"User-Agent":
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) " +
"AppleWebKit/537.36 (KHTML, like Gecko) " +
"Chrome/150.0.0.0 Safari/537.36",
"Accept-Language":
"ko-KR,ko;q=0.9,en;q=0.8",
"Accept":
"text/html,application/xhtml+xml"
}
});
const body =
await response.text();
return new Response(body, {
status: response.status,
headers: {
"Content-Type":
response.headers.get("Content-Type") ??
"text/plain; charset=utf-8"
}
});
} catch (error) {
return Response.json(
{
success: false,
error: error.message
},
{
status: 500
}
);
}
}
};
코드 내용을 보면 env.{변수명} 이런식으로 되어 있는 형식을 볼 수 있는데,
Workers 및 Pages의 설정페이지에서 직접 비밀키를 아래와 같이 등록하면 안전하게 관리할 수 있다.

'IT' 카테고리의 다른 글
| 무료 OCR API 서버 - OCR http server (부제. AI기반 서비스에서 토큰을 절약하기 위한 전략) (0) | 2026.07.21 |
|---|---|
| AI Native 개발에 대한 고찰 (1) | 2026.07.18 |
| 클로드코드 머신용 맥미니 원격 셋팅하는 방법 (0) | 2026.04.03 |
| 치앙마이의 코워킹 스페이스별 인터넷속도 비교 및 분석 (Comparison of network performance by co-working space in Chiang Mai) (2) | 2026.01.27 |
| 시놀로지에 S3 Bucket을 서비스하는 방법 (MinIO를 대신해서 RustFS) (0) | 2026.01.07 |



