← 블로그로 돌아가기

Cloudflare Workers IP 지오로케이션: 캐싱과 콜드 스타트

Cloudflare Workers IP 지오로케이션: 캐싱과 콜드 스타트

Cloudflare Workers IP 지오로케이션이란 Worker 안에서 방문자의 위치 데이터를 읽는 것을 말하며, 내장된 request.cf 객체에서 읽거나 엣지에서 외부 IP 인텔리전스 API를 호출하는 방식이 있습니다. 두 접근 방식은 서로 다른 질문에 답하므로, 그 위에 무언가를 만들기 전에 각각의 캐싱과 콜드 스타트 동작을 이해해 둘 가치가 있습니다.

Workers가 무료로 제공하는 것

Worker에 도달하는 모든 요청에는 Cloudflare가 채워 넣은 request.cf 객체가 담겨 있습니다. 여기에는 방문자의 국가, 도시, 지역, 좌표, 시간대, ASN, AS 조직과 함께 요청을 처리한 데이터센터를 나타내는 colo 필드가 포함됩니다. CF-IPCountry 헤더도 국가 코드를 전달합니다. 이 데이터는 코드가 실행되기 전에 붙여지므로 추가 서브리퀘스트도, 추가 지연 시간도 없습니다.

한계는 범위입니다. request.cf는 현재 요청에 연결한 클라이언트만 설명하며 그 외에는 아무것도 알려 주지 않습니다. 로그 줄, 폼 필드, 웹훅 페이로드, X-Forwarded-For 체인에 나타나는 IP 주소에 대해서는 알려 줄 수 없고, VPN, Tor, 악용 플래그 같은 평판 신호도 없습니다. 임의의 주소를 보강해야 하는 순간부터는 API를 호출하게 되며, 캐싱에 관한 결정도 여기서 시작됩니다.

엣지에서 보강 데이터 캐싱하기

Worker에서 하는 IP 조회는 서브리퀘스트이므로, 캐시되지 않은 조회마다 요청 경로에 네트워크 왕복이 추가됩니다. Cloudflare는 결과를 캐시할 여러 위치를 제공합니다. Cache API(데이터센터별이며 전역으로 복제되지 않음), KV(전역에서 읽을 수 있지만 최종 일관성이며 쓰기가 전파되는 데 시간이 걸림), 그리고 조율된 단일 사본이 필요할 때의 Durable Objects입니다. 어느 것도 그대로 끼워 쓰는 전역 캐시는 아니므로 감내할 수 있는 수준에 따라 고르세요. Cache API는 읽기 중심 조회에 가장 단순하고 빠르며, KV는 모든 위치에서 보이길 원하는 값에 적합합니다.

더 유용한 설계 결정은 필드별 TTL입니다. IP 인텔리전스 데이터는 균일하게 노화되지 않기 때문입니다. 국가와 ASN 할당은 주소 블록이 몇 달 또는 몇 년에 걸쳐 재할당되므로 느리게 바뀌어, 수 시간의 TTL이 합리적입니다. 평판 플래그는 다릅니다. ipto의 VPN, Tor, 악용 피드는 6시간마다 갱신되고 IP 및 ASN 데이터셋은 매일 갱신되므로, is_tor 같은 플래그를 몇 시간보다 오래 캐시하면 소스 자체보다 오래된 답을 제공하게 됩니다. 실용적인 분리 방법은 네트워크 사실(asn, asn_org, 국가, 도시)은 약 하루, 플래그(is_vpn, is_tor, is_abuser, is_datacenter)는 피드 주기를 넘지 않게 캐시하는 것입니다.

  • 정규화된 IP를 캐시 키로 사용합니다(IPv6의 경우 사용 사례가 호스트 단위가 아니라 네트워크 단위라면 /64를 키로 쓰는 것을 고려하세요).
  • 음성 결과도 캐시해서, 등재되지 않은 주소를 반복 조회할 때마다 API를 호출하지 않도록 합니다.
  • 보곤 결과를 실수로 공개 키로 캐시하지 마세요. 10.0.0.1 같은 사설 주소는 API 호출 없이 로컬에서 답할 수 있습니다.

Workers의 콜드 스타트

Workers는 컨테이너가 아니라 V8 isolate에서 실행되므로, 콜드 스타트는 컨테이너 기반 함수에서 익숙한 수백 밀리초가 아니라 보통 몇 밀리초 수준입니다. 그래도 코드는 자체 초기화 비용을 부담합니다. 큰 번들, 큰 조회 테이블의 무거운 모듈 수준 파싱, 최상위 await는 모두 새 isolate에 대한 첫 요청에서 일어납니다. 해결책은 평범합니다. 번들을 작게 유지하고, 시작 시 큰 메모리 내 구조를 만들지 말고, 지오로케이션 데이터베이스 전체를 Worker 안에 넣는 대신 작은 API 호출 하나를 선호하세요.

기존 서버리스에서 사람들이 쓰는 워밍업 핑은 여기서는 대부분 낭비입니다. isolate는 Cloudflare의 일정에 따라 생성되고 제거되며, 핑은 한 위치에만 도달하고, 콜드 스타트 비용이 충분히 작아서 isolate를 살려 두는 것보다 조회 결과를 캐시하는 것이 훨씬 중요합니다. 무엇이든 최적화하기 전에 Workers 분석과 서브리퀘스트 주변에 직접 넣은 타이밍으로 먼저 측정하세요.

ipto와 함께 구성하기

합리적인 패턴은 연결한 클라이언트에 대한 즉각적이고 무료인 사실은 request.cf로 얻고, 더 필요할 때만 보강 API를 호출하는 것입니다. ipto의 API 문서는 국가, 도시, ASN, org, currency_code와 is_vpn, is_tor, is_abuser, is_datacenter, bogon/bogon_type 플래그를 반환하는 IP 조회 응답을 보여 줍니다. 가입 없이 무료이며 하루 1,000건의 무료 요청이 제공되므로, 키 관리 단계 없이 Worker를 프로토타이핑하기에 충분합니다.

조회 결과 주소가 호스팅 네트워크에 속한다고 나오면 ASN 조회에서 누가 운영하고 어떤 대역을 광고하는지 이어서 확인할 수 있습니다. 플래그가 지정된 트래픽은 VPN, Tor, 프록시 검사기가 is_vpn과 is_tor의 근거를 보여 주고, IP 악용 검사기가 교차 확인된 점수를 보여 줍니다. 도시 수준의 위치는 사람이 앉아 있는 곳이 아니라 네트워크가 등록되었거나 라우팅되는 곳의 추정이라는 점을 기억하세요. 이 한계는 도시 정확도에 한계가 있는 이유에서 설명합니다.

엣지는 조회를 빠르게 만들지만 기반 데이터를 더 정밀하게 만들지는 않습니다. request.cf와 모든 API 결과를 같은 종류의 증거로 다루고, 각각을 변화 속도에 맞춰 캐시하며, TTL은 엣지의 속도가 아니라 소스의 최신성이 결정하게 하세요.

명확한 답변

request.cf는 Cloudflare가 Worker의 모든 요청에 붙이는 객체입니다. 클라이언트의 국가, 도시, 지역, 좌표, 시간대, ASN, AS 조직과 요청을 처리한 colo가 포함됩니다.
아니요. request.cf 객체는 현재 요청에 연결한 클라이언트만 설명합니다. 로그나 페이로드에 있는 임의의 IP 주소를 보강하려면 Worker에서 IP 인텔리전스 API를 호출하고 결과를 캐시하세요.
국가와 ASN처럼 느리게 바뀌는 네트워크 사실은 약 하루, VPN, Tor, 악용 같은 평판 플래그는 소스 피드가 갱신되는 주기를 넘지 않게 캐시하세요. ipto는 위협 피드를 6시간마다, IP 및 ASN 데이터셋을 매일 갱신합니다.
← 블로그로 돌아가기