들어가며
웹사이트나 API의 접근을 특정 IP 주소로만 허용하거나 차단해야 하는 요구는 실무에서 매우 자주 등장합니다. 이 글에서는 엣지(Edge) 컴퓨팅을 활용해 IP 허용/차단 목록을 구현하는 방법을 소개합니다. 그 첫걸음으로 Cloudflare Workers부터 간단히 살펴보겠습니다.
Cloudflare Workers란?
Cloudflare Workers는 최근 몇 년간 빠르게 성장한 기술로, 2017년에 일반에 공개되었으며 이를 보완하는 Cloudflare KV 스토리지는 2019년에 출시되었습니다.
여기서는 깊은 내용까지 다루지 않고 핵심만 짚어보겠습니다. Cloudflare Workers를 사용하면 HTTP 요청을 엣지 레벨에서 가로채고, 직접 작성한 코드 스니펫을 실행해 요청과 응답을 자유롭게 조작할 수 있습니다. 또한 Cloudflare에 기본 내장된 KV 스토리지를 통해 키-값 형태의 데이터를 손쉽게 저장하고 조회할 수 있습니다. 별도의 설정 없이 클릭 한 번으로 테스트할 수 있는 플레이그라운드 환경도 제공되니, 간단히 맛보기에 좋습니다.
Upstash Redis REST API
다만 Cloudflare KV 스토리지만으로는 부족할 때가 있습니다. 개발자 입장에서는 세트(Set), 리스트(List)처럼 더 고급스러운 자료구조가 필요하거나, 백엔드 서버·API·SDK 클라이언트처럼 외부에서도 저장소에 접근해야 하는 경우가 많습니다. 그래서 최근 Upstash는 REST API 지원을 추가했습니다.
이제 Upstash Redis 데이터베이스에 다음과 같은 방식으로 접근할 수 있습니다:
- Cloudflare Workers 안에서 Upstash REST API 호출
- 터미널에서 redis-cli 사용
- 해당 프로그래밍 언어의 Redis 클라이언트 라이브러리 사용
데이터베이스 상세 페이지에서 connect 버튼을 클릭하면 샘플 코드와 명령어를 바로 확인할 수 있습니다.
애플리케이션 만들기
이번에 만들 애플리케이션의 목표는 다음과 같습니다.
Redis를 신뢰할 수 있는 단일 데이터 소스(Source of Truth)로 삼아, Cloudflare Worker에서 IP 허용/차단을 처리한다.
사전 준비물
- 서버리스 Redis 데이터베이스 1개 (Upstash 콘솔에서 생성 가능)
- Cloudflare 계정, 또는 CF Playground 사용
- 기본적인 JavaScript 지식
- Cloudflare Workers에 대한 기초 지식
참고: Upstash 데이터베이스를 생성할 때는 반드시 Global Database를 선택하세요. 글로벌 데이터베이스는 여러 리전에 데이터를 복제하여 엣지 함수에서의 접근 지연 시간을 크게 줄여줍니다.
이제 Cloudflare Worker를 생성하고 요청을 가로채 보겠습니다. 워커를 새로 만들면 기본적으로 샘플 코드가 함께 제공됩니다.
구현
먼저 방문자의 IP 주소를 가져오는 코드입니다:
async function handleRequest(request) {
const ip = request.headers.get("cf-connecting-ip");
return new Response(ip);
}
cf-connecting-ip 헤더를 통해 방문자의 IP 주소를 손쉽게 확인할 수 있습니다. 이제 이 IP가 허용 목록에 포함되어 있는지 검사해야 합니다. REST API 호출 한 번으로 코드를 확장해 보겠습니다.
async function handleRequest(request) {
const ip = request.headers.get("cf-connecting-ip");
res = await fetch(
"https://YOUR_DATABASE_ENDPOINT/sismember/allowed-set/" +
ip +
"?_token=YOUR_REST_API_TOKEN"
);
if ((await res.text()).includes("1")) {
return new Response(ip + " is allowed.");
}
return new Response(ip + " is not allowed.");
}
위 코드는 Upstash Redis 서버로 REST API 요청을 보내 해당 IP가 집합(Set)에 포함되어 있는지 확인합니다. 응답에 "1"이 포함되어 있으면 목록에 존재하는 것이고, 그렇지 않다면 허용되지 않은 IP입니다.
Redis 집합은 redis-cli를 통해 다음 명령으로 간편하게 업데이트할 수 있습니다:
sadd allowed-set $IP_ADDRESS
마무리 및 향후 계획
이제 REST API를 통해 어디서든 Redis 서버 인스턴스에 접근할 수 있습니다. Upstash REST API는 대부분의 Redis 명령어를 지원하므로, 자세한 내용은 공식 문서를 참고하시기 바랍니다. Cloudflare KV 스토리지는 키-값 딕셔너리 API에 종속적일 뿐만 아니라, 외부 서드파티 애플리케이션에서 접근하기도 쉽지 않습니다. 반면 Redis는 방대한 클라이언트 SDK와 redis-cli를 갖추고 있으며, Upstash를 이용하면 여기에 REST API까지 더할 수 있습니다.
이 간단한 애플리케이션은 Cloudflare Workers 위에서 동작하는 일종의 보안 게이트키퍼로 확장할 수 있습니다. 사용자는 Redis 데이터베이스에서 설정 값을 자유롭게 변경하고, Cloudflare Worker는 이를 실시간으로 읽어 반영하게 됩니다.