김솔비 블로그
기술 블로그

Cloudflare는 무엇을 해 주나: 도메인, DNS, 프록시, 터널

5분 읽기

TL;DR

  • 도메인은 어디서 사느냐(등록 업체)와 누가 이름을 풀어 주느냐(DNS)가 따로다. 가비아에서 사고 DNS는 Cloudflare에 맡길 수 있다.
  • Cloudflare DNS에는 프록시(주황 구름)와 DNS만(회색 구름) 두 가지 모드가 있다. 프록시를 켜면 방문자는 내 서버가 아니라 Cloudflare를 먼저 만난다.
  • Cloudflare Tunnel을 쓰면 공유기 포트를 하나도 열지 않고 집 서버를 인터넷에 공개할 수 있다.

들어가며

개인 프로젝트를 하나둘 만들다 보면 xxx.vercel.app 같은 기본 주소 대신 내 도메인을 붙이고 싶어진다. 도메인을 사면 바로 "네임서버", "A 레코드", "CNAME" 같은 말이 쏟아진다. 그리고 거의 모든 안내 글에 Cloudflare가 등장한다.

이 글은 Cloudflare가 정확히 무슨 일을 해 주는지, 개인 개발자가 어떤 기능을 쓰면 좋은지 정리한 것이다.

1. 도메인 등록과 DNS는 다른 일이다

도메인과 관련된 일은 크게 둘로 나뉜다.

일하는 곳비유
등록(Registrar)가비아, Cloudflare Registrar, 후이즈 등이름의 소유권 등기
DNS(이름 풀이)등록 업체의 기본 DNS, Cloudflare, Route 53 등이름 → 주소를 알려 주는 전화번호부

도메인을 산 곳과 DNS를 관리하는 곳은 같을 필요가 없다. 등록 업체 화면에서 네임서버를 바꾸면, 그 뒤로 "이 도메인의 주소는 어디냐"는 질문에는 새 네임서버가 답한다.

# 네임서버를 Cloudflare로 옮긴 도메인은 이렇게 보인다
$ dig +short NS example.com
xxx.ns.cloudflare.com.
yyy.ns.cloudflare.com.

가비아와 Cloudflare Registrar

  • 가비아: .kr처럼 국내 도메인을 사기 쉽고, 한국어 고객 지원과 국내 결제 수단을 쓸 수 있다.
  • Cloudflare Registrar: 도메인을 원가(등록 기관에 내는 값 그대로)로 판다. 갱신 비용이 오르지 않아서 .com 같은 도메인을 오래 들고 가기 좋다. 대신 DNS는 반드시 Cloudflare를 써야 하고, .kr처럼 지원하지 않는 확장자가 있다.

그래서 나는 둘 다 쓴다. 확장자와 가격을 보고 사는 곳은 고르되, DNS는 Cloudflare 한 곳에 모은다. 도메인이 여러 개여도 레코드를 같은 화면, 같은 방식으로 관리할 수 있다.

2. DNS 레코드 몇 가지

개인 프로젝트에서 자주 쓰는 레코드는 몇 개 안 된다.

레코드뜻예
A / AAAA이름 → IPv4 / IPv6 주소내 서버 IP를 직접 가리킬 때
CNAME이름 → 다른 이름blog → 호스팅 업체가 준 주소
TXT아무 글자도메인 소유 확인, 메일 발송 인증(SPF 등)
MX메일 받을 서버도메인 메일

서브도메인(blog., app. 등)마다 CNAME 하나씩 만들면, 도메인 하나로 여러 프로젝트를 나눠 붙일 수 있다.

3. 주황 구름과 회색 구름

Cloudflare DNS 레코드 옆에는 구름 아이콘이 있다. 이게 Cloudflare를 이해하는 핵심이다.

모드방문자가 받는 주소하는 일
DNS만 (회색)내 서버(또는 호스팅) 주소 그대로전화번호부 역할만
프록시 (주황)Cloudflare의 주소방문자 → Cloudflare → 내 서버. 중간에서 HTTPS, 캐시, 공격 차단을 해 준다

프록시를 켜면 좋은 점이 많다.

  • 원래 서버 주소가 숨겨진다. 방문자는 Cloudflare의 IP만 본다.
  • HTTPS 인증서를 Cloudflare가 처리한다.
  • DDoS 방어와 방화벽 규칙(국가 차단, 요청 수 제한 등)을 무료로 쓸 수 있다.
  • 정적 파일 캐시로 서버 부담이 준다.

반대로 끄는 게 나을 때도 있다. Vercel처럼 자체 CDN과 인증서를 가진 호스팅을 쓸 때는 보통 회색으로 둔다. 두 CDN이 겹치면 인증서 발급이나 캐시가 꼬일 수 있기 때문이다.

프록시 뒤에서 조심할 것

프록시를 켜면 서버 입장에서 요청을 보낸 상대가 Cloudflare가 된다. 두 가지를 챙겨야 한다.

  1. 방문자 IP: 서버가 보는 접속 IP는 Cloudflare의 IP다. 진짜 방문자 IP는 Cloudflare가 붙여 주는 CF-Connecting-IP 헤더에 있다. 이 헤더는 Cloudflare가 덮어쓰기 때문에, 방문자가 마음대로 적을 수 있는 X-Forwarded-For보다 믿을 수 있다.
  2. HTTPS 여부: 방문자는 HTTPS로 접속해도 서버는 평문 HTTP 요청을 받을 수 있다. Spring Boot라면 server.forward-headers-strategy 설정으로 X-Forwarded-Proto를 읽게 해야, 서버가 만드는 링크가 http://로 나가지 않는다.

4. Cloudflare Tunnel: 포트를 열지 않고 공개하기

집에 있는 서버(라즈베리파이, 남는 노트북 등)를 인터넷에 공개하는 전통적인 방법은 공유기 포트 포워딩이다. 하지만 이 방법은 문제가 많다.

  • 집 IP가 그대로 드러난다.
  • 열어 둔 포트로 전 세계의 스캐너가 찾아온다.
  • 통신사가 IP를 바꾸면 주소가 깨진다.

Cloudflare Tunnel은 방향을 뒤집는다. 집 서버에서 cloudflared라는 프로그램이 Cloudflare 쪽으로 먼저 연결을 맺고, 방문자의 요청은 그 연결을 타고 들어온다.

방문자 → Cloudflare ──(이미 열려 있는 바깥쪽 연결)── cloudflared → 집 서버(localhost)
  • 공유기 포트를 하나도 열지 않는다. 바깥에서 집으로 먼저 들어오는 연결이 없다.
  • 집 IP가 드러나지 않는다.
  • HTTPS, 방화벽 규칙, 접근 제한(Cloudflare Access) 같은 프록시 기능을 그대로 쓴다.
  • 무료다.

설정도 간단하다. 대시보드에서 터널을 만들고, 서버에 cloudflared를 설치해 토큰으로 연결한 뒤, "이 서브도메인 → 서버의 이 포트"를 지정하면 된다. DNS 레코드도 자동으로 만들어진다.

정리

기능언제 쓰나
Registrar원가로 오래 들고 갈 도메인
DNS도메인이 여러 개여도 한 곳에서 관리
프록시(주황)내 서버를 직접 공개할 때. 주소 숨기기, HTTPS, 공격 차단
DNS만(회색)자체 CDN이 있는 호스팅에 연결할 때
Tunnel집 서버를 포트 포워딩 없이 공개할 때

개인 개발자에게 Cloudflare는 "도메인 관리 화면"으로 시작해서, 쓰다 보면 집 서버를 안전하게 공개하는 문까지 되어 준다. 이걸 실제로 어떻게 엮었는지는 개인 프로젝트 인프라 설계에 정리했다.