작성일 댓글 남기기

[Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지] 7/16화: 1.1.1.1 WARP VPN 설정과 DNS 광고차단 완전 가이드

WARP와 DNS 필터링으로 보호되는 디바이스들

이 글은 「Cloudflare 완전 정복」 시리즈 7회입니다. 지난 6화에서 Zero Trust Access로 사설 포털을 만들었다면, 이번에는 내 모든 디바이스의 인터넷 트래픽 자체를 보호하는 개인 보안 스택을 쌓아봅니다. 주인공은 1.1.1.1, WARP, 그리고 DNS 필터링 — 세 가지 모두 무료입니다.

왜 DNS부터 바꿔야 하는가

인터넷에 접속할 때 가장 먼저 일어나는 일은 DNS 조회입니다. 브라우저에 주소를 입력하면 ISP(통신사)의 DNS 서버가 IP 주소를 알려주죠. 문제는 이 과정이 대부분 암호화되지 않은 평문으로 이루어진다는 겁니다.

  • ISP가 내 방문 사이트 목록을 전부 볼 수 있음
  • 카페 와이파이에서 DNS 스푸핑 공격에 노출
  • 통신사 DNS는 속도 최적화보다 비용 절감에 초점
  • 광고·추적 도메인을 차단할 방법이 없음

Cloudflare의 1.1.1.1은 이 모든 문제를 한 번에 해결합니다. 2018년 출시 이후 꾸준히 세계에서 가장 빠른 퍼블릭 DNS 자리를 지키고 있고, DNS-over-HTTPS(DoH)와 DNS-over-TLS(DoT)를 기본 지원합니다.

기존 DNS vs Cloudflare 1.1.1.1 암호화 DNS 비교

1.1.1.1 — 3분 만에 DNS 바꾸기

기본 DNS 주소

Cloudflare는 용도별로 세 가지 DNS 주소를 제공합니다.

  • 기본(필터 없음): 1.1.1.1 / 1.0.0.1 (IPv6: 2606:4700:4700::1111 / 2606:4700:4700::1001)
  • 악성코드 차단: 1.1.1.2 / 1.0.0.2 (1.1.1.1 for Families — Security)
  • 악성코드 + 성인콘텐츠 차단: 1.1.1.3 / 1.0.0.3 (1.1.1.1 for Families — Family)

자녀가 있는 가정이라면 공유기에 1.1.1.3을 설정하는 것만으로 별도 소프트웨어 없이 네트워크 전체에 콘텐츠 필터가 적용됩니다.

Windows 11 설정

설정 → 네트워크 및 인터넷 → Wi-Fi(또는 이더넷) → DNS 서버 할당에서 수동으로 전환합니다. 하지만 PowerShell이 더 빠릅니다.

# 관리자 권한 PowerShell
# 현재 네트워크 어댑터 확인
Get-NetAdapter | Where-Object Status -eq Up

# Wi-Fi 어댑터에 1.1.1.1 설정 (DoH 자동 활성화)
Set-DnsClientServerAddress -InterfaceAlias "Wi-Fi" `
  -ServerAddresses ("1.1.1.1","1.0.0.1")

# DNS-over-HTTPS 활성화 (Windows 11 22H2+)
Set-DnsClientDohServerAddress -ServerAddress "1.1.1.1" `
  -DohTemplate "https://cloudflare-dns.com/dns-query" `
  -AllowFallbackToUdp $false -AutoUpgrade $true

Set-DnsClientDohServerAddress -ServerAddress "1.0.0.1" `
  -DohTemplate "https://cloudflare-dns.com/dns-query" `
  -AllowFallbackToUdp $false -AutoUpgrade $true

# 확인
Resolve-DnsName cloudflare.com | Select-Object Name, IPAddress

Synology NAS DS+925에서 DNS 설정

# SSH 접속 후 DNS 확인
cat /etc/resolv.conf

# DSM 웹 UI 경로:
# 제어판 → 네트워크 → 일반 → 수동으로 DNS 서버 구성
# 기본 DNS: 1.1.1.1
# 보조 DNS: 1.0.0.1

DSM 7.2+에서는 웹 UI에서 직접 변경하는 것을 권장합니다. SSH로 /etc/resolv.conf를 직접 수정하면 재부팅 시 DSM이 덮어쓸 수 있습니다.

공유기(라우터) 레벨 설정 — 네트워크 전체 적용

개별 디바이스마다 설정하기 번거롭다면 공유기의 DHCP DNS를 1.1.1.1로 변경하세요. 연결된 모든 기기에 자동 적용됩니다.

  • 공유기 관리 페이지 접속 (보통 192.168.0.1 또는 192.168.1.1)
  • DHCP 설정 → DNS 서버 → 1.1.1.1 / 1.0.0.1 입력
  • 저장 후 연결된 기기 재접속

WARP — 무료 VPN 그 이상

DNS만 바꾸면 “어디에 접속하는지”는 보호되지만, 실제 통신 내용은 여전히 노출될 수 있습니다. 특히 카페·공항 같은 공공 와이파이에서요. WARP는 이 갭을 메웁니다.

WARP란 무엇인가

WARP는 Cloudflare가 만든 WireGuard 기반 VPN입니다. 일반 VPN과 다른 점이 있습니다.

  • 속도 저하 최소화: WireGuard 프로토콜 + Cloudflare 글로벌 네트워크(330+ 도시) 활용. 전통적 VPN 대비 체감 속도 차이가 거의 없음
  • IP 우회 목적이 아님: Netflix 지역 우회 같은 용도가 아닌, 순수 보안·프라이버시 목적. Cloudflare는 로그를 저장하지 않겠다고 공개 감사까지 받았음
  • 무료: 기본 WARP는 완전 무료. 유료 WARP+는 더 빠른 라우팅(Argo 네트워크) 제공
WARP 동작 모드 세 가지 비교

WARP 설치 및 설정

모바일(iOS/Android): 앱스토어에서 “1.1.1.1” 검색 → 설치 → 토글 한 번이면 끝입니다.

Windows/macOS 데스크톱:

# Windows — winget으로 설치
winget install Cloudflare.Warp

# macOS — brew로 설치
brew install --cask cloudflare-warp

# 설치 후 시스템 트레이(메뉴 바)에서 톱니바퀴 → 연결 클릭

Linux (Ubuntu/Debian):

# Cloudflare GPG 키 추가
curl -fsSL https://pkg.cloudflareclient.com/pubkey.gpg \
  | sudo gpg --yes --dearmor -o /usr/share/keyrings/cloudflare-warp-archive-keyring.gpg

# 저장소 추가
echo "deb [signed-by=/usr/share/keyrings/cloudflare-warp-archive-keyring.gpg] \
  https://pkg.cloudflareclient.com/ $(lsb_release -cs) main" \
  | sudo tee /etc/apt/sources.list.d/cloudflare-client.list

sudo apt update && sudo apt install cloudflare-warp

# 등록 및 연결
warp-cli registration new
warp-cli connect

# 상태 확인
warp-cli status

WARP 동작 모드 이해하기

WARP 클라이언트는 세 가지 모드를 제공합니다.

  • 1.1.1.1 only (DNS만): DNS 쿼리만 Cloudflare로. 가장 가벼움
  • WARP (기본): 모든 트래픽을 WireGuard 터널로 암호화. 공공 와이파이에서 필수
  • WARP+ (유료): Argo Smart Routing으로 최적 경로 선택. 해외 서버 접속 시 체감 향상

대부분의 사용자에게는 기본 WARP면 충분합니다. 일상 웹 브라우징에서 속도 차이를 체감하기 어려울 정도로 잘 최적화되어 있습니다.

DNS 필터링 — 광고와 추적기를 네트워크 레벨에서 차단

1.1.1.1 for Families로 기본적인 필터링은 가능하지만, 내가 원하는 도메인만 골라서 차단하고 싶다면 Zero Trust의 Gateway DNS 필터링을 사용합니다. 6화에서 다룬 Zero Trust 대시보드를 다시 열어봅시다.

Gateway DNS 정책 설정

Zero Trust 대시보드(https://one.dash.cloudflare.com)에서 설정합니다.

  1. Gateway → Firewall Policies → DNS 진입
  2. Add a policy 클릭
  3. 정책 이름: Block Ads and Trackers
  4. 트래픽 선택자 구성:
    • Selector: Security Categories → Operator: in → Value: Spyware, Phishing, Malware
    • 또는 Selector: Content Categories → Value: Advertisements & Trackers
  5. Action: Block
  6. Save

이렇게 하면 Cloudflare가 관리하는 위협 인텔리전스 데이터베이스를 기반으로 광고·추적·악성 도메인이 DNS 레벨에서 차단됩니다. Pi-hole과 비슷하지만 별도 하드웨어 없이, 클라우드에서 동작합니다.

Gateway DNS 필터링 정책 동작 흐름

커스텀 차단 리스트 추가

특정 도메인을 수동으로 차단하거나, 외부 차단 리스트를 가져올 수도 있습니다.

# Gateway → Lists에서 커스텀 리스트 생성
# 이름: my-blocklist
# 타입: Domains
# 수동 입력 또는 CSV 업로드

# 예시 — 자주 차단하는 도메인
ads.example.com
tracker.example.net
telemetry.example.org

생성한 리스트를 DNS 정책의 Selector에서 Domain → in list → my-blocklist로 연결하면 적용됩니다.

WARP 클라이언트를 Gateway에 연결하기

개인용 WARP와 Zero Trust Gateway를 연결하면, WARP가 켜진 모든 디바이스에 DNS 필터링 정책이 자동 적용됩니다.

# Zero Trust 대시보드에서
# Settings → WARP Client → Device enrollment permissions

# 팀 이름(예: myhomelab) 설정 후
# WARP 클라이언트에서 로그인:
# 설정 → 계정 → Cloudflare Zero Trust 로그인
# 팀 도메인: myhomelab.cloudflareaccess.com 입력

로그인 후 WARP 아이콘이 “Zero Trust” 모드로 전환됩니다. 이제부터 이 디바이스의 모든 DNS 쿼리는 Gateway 정책을 거칩니다.

실전 구성 — 개인 보안 스택 아키텍처

지금까지 배운 것을 조합하면 다음과 같은 보안 스택이 완성됩니다.

┌─────────────────────────────────────────────────────┐
│                    내 디바이스                        │
│  ┌───────────┐   ┌──────────┐   ┌────────────────┐  │
│  │  WARP     │──▶│ Gateway  │──▶│ 1.1.1.1 DNS    │  │
│  │  (암호화)  │   │ (필터링)  │   │ (DoH/DoT)      │  │
│  └───────────┘   └──────────┘   └────────────────┘  │
│        │                                             │
│        ▼                                             │
│  ┌─────────────────────────────────────────┐         │
│  │  Zero Trust Access (6화)                │         │
│  │  → 홈랩 NAS/서버 안전 접근               │         │
│  └─────────────────────────────────────────┘         │
└─────────────────────────────────────────────────────┘

각 레이어의 역할을 정리하면:

  • 1.1.1.1 (DNS): 모든 DNS 쿼리를 암호화. ISP 스누핑 방지
  • Gateway (필터링): 광고·추적·악성 도메인을 DNS 단계에서 차단
  • WARP (VPN): 전체 트래픽 암호화. 공공 와이파이 보호
  • Zero Trust Access (6화): 홈랩 서비스에 인증된 접근만 허용

5화의 Tunnel이 “집 서버를 안전하게 내보내는 것”이었다면, 7화의 WARP+Gateway는 “나를 안전하게 보호하는 것”입니다. 두 방향이 합쳐져야 완전한 보안 스택이 됩니다.

Mac Studio 홈랩 — WARP CLI로 상시 보호

Mac Studio처럼 GUI 없이 운영하는 홈랩 서버에서도 WARP CLI로 보호할 수 있습니다.

# macOS — WARP CLI 상태 확인
warp-cli status

# Zero Trust 팀에 등록
warp-cli registration new
warp-cli teams-enroll myhomelab

# 연결
warp-cli connect

# 부팅 시 자동 연결 (macOS LaunchAgent)
# /Library/LaunchDaemons/com.cloudflare.warp.plist 이 설치 시 자동 생성됨
# 별도 설정 불필요 — 설치 후 자동 시작

DNS 쿼리 로그 확인 — 뭐가 차단됐는지 보기

Gateway에 연결된 상태라면 Zero Trust 대시보드에서 모든 DNS 쿼리 로그를 확인할 수 있습니다.

Logs → Gateway → DNS에서 시간대별 쿼리 목록, 차단된 도메인, 카테고리를 볼 수 있습니다. 어떤 앱이 몰래 추적 서버에 접속하는지 적나라하게 드러나죠.

  • 차단된 쿼리는 빨간색으로 표시
  • 도메인별·디바이스별·시간대별 필터 가능
  • 무료 플랜도 최근 24시간 로그 제공

처음 켜고 하루 정도 지나서 로그를 보면 놀랄 겁니다. 평범한 스마트폰 하나가 하루에 수백 건의 광고·추적 도메인에 접속하고 있다는 사실을요.

WARP vs 일반 VPN vs Pi-hole — 비교

항목 WARP (무료) 일반 VPN (유료) Pi-hole
월 비용 0원 5,000~15,000원 전기세 (라즈베리파이)
DNS 암호화 DoH/DoT 업체마다 다름 별도 설정 필요
광고 차단 Gateway 연동 시 일부 업체만 핵심 기능
트래픽 암호화 WireGuard OpenVPN/WireGuard 없음
외부에서 사용 가능 가능 홈 네트워크만
IP 우회 제한적 핵심 기능 불가
하드웨어 필요 없음 없음 라즈베리파이 등

WARP+Gateway 조합은 Pi-hole의 광고 차단 + VPN의 트래픽 암호화를 클라우드에서 무료로 제공하는 셈입니다. 별도 하드웨어를 유지할 필요가 없다는 것이 결정적 장점이죠.

월 비용 명세표

기능 Free WARP+ (개인) Zero Trust (팀)
1.1.1.1 DNS 무제한 무료
1.1.1.1 for Families 무제한 무료
WARP VPN 무료 (기본 라우팅) $4.99/월 (Argo 라우팅)
Gateway DNS 필터링 최대 50명 무료 $7/사용자/월 (50명 초과)
DNS 쿼리 로그 24시간 보존 30일 보존
커스텀 차단 리스트 최대 1,000개 항목 확장 가능
1인 홈랩 권장 조합 Free만으로 충분 — DNS + WARP + Gateway 50석 무료

개인 또는 가족 단위 사용이라면 Free 플랜으로 모든 기능을 사용할 수 있습니다. 50명 제한은 개인 홈랩에서 걸릴 일이 없죠.

트러블슈팅 — 자주 묻는 문제

WARP 켜면 특정 사이트가 안 돼요

WARP 클라이언트 설정에서 Split Tunnel(분할 터널링)을 사용하세요. 특정 도메인이나 IP 대역을 WARP 터널에서 제외할 수 있습니다.

# Zero Trust 대시보드
# Settings → WARP Client → Device settings → 프로필 선택
# Split Tunnels → Manage
# "Exclude" 모드에서 제외할 도메인/IP 추가

# 예: 사내 VPN과 충돌 시 사내 IP 대역 제외
# 10.0.0.0/8
# 172.16.0.0/12

DNS 변경 후 확인하는 법

# 브라우저에서 접속
# https://1.1.1.1/help
# "Connected to 1.1.1.1" → Yes 확인
# "Using DNS over HTTPS (DoH)" → Yes 확인
# "Using DNS over TLS (DoT)" → Yes 확인 (둘 중 하나면 OK)

# 또는 터미널에서
nslookup -type=TXT debug.cloudflare-dns.com 1.1.1.1

NAS에서 WARP를 쓸 수 있나요?

Synology DSM에는 WARP 클라이언트가 공식 지원되지 않습니다. 대신 NAS의 DNS를 1.1.1.1로 설정하고, Tunnel(5화)과 Access(6화)로 보호하는 것이 정석입니다. NAS 자체의 트래픽 암호화가 필요하다면 Docker로 WireGuard를 올리는 방법도 있지만, 대부분의 경우 DNS 레벨 보호만으로 충분합니다.

정리 — 5분이면 완성되는 보안 스택

오늘 다룬 내용을 순서대로 정리합니다.

  1. 공유기 DNS를 1.1.1.1로 변경 → 집 전체 DNS 암호화 (2분)
  2. 휴대폰·PC에 WARP 설치 → 외부에서도 트래픽 암호화 (2분)
  3. Zero Trust Gateway에 DNS 정책 추가 → 광고·추적·악성 도메인 차단 (5분)
  4. WARP를 Gateway에 연결 → 모든 디바이스에 정책 자동 적용 (1분)

총 10분, 비용 0원. 5화의 Tunnel로 홈 서버를, 6화의 Access로 사설 포털을, 그리고 7화의 WARP+Gateway로 내 디바이스 전체를 보호하는 3중 방어가 완성됐습니다.

다음 8화에서는 Cloudflare R2 — AWS S3 대체 오브젝트 스토리지를 다룹니다. 송신 비용(egress) 0원이라는 파격적인 가격 정책과, 홈랩 백업·미디어 서빙에 활용하는 실전 방법을 알아봅니다.

이미지는 Leonardo AI 로 생성되었습니다.

이미지는 Claude AI 로 생성되었습니다.


📚 시리즈: Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지 (총 16화 중 7화)
이전 6화  (다음 차수는 아직 게시되지 않았습니다)
작성일 댓글 한 개

[Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지] 6/16화: Cloudflare Zero Trust Access 설정: 재택근무 보안 완전 가이드

Zero Trust Access로 보호된 홈 네트워크 일러스트

이 글은 「Cloudflare 완전 정복」 시리즈 6회입니다. 지난 5화에서 Cloudflare Tunnel로 공유기 포트포워딩 없이 집 서버를 외부에 공개하는 방법을 다뤘습니다. 터널을 뚫었으니 이제 누구나 접속할 수 있는데… 잠깐, 그게 정말 괜찮을까요?

오늘은 그 터널 위에 Zero Trust Access라는 보안 관문을 세워, 허가된 사람만 통과시키는 사설 포털을 만들어 보겠습니다. 비밀번호를 따로 만들 필요도 없습니다. Google 계정이나 GitHub 계정, 혹은 이메일 일회용 코드(OTP)만으로 충분합니다.

VPN 시대는 끝났다 — Zero Trust가 대세인 이유

회사에서 재택근무를 하려면 VPN부터 켜야 했습니다. 느리고, 끊기고, IT팀한테 매번 요청해야 하고. Zero Trust 모델은 이 불편을 근본적으로 뒤집습니다.

전통 VPN vs. Zero Trust 비교

  • 전통 VPN: 네트워크 경계 안에 들어오면 모든 자원에 접근 가능. 한 번 뚫리면 내부 전체가 위험.
  • Zero Trust: 모든 요청을 개별 검증. 네트워크 위치가 아니라 사용자 신원디바이스 상태로 접근 허용 여부를 판단.

쉽게 비유하면 VPN은 아파트 현관 비밀번호이고, Zero Trust는 각 호수 앞에 선 경비원입니다. 현관을 뚫어도 각 집 문 앞에서 다시 신분증을 확인하는 셈이지요.

Cloudflare는 이 Zero Trust 모델을 무료 플랜에서 최대 50명까지 제공합니다. 홈랩 운영자나 소규모 팀에게는 사실상 무료로 엔터프라이즈급 보안을 쓸 수 있다는 뜻입니다.

Cloudflare Zero Trust Access 아키텍처 구성도

Cloudflare Access 핵심 개념 3가지

실습에 들어가기 전에 꼭 알아야 할 세 가지 개념을 정리합니다.

1. 애플리케이션(Application)

보호할 대상입니다. NAS 관리자 페이지, Grafana 대시보드, 내부 위키 등 URL 단위로 하나의 애플리케이션을 정의합니다. nas.example.com이면 하나, grafana.example.com이면 또 하나입니다.

2. 정책(Policy)

누가 들어올 수 있는지를 규칙으로 정의합니다. “Gmail이 @example.com인 사람만 허용”, “GitHub 조직 멤버만 허용”, “특정 국가에서만 허용” 같은 조건을 조합할 수 있습니다.

3. 인증 수단(Identity Provider, IdP)

사용자가 자신을 증명하는 방법입니다. Cloudflare Access는 자체 비밀번호 DB를 갖지 않습니다. 대신 Google, GitHub, Microsoft, Okta 같은 외부 인증 제공자에 인증을 위임합니다. 가장 간편한 것은 이메일 OTP — 이메일 주소를 입력하면 일회용 코드가 날아오고, 그걸 입력하면 끝입니다.

사전 준비: 5화의 터널이 살아 있어야 합니다

이번 실습은 5화에서 만든 Cloudflare Tunnel 위에 Access 정책을 얹는 구조입니다. 아직 터널을 설정하지 않았다면 5화를 먼저 따라해 주세요. 최소 요건은 다음과 같습니다.

  • Cloudflare에 등록된 도메인 1개 (예: example.com)
  • cloudflared 데몬이 Synology NAS 또는 Mac Studio에서 실행 중
  • 터널을 통해 하나 이상의 서비스가 외부에 공개된 상태 (예: nas.example.com → NAS DSM 5000번 포트)

Step 1: Zero Trust 대시보드 진입

Cloudflare 대시보드에서 일반 DNS/캐시 설정과 Zero Trust 설정은 입구가 다릅니다. 처음 방문하면 헷갈리기 쉬우니 정확한 경로를 안내합니다.

  1. one.dash.cloudflare.com에 접속합니다.
  2. 왼쪽 메뉴에서 Access → Applications를 클릭합니다.
  3. 처음이라면 팀 이름(예: myhomelabteam)을 설정하라는 안내가 나옵니다. 이 이름은 로그인 URL에 포함됩니다: myhomelabteam.cloudflareaccess.com

팀 이름은 나중에 바꿀 수 있지만, 짧고 기억하기 쉬운 것으로 정하세요. 이 URL을 북마크해두면 모든 보호된 서비스의 로그인 상태를 한 곳에서 관리할 수 있습니다.

Step 2: 인증 수단(IdP) 설정 — Google·GitHub·OTP

Access 정책을 만들기 전에 “사용자가 어떤 방법으로 로그인할 것인가”를 먼저 정해야 합니다. Zero Trust 대시보드 → Settings → Authentication에서 설정합니다.

방법 A: 이메일 OTP (가장 간편, 기본 제공)

별도 설정이 필요 없습니다. Cloudflare가 기본으로 One-time PIN을 제공합니다. 사용자가 이메일을 입력하면 6자리 코드가 발송되고, 이를 입력하면 인증 완료. 외부 IdP 연동이 번거로운 개인 사용자에게 가장 추천하는 방법입니다.

방법 B: Google 계정 연동

Google OAuth를 사용하면 “Google로 로그인” 버튼이 Access 로그인 화면에 나타납니다. 설정 절차:

  1. Google Cloud Console → APIs & Services → Credentials로 이동
  2. OAuth 2.0 Client ID를 생성합니다. 애플리케이션 유형은 Web application.
  3. 승인된 리디렉션 URI에 다음을 추가합니다:
https://myhomelabteam.cloudflareaccess.com/cdn-cgi/access/callback

myhomelabteam 부분을 본인의 팀 이름으로 바꾸세요.

  1. 생성된 Client IDClient Secret을 복사합니다.
  2. Cloudflare Zero Trust 대시보드 → Settings → Authentication → Add newGoogle 선택 후 Client ID와 Secret을 붙여넣습니다.
  3. Test 버튼으로 연동을 확인합니다.

방법 C: GitHub 계정 연동

개발자라면 GitHub이 더 자연스러울 수 있습니다. 특히 GitHub Organization 멤버십으로 접근 제어를 하고 싶다면 이 방법이 유리합니다.

  1. GitHub → Settings → Developer settings → OAuth Apps로 이동
  2. New OAuth App을 클릭합니다.
  3. 필드를 채웁니다:
  • Application name: Cloudflare Access (자유)
  • Homepage URL: https://myhomelabteam.cloudflareaccess.com
  • Authorization callback URL: https://myhomelabteam.cloudflareaccess.com/cdn-cgi/access/callback
  1. 생성된 Client ID와 Client Secret을 Cloudflare Zero Trust 대시보드에 입력합니다.

: 여러 IdP를 동시에 활성화할 수 있습니다. 로그인 화면에 “Google로 로그인”, “GitHub으로 로그인”, “이메일 OTP” 버튼이 모두 표시됩니다. 가족이나 팀원에 따라 편한 방법을 선택하게 해주면 됩니다.

Cloudflare Access 대시보드 애플리케이션 설정 화면

Step 3: 첫 번째 Access 애플리케이션 — NAS DSM 보호하기

이제 본격적으로 Synology NAS 관리자 페이지(DSM)에 Access 보호를 씌워 보겠습니다. 5화에서 nas.example.com으로 DSM을 터널로 공개한 상태라고 가정합니다.

대시보드에서 설정하기

  1. Zero Trust 대시보드 → Access → Applications → Add an application
  2. 유형은 Self-hosted를 선택합니다.
  3. 기본 정보를 입력합니다:
  • Application name: Synology NAS
  • Session Duration: 24 hours (하루에 한 번만 로그인)
  • Application domain: nas.example.com
  1. Next를 눌러 정책 설정으로 넘어갑니다.
  2. 정책 이름: Allow family
  3. Action: Allow
  4. Include 규칙에 조건 추가:
  1. Save를 누르면 즉시 적용됩니다.

이제 nas.example.com에 접속하면 Cloudflare 로그인 화면이 먼저 나타납니다. 등록한 이메일로 인증해야만 NAS DSM에 도달할 수 있습니다.

cloudflared CLI로 설정하기 (Synology NAS SSH 접속)

대시보드 UI 대신 터미널에서 설정하는 것을 선호한다면 cloudflared 터널 설정 파일에 access 정책을 연결할 수도 있습니다. 다만 Access 애플리케이션과 정책 자체는 API 또는 Terraform으로 관리하는 것이 일반적입니다. 실습에서는 대시보드 설정을 권장하되, 자동화가 필요한 분을 위해 API 호출 예시를 남깁니다.

Synology NAS에 SSH로 접속한 뒤 다음을 실행하세요:

# Cloudflare API 토큰이 필요합니다 (Zero Trust 편집 권한 포함)
export CF_API_TOKEN="your-api-token-here"
export CF_ACCOUNT_ID="your-account-id"

# Access 애플리케이션 목록 조회
curl -s -H "Authorization: Bearer $CF_API_TOKEN" \
  "https://api.cloudflare.com/client/v4/accounts/$CF_ACCOUNT_ID/access/apps" \
  | python3 -m json.tool

API를 통한 전체 CRUD는 Cloudflare 공식 문서의 Access API 섹션을 참조하세요. 대부분의 홈랩 사용자에게는 대시보드 설정으로 충분합니다.

Step 4: 정책을 정교하게 — 다양한 규칙 조합

이메일 허용만으로는 단순합니다. 실무에서는 여러 조건을 조합해 더 정밀한 접근 제어를 구성합니다.

이메일 도메인으로 팀 전체 허용

회사 도메인이 @mycompany.com이라면:

  • Selector: Emails ending in
  • Value: @mycompany.com

이 한 줄이면 @mycompany.com 메일을 가진 모든 직원이 접속할 수 있습니다. 퇴사자의 Google Workspace 계정이 비활성화되면 자동으로 접근도 차단됩니다.

GitHub 조직 멤버만 허용

  • Selector: GitHub Organizations
  • Value: my-org-name

오픈소스 프로젝트의 내부 도구를 팀원에게만 공개할 때 유용합니다.

국가 제한 추가 (Require 규칙)

정책에는 Include(OR 조건), Require(AND 조건), Exclude(차단) 세 가지 규칙 그룹이 있습니다.

  • Include: 이 중 하나라도 만족하면 통과 후보 (OR)
  • Require: 반드시 모두 만족해야 함 (AND)
  • Exclude: 하나라도 해당되면 무조건 차단

예를 들어 “한국에서만 접속 가능한 가족 전용 NAS”를 만들려면:

이렇게 하면 등록된 이메일로 인증하더라도 한국 밖에서는 접속이 차단됩니다. 해외 여행 중 접속이 필요하면 정책에서 국가 조건을 일시적으로 해제하면 됩니다.

Bypass 정책 — 특정 경로 열어두기

헬스체크나 API 콜백처럼 인증 없이 접근해야 하는 경로가 있을 수 있습니다. 이때 Bypass 정책을 별도로 만듭니다:

  • Action: Bypass
  • Include: Everyone
  • 추가 설정: Path에 /api/health 지정

정책 평가는 위에서 아래 순서로 이루어집니다. Bypass 정책을 맨 위에 두면 해당 경로는 인증을 건너뛰고, 나머지 경로는 Allow 정책을 통해 인증을 거칩니다.

Step 5: 여러 서비스를 한번에 보호하기

홈랩에 NAS만 있는 건 아닙니다. Grafana, Home Assistant, Jellyfin, Portainer, VS Code Server… 서비스마다 서브도메인을 하나씩 할당했다면 각각에 Access 애플리케이션을 만들 수도 있지만, 와일드카드를 활용하면 훨씬 간편합니다.

와일드카드 애플리케이션

Application domain에 *.example.com을 입력하면 모든 서브도메인에 동일한 Access 정책이 적용됩니다.

  • nas.example.com → 보호됨
  • grafana.example.com → 보호됨
  • jellyfin.example.com → 보호됨

주의: 와일드카드 애플리케이션과 개별 서브도메인 애플리케이션이 동시에 존재하면, 더 구체적인 규칙이 우선합니다. 예를 들어 Jellyfin은 가족 전체에게 열어두고 싶다면:

  1. *.example.com → 본인 이메일만 Allow (엄격)
  2. jellyfin.example.com → 가족 이메일 전체 Allow (느슨)

이렇게 하면 Jellyfin만 별도 정책을 적용받고, 나머지는 와일드카드 정책을 따릅니다.

Access Group으로 정책 재사용하기

여러 애플리케이션에 같은 사용자 그룹을 반복 지정하는 건 번거롭습니다. Access Group을 만들면 한 번 정의한 그룹을 여러 정책에서 참조할 수 있습니다.

  1. Zero Trust 대시보드 → Access → Access Groups → Create a group
  2. 그룹 이름: Family
  3. Include: Emails = [email protected], [email protected], [email protected]
  4. 저장 후, 각 애플리케이션 정책에서 Selector를 Access Groups로 바꾸고 Family를 선택

가족 구성원이 바뀌면 그룹만 수정하면 모든 애플리케이션에 일괄 반영됩니다.

Cloudflare Access 로그인 인증 흐름도

Step 6: Service Token — 사람이 아닌 시스템의 접근

모든 접근이 사람이 하는 건 아닙니다. 모니터링 봇이 NAS 상태를 체크하거나, CI/CD 파이프라인이 내부 API를 호출할 수도 있습니다. 이런 기계 대 기계(M2M) 통신에는 Service Token을 사용합니다.

Service Token 만들기

  1. Zero Trust 대시보드 → Access → Service Auth → Create Service Token
  2. 토큰 이름: monitoring-bot
  3. 기간: 1 year (또는 Non-expiring — 보안상 유한 기간 권장)
  4. Generate token을 클릭하면 Client IDClient Secret이 표시됩니다.

중요: Client Secret은 이 순간에만 볼 수 있습니다. 반드시 안전한 곳에 저장하세요.

Service Token으로 접근하기

HTTP 요청에 두 개의 헤더를 추가하면 Access 인증을 통과할 수 있습니다:

# Service Token을 이용한 API 호출 예시
curl -H "CF-Access-Client-Id: your-client-id.access" \
     -H "CF-Access-Client-Secret: your-client-secret" \
     https://nas.example.com/api/health

정책에 Service Token 규칙 추가

해당 애플리케이션의 정책에 Service Token 허용 규칙을 추가해야 합니다:

  • 새 정책 생성: 이름 Allow monitoring bot
  • Action: Service Auth
  • Include: Selector = Service Token, Value = monitoring-bot

이 정책은 해당 Service Token을 가진 요청만 통과시킵니다. 사람 사용자의 정책과 분리되므로, 봇의 접근 범위를 독립적으로 관리할 수 있습니다.

Step 7: 브라우저에서 SSH·VNC 접속하기

Cloudflare Access의 숨은 강점 중 하나가 Browser Rendering입니다. SSH나 VNC 클라이언트를 설치할 필요 없이, 웹 브라우저에서 바로 터미널을 열거나 원격 데스크톱에 접속할 수 있습니다.

SSH 브라우저 렌더링 설정

  1. 5화에서 만든 터널에 SSH 서비스를 추가합니다. 터널 설정(대시보드 또는 config 파일)에서:
# config.yml 예시 (cloudflared 터널 설정)
ingress:
  - hostname: ssh.example.com
    service: ssh://localhost:22
  - hostname: nas.example.com
    service: http://localhost:5000
  - service: http_status:404
  1. Access 애플리케이션을 만들 때 Application domainssh.example.com을 지정합니다.
  2. 설정 하단의 Additional settings에서 Browser renderingSSH로 선택합니다.
  3. 정책을 설정하고 저장합니다.

이제 ssh.example.com에 브라우저로 접속하면, Access 로그인을 거친 후 웹 기반 터미널이 열립니다. PuTTY나 터미널 앱 없이도 NAS에 SSH 접속이 가능합니다. 카페에서 아이패드로 서버 점검해야 할 때 특히 유용합니다.

VNC 브라우저 렌더링 설정

VNC도 동일한 패턴입니다:

# config.yml에 VNC 서비스 추가
ingress:
  - hostname: vnc.example.com
    service: tcp://localhost:5900
  - hostname: ssh.example.com
    service: ssh://localhost:22
  - hostname: nas.example.com
    service: http://localhost:5000
  - service: http_status:404

Access 애플리케이션에서 Browser rendering을 VNC로 설정하면 브라우저에서 원격 데스크톱이 열립니다.

Synology NAS 실전 — 전체 설정 재현

여기까지의 내용을 Synology NAS DS+925에서 처음부터 끝까지 재현해 보겠습니다. 5화에서 cloudflared Docker 컨테이너가 이미 돌고 있다고 가정합니다.

1단계: 터널에 서비스 매핑 확인

Synology NAS에 SSH로 접속합니다:

# SSH 접속 (Synology DSM → 제어판 → 터미널 및 SNMP에서 SSH 활성화)
ssh [email protected]

# cloudflared 컨테이너 상태 확인
sudo docker ps | grep cloudflared

# 터널 상태 확인
sudo docker exec cloudflared cloudflared tunnel info

2단계: Zero Trust 대시보드에서 Access 설정

대시보드 조작은 웹 UI에서 진행합니다. 위의 Step 1~5를 순서대로 따릅니다:

  1. one.dash.cloudflare.com 접속
  2. 팀 이름 설정 (최초 1회)
  3. IdP 추가 (OTP는 기본 제공, Google/GitHub은 선택)
  4. 애플리케이션 추가: nas.example.com → Self-hosted
  5. 정책 추가: Allow, Emails = 허용할 주소

3단계: 접속 테스트

# 터미널에서 테스트 (Access 로그인 화면이 나오는지 확인)
curl -I https://nas.example.com

# 예상 응답: HTTP/1.1 302 Found
# Location: https://myhomelabteam.cloudflareaccess.com/cdn-cgi/access/login/nas.example.com?...

302 리다이렉트가 Cloudflare 로그인 페이지로 향하면 정상입니다. 브라우저에서 접속하면 로그인 화면이 표시되고, 인증 후 NAS DSM에 도달합니다.

4단계: Mac Studio에서 cloudflared로 터널 인증 없이 접속

집 안의 Mac Studio에서 Access를 거치지 않고 직접 NAS에 접속하고 싶다면, cloudflared access 명령으로 로컬 프록시를 띄울 수 있습니다:

# Mac Studio 터미널에서 실행
cloudflared access tcp --hostname ssh.example.com --url localhost:2222

# 다른 터미널에서 SSH 접속
ssh -p 2222 admin@localhost

이 방법은 cloudflared가 Access 인증을 브라우저 팝업으로 처리한 뒤 로컬 포트로 트래픽을 중계합니다. 한 번 인증하면 세션이 유지되므로 반복 로그인이 필요 없습니다.

실전 시나리오: 재택근무 보안 포털 구성

가정이 아닌 실무에서 Zero Trust Access를 어떻게 활용하는지 시나리오를 하나 그려 보겠습니다.

시나리오: 5인 스타트업의 내부 도구 보호

사무실 NAS에 다음 서비스가 돌고 있습니다:

  • wiki.company.com — 사내 위키 (Outline)
  • git.company.com — Gitea 코드 저장소
  • monitor.company.com — Grafana 모니터링
  • admin.company.com — NAS 관리자 (DSM)

Access 설정 전략

서비스 정책 대상
wiki.company.com Allow @company.com 전체
git.company.com Allow @company.com 전체
monitor.company.com Allow DevOps 그룹 (3명)
admin.company.com Allow + Require 한국 CTO 1명 이메일만

이 구성의 장점:

  • VPN 없이 재택근무: 직원은 집에서 wiki.company.com을 열고 Google 계정으로 로그인하면 끝.
  • 퇴사 즉시 차단: Google Workspace에서 계정을 비활성화하면 Access 인증도 실패.
  • 역할 기반 접근: Grafana는 DevOps 그룹에게만, NAS 관리자는 CTO에게만.
  • 감사 로그: 누가 언제 어떤 서비스에 접속했는지 Zero Trust 대시보드에서 확인 가능.

App Launcher — 나만의 사설 포털 만들기

Access로 보호된 서비스가 여러 개면 URL을 일일이 기억하기 번거롭습니다. Cloudflare는 App Launcher라는 간이 포털 페이지를 제공합니다.

App Launcher 활성화

  1. Zero Trust 대시보드 → Settings → Authentication
  2. App Launcher 섹션에서 Manage 클릭
  3. 정책 추가: 포털에 접근할 수 있는 사용자를 정의 (예: @company.com)
  4. 저장하면 myhomelabteam.cloudflareaccess.com에 접속했을 때 보호된 앱 목록이 타일 형태로 표시됩니다.

각 Access 애플리케이션 설정에서 App Launcher visibility를 켜면 해당 앱이 포털에 나타납니다. 로고와 이름을 커스터마이즈할 수도 있습니다.

이것이 바로 “비밀번호 없는 사설 포털”의 완성입니다. 별도의 SSO 솔루션을 구축하거나 비밀번호 DB를 관리할 필요 없이, Google/GitHub 같은 기존 계정으로 모든 내부 서비스에 접근하는 통합 입구가 만들어졌습니다.

보안 강화: 디바이스 포스처 확인

Zero Trust의 “Trust”에는 사용자뿐 아니라 디바이스도 포함됩니다. Cloudflare WARP 클라이언트를 설치한 디바이스인지, 디스크 암호화가 켜져 있는지, OS 버전이 최신인지 등을 Device Posture 정책으로 확인할 수 있습니다.

Device Posture 규칙 예시

  • WARP 클라이언트 설치 여부: WARP가 설치된 디바이스만 접근 허용
  • 디스크 암호화: FileVault(macOS) 또는 BitLocker(Windows) 활성화 확인
  • OS 최소 버전: macOS 15 이상, Windows 11 이상만 허용
  • 방화벽 활성화: OS 방화벽이 켜져 있는지 확인

이 기능을 활용하면 “올바른 사람이 올바른 디바이스에서 접속”하는 것까지 보장할 수 있습니다. 다만 무료 플랜에서는 기본적인 WARP 확인만 가능하고, 디스크 암호화·OS 버전 같은 고급 체크는 유료 플랜(Teams Standard 이상)에서 지원합니다.

트러블슈팅 — 자주 발생하는 문제와 해결

문제 1: Access 로그인 후 “403 Forbidden”이 뜬다

원인: 정책의 Include 조건에 내 이메일이 빠져 있거나, Require 조건(예: 국가 제한)에 걸린 경우.

해결: Zero Trust 대시보드 → Access → Logs에서 차단된 요청의 상세 사유를 확인합니다. “Policy decision: Deny” 옆에 어떤 규칙이 매치되지 않았는지 표시됩니다.

문제 2: Access 로그인 화면이 안 뜨고 바로 서비스에 접속된다

원인: DNS 레코드가 Cloudflare 프록시를 거치지 않는 상태(회색 구름 아이콘). Access는 Cloudflare 프록시를 경유해야만 동작합니다.

해결: Cloudflare DNS 대시보드에서 해당 레코드의 프록시 상태를 주황색 구름(Proxied)으로 전환합니다.

문제 3: OTP 이메일이 도착하지 않는다

원인: 스팸 폴더에 들어갔거나, 이메일 제공자가 Cloudflare 발신을 차단한 경우.

해결: 스팸 폴더를 확인하세요. Gmail 사용자라면 거의 문제없지만, 회사 메일 서버를 쓰는 경우 [email protected]을 허용 목록에 추가하세요.

문제 4: 세션이 너무 빨리 만료된다

원인: 기본 Session Duration이 짧게 설정된 경우.

해결: 애플리케이션 설정에서 Session Duration을 24시간이나 1주일로 늘립니다. 홈랩 용도라면 1 month도 합리적입니다.

문제 5: 특정 서브 경로만 보호하고 싶다

원인: nas.example.com 전체가 아닌 nas.example.com/admin만 보호하고 싶은 경우.

해결: 애플리케이션 설정에서 Path 필드에 /admin을 지정합니다. 루트 경로는 인증 없이 접근 가능하고, /admin 이하만 Access 로그인을 요구합니다.

Access 감사 로그 활용하기

보안은 차단만으로 끝나지 않습니다. “누가 언제 어디에 접속했는지”를 사후에 확인할 수 있어야 합니다.

Zero Trust 대시보드 → Logs → Access에서 다음 정보를 확인할 수 있습니다:

  • 사용자 이메일: 누가 접속했는지
  • 접속 시각: 언제 접속했는지
  • 애플리케이션: 어떤 서비스에 접속했는지
  • 판정 결과: Allow / Deny
  • IP 주소: 어디에서 접속했는지
  • 국가: 접속 국가
  • 인증 수단: Google / GitHub / OTP 중 무엇으로 인증했는지

무료 플랜에서도 최근 24시간의 로그를 확인할 수 있습니다. 이상 접근이 감지되면 해당 사용자를 Access → Active Sessions에서 즉시 세션 해지(Revoke)할 수도 있습니다.

월 비용 명세표

항목 Free Teams Standard ($7/user/월) Teams Enterprise
Access 사용자 수 최대 50명 무제한 무제한
Access 애플리케이션 수 무제한 무제한 무제한
IdP 연동 수 무제한 무제한 무제한
Service Token 지원 지원 지원
App Launcher 지원 지원 지원
SSH/VNC 브라우저 렌더링 지원 지원 지원
감사 로그 보관 24시간 6개월 커스텀
Device Posture (기본) WARP 확인만 OS·디스크암호화 등 커스텀 체크
Gateway DNS 필터링 지원 지원 (고급 정책) 지원 (DLP 포함)
Cloudflare Tunnel 무료 무료 무료

핵심: 50명 이하의 홈랩·소규모 팀이라면 완전 무료입니다. Tunnel도 무료, Access도 무료, App Launcher도 무료. 별도 VPN 서버를 구축하거나 유지보수하는 비용을 생각하면 상당한 절약입니다.

정리: 5화 터널 + 6화 Access = 완전한 홈랩 보안

5화의 Cloudflare Tunnel과 6화의 Zero Trust Access를 조합하면 다음과 같은 아키텍처가 완성됩니다:

  • 인바운드 포트 제로: 공유기 포트포워딩 없음. 외부에서 집 IP를 직접 때릴 수 없음.
  • 인증 관문: 모든 접속은 Cloudflare의 글로벌 네트워크에서 신원 확인을 거침.
  • 암호화: 클라이언트 → Cloudflare (TLS) → Tunnel (자체 암호화) → 로컬 서비스. 전 구간 암호화.
  • 감사 추적: 누가 언제 어디에 접속했는지 로그로 확인 가능.
  • 비용: 0원.

전통적인 VPN을 구축하면 서버 유지비, 인증서 관리, 클라이언트 배포, 접속 장애 대응… 끝없는 운영 부담이 따라옵니다. Zero Trust Access는 이 모든 것을 Cloudflare에 위임합니다. 특히 가족이나 비기술 팀원에게 “Google로 로그인하세요”라고 안내하면 끝이라는 점이, VPN 클라이언트 설치를 요구하는 것과는 차원이 다른 사용자 경험입니다.

다음 7화에서는 클라이언트 측 보안의 완성편인 1.1.1.1과 WARP VPN을 다룹니다. DNS 수준에서 광고·악성 사이트를 차단하고, 공용 Wi-Fi에서도 안전하게 인터넷을 쓰는 방법을 알아보겠습니다.

이미지는 Leonardo AI 로 생성되었습니다.

이미지는 Claude AI 로 생성되었습니다.


📚 시리즈: Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지 (총 16화 중 6화)
이전 5화  (다음 차수는 아직 게시되지 않았습니다)
작성일 댓글 남기기

[Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지] 5/16화: 클라우드플레어 터널 설정 가이드: NAS 외부접속 완전 정복

Cloudflare Tunnel로 NAS를 안전하게 외부 공개하는 개념도

이 글은 「Cloudflare 완전 정복」 시리즈 5/16회입니다. 지난 4회까지 DNS·CDN·SSL·Pages로 Cloudflare 무료 플랜의 기초를 완성했다면, 오늘부터는 본격적인 홈랩·자가호스팅 영역으로 들어갑니다.

포트포워딩, 왜 더 이상 쓰면 안 되는가

집에 Synology NAS를 두고 외부에서 접속하고 싶다면, 대부분의 가이드는 이렇게 안내합니다. “공유기에서 포트포워딩을 설정하세요.” 5443 포트를 열고, DDNS를 잡고, 방화벽 규칙을 추가하고… 작동은 합니다. 하지만 2026년 기준으로 이 방식은 권장하기 어렵습니다.

  • 공인 IP 노출: 포트를 여는 순간, 전 세계 봇이 해당 IP:포트를 스캔합니다. Shodan 같은 검색 엔진에 NAS 관리 화면이 인덱싱되는 건 시간문제입니다.
  • ISP 제약: 국내 가정용 인터넷 대부분은 CGNAT(Carrier-Grade NAT) 환경입니다. 공유기에서 포트를 열어도 ISP 단에서 막혀 있어 아예 작동하지 않는 경우가 흔합니다.
  • 유동 IP: 가정용 회선의 IP는 수시로 바뀝니다. DDNS로 따라가더라도 전파 지연이 발생하고, 그 사이 접속이 끊깁니다.
  • 보안 업데이트 부담: 열린 포트 하나는 곧 공격 표면 하나입니다. NAS 펌웨어, SSL 인증서, 방화벽 규칙을 모두 직접 관리해야 합니다.

Cloudflare Tunnel은 이 모든 문제를 한 번에 해결합니다. 포트를 열지 않고, 공인 IP를 노출하지 않으면서, 집 안의 서비스를 안전하게 인터넷에 공개할 수 있습니다.

클라우드플레어 터널이란 — 아웃바운드만 사용하는 역방향 연결

Cloudflare Tunnel 아웃바운드 전용 아키텍처 다이어그램

Cloudflare Tunnel의 핵심 원리는 단 한 문장으로 요약됩니다.

“집 서버가 Cloudflare 엣지로 먼저 연결한다. 외부 요청은 그 연결을 타고 들어온다.”

일반적인 포트포워딩은 인바운드 방식입니다. 외부에서 안으로 들어오는 트래픽을 허용하기 위해 방화벽에 구멍을 뚫어야 합니다. 반면 Cloudflare Tunnel은 아웃바운드 전용입니다.

  • cloudflared라는 경량 데몬이 집 서버에서 실행됩니다.
  • cloudflared는 Cloudflare의 전 세계 엣지 네트워크로 아웃바운드 QUIC/HTTP2 연결을 맺습니다.
  • 외부 사용자가 nas.example.com에 접속하면, Cloudflare 엣지가 이미 열려 있는 터널 연결을 통해 요청을 집 서버로 전달합니다.
  • 집 서버의 인바운드 포트는 하나도 열리지 않습니다. 공유기·방화벽 설정을 건드릴 필요가 없습니다.

이 구조가 가져다주는 이점은 명확합니다.

  • CGNAT 우회: 아웃바운드 연결이므로 ISP의 NAT 뒤에서도 문제없이 작동합니다.
  • 공인 IP 비노출: DNS 조회 결과에 Cloudflare의 Anycast IP만 표시됩니다. 집 IP는 어디에도 드러나지 않습니다.
  • 자동 TLS: 2회에서 설정한 Cloudflare의 무료 SSL/TLS가 그대로 적용됩니다. 별도의 인증서 관리가 불필요합니다.
  • DDoS 방어: 모든 트래픽이 Cloudflare 엣지를 경유하므로, 1회에서 소개한 DDoS 완화 기능이 자동으로 작동합니다.

사전 준비 — 5분이면 충분합니다

Cloudflare Tunnel을 설정하기 전에 다음을 확인하세요.

  • Cloudflare 계정: 무료 플랜이면 충분합니다.
  • Cloudflare에 등록된 도메인: 2회에서 네임서버를 이전한 도메인이 있어야 합니다. 아직 없다면 2회를 먼저 참고하세요.
  • 집 서버: Synology NAS, Mac Studio, 라즈베리파이, 일반 PC — 무엇이든 괜찮습니다. Docker를 지원하면 설치가 더 간편합니다.
  • 외부 공개할 서비스: NAS 관리 화면(DSM), 웹 서버, Home Assistant, Jellyfin 등 이미 내부 네트워크에서 작동 중인 서비스.

방법 1 — Cloudflare 대시보드에서 터널 만들기 (GUI)

명령줄이 익숙하지 않다면 대시보드에서 시작하는 것이 가장 쉽습니다.

1단계: Zero Trust 대시보드 진입

one.dash.cloudflare.com에 로그인한 뒤, 왼쪽 메뉴에서 Networks → Tunnels로 이동합니다.

2단계: 터널 생성

Create a tunnel 버튼을 클릭합니다. 터널 타입은 Cloudflared를 선택합니다(Warp Connector는 다른 용도입니다). 터널 이름은 알아보기 쉽게 homelab이나 nas-tunnel 정도로 지정합니다.

3단계: 커넥터 설치

터널을 만들면 대시보드에 운영체제별 설치 명령어가 표시됩니다. 이 명령어에는 터널 인증 토큰이 포함되어 있어, 복사해서 서버에 붙여넣기만 하면 됩니다. Synology NAS라면 Docker 탭의 명령어를 사용합니다(아래 실습 섹션에서 자세히 다룹니다).

4단계: 퍼블릭 호스트네임 매핑

커넥터가 연결되면 Public Hostnames 탭에서 서비스를 매핑합니다.

  • Subdomain: nas (→ nas.example.com이 됩니다)
  • Domain: Cloudflare에 등록된 도메인 선택
  • Service Type: HTTPS
  • URL: localhost:5001 (Synology DSM의 기본 HTTPS 포트)

하단의 Additional application settings → TLS → No TLS Verify를 활성화합니다. DSM은 자체 서명 인증서를 사용하므로, cloudflared가 이를 검증하지 않도록 설정해야 합니다.

Save를 누르면 끝입니다. 이제 https://nas.example.com으로 외부에서 DSM에 접속할 수 있습니다.

방법 2 — CLI로 터널 만들기 (개발자 권장)

대시보드 GUI는 편리하지만, 터널 설정을 코드로 관리하고 싶다면 CLI가 낫습니다. 설정 파일을 Git에 넣어두면 서버를 교체하더라도 동일한 환경을 바로 복원할 수 있습니다.

cloudflared 설치

Mac Studio에서는 Homebrew로 설치합니다.

brew install cloudflared

Linux(Debian/Ubuntu 계열)에서는 공식 패키지를 사용합니다.

curl -L https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/cloudflare-archive-keyring.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt update && sudo apt install -y cloudflared

인증 및 터널 생성

# Cloudflare 계정 인증 (브라우저가 열립니다)
cloudflared tunnel login

# 터널 생성
cloudflared tunnel create homelab

# 생성된 터널 ID 확인
cloudflared tunnel list

tunnel create 명령은 ~/.cloudflared/ 디렉토리에 터널 자격증명 JSON 파일을 생성합니다. 이 파일이 터널의 신원을 증명하므로 안전하게 보관해야 합니다.

설정 파일 작성

~/.cloudflared/config.yml 파일을 만들어 라우팅 규칙을 정의합니다.

# ~/.cloudflared/config.yml
tunnel: homelab
credentials-file: /home/user/.cloudflared/<TUNNEL-ID>.json

ingress:
  # Synology DSM
  - hostname: nas.example.com
    service: https://localhost:5001
    originRequest:
      noTLSVerify: true

  # Jellyfin 미디어 서버
  - hostname: media.example.com
    service: http://localhost:8096

  # Home Assistant
  - hostname: home.example.com
    service: http://localhost:8123

  # 매칭되지 않는 요청은 404
  - service: http_status:404

ingress 규칙의 마지막 항목은 반드시 hostname 없이 catch-all로 끝나야 합니다. 이것을 빠뜨리면 cloudflared가 실행을 거부합니다.

DNS 레코드 등록 및 실행

# DNS CNAME 레코드 자동 등록
cloudflared tunnel route dns homelab nas.example.com
cloudflared tunnel route dns homelab media.example.com
cloudflared tunnel route dns homelab home.example.com

# 터널 실행
cloudflared tunnel run homelab

tunnel route dns 명령은 Cloudflare DNS에 <TUNNEL-ID>.cfargotunnel.com을 가리키는 CNAME 레코드를 자동으로 추가합니다. 2회에서 봤던 DNS 관리 화면에 새 레코드가 나타나는 것을 확인할 수 있습니다.

Synology NAS(DS+925) 실전 설치 — Docker 방식

Synology NAS에서 Docker로 cloudflared 설정하는 모습

Synology NAS에서 cloudflared를 가장 안정적으로 운영하는 방법은 Docker(Container Manager)입니다. SSH로 NAS에 접속한 뒤 다음 명령을 실행합니다.

Docker Compose 파일 작성

# /volume1/docker/cloudflared/docker-compose.yml

services:
  cloudflared:
    image: cloudflare/cloudflared:latest
    container_name: cloudflared
    restart: unless-stopped
    command: tunnel run
    environment:
      - TUNNEL_TOKEN=<대시보드에서 복사한 터널 토큰>
    network_mode: host

network_mode: host를 사용하는 이유가 있습니다. cloudflared가 NAS의 localhost에서 실행 중인 서비스(DSM, Plex, Synology Photos 등)에 직접 접근해야 하기 때문입니다. bridge 모드를 쓰면 localhost:5001이 컨테이너 자신을 가리키게 되어 연결에 실패합니다.

실행 및 확인

# SSH로 NAS 접속
ssh [email protected]

# docker-compose 디렉토리로 이동
cd /volume1/docker/cloudflared

# 컨테이너 실행
sudo docker compose up -d

# 로그 확인 — "Connection registered" 메시지가 나오면 성공
sudo docker compose logs -f cloudflared

정상 연결 시 아래와 비슷한 로그가 출력됩니다.

INF Connection established connIndex=0 connection=xxx location=ICN
INF Connection established connIndex=1 connection=xxx location=NRT
INF Connection established connIndex=2 connection=xxx location=ICN
INF Connection established connIndex=3 connection=xxx location=NRT

cloudflared는 기본적으로 4개의 연결을 Cloudflare 엣지에 맺습니다. ICN은 인천(서울), NRT는 나리타(도쿄) 엣지입니다. 국내에서 접속하면 대부분 ICN 엣지를 통해 라우팅되어 지연 시간이 최소화됩니다.

여러 서비스를 하나의 터널에 묶기

대시보드 방식(토큰 기반)이라면 Public Hostnames 탭에서 서브도메인을 추가하기만 하면 됩니다. 터널 하나로 여러 서비스를 동시에 공개할 수 있습니다.

  • nas.example.comhttps://localhost:5001 (DSM)
  • photos.example.comhttp://localhost:8180 (Synology Photos)
  • drive.example.comhttps://localhost:10002 (Synology Drive)
  • media.example.comhttp://localhost:8096 (Jellyfin)

각 서브도메인마다 Cloudflare의 DNS, SSL, 캐시, 보안 기능이 독립적으로 적용됩니다.

Mac Studio 실전 설치 — Homebrew + LaunchAgent

Mac Studio를 개발 서버로 사용한다면, Homebrew로 설치한 cloudflared를 macOS 서비스로 등록합니다.

설치 및 서비스 등록

# cloudflared 설치
brew install cloudflared

# 대시보드에서 생성한 터널 토큰으로 서비스 등록
sudo cloudflared service install <TUNNEL-TOKEN>

# 서비스 상태 확인
sudo launchctl list | grep cloudflared

service install 명령은 /Library/LaunchDaemons/com.cloudflare.cloudflared.plist 파일을 생성하고, 시스템 부팅 시 자동으로 cloudflared를 시작하도록 등록합니다.

Mac Studio에서 로컬 개발 서버 외부 공개

Next.js, Flask, Express 등 로컬 개발 서버를 외부에 공개하고 싶을 때도 유용합니다. 대시보드에서 퍼블릭 호스트네임을 추가합니다.

  • dev.example.comhttp://localhost:3000 (Next.js)
  • api.example.comhttp://localhost:8000 (FastAPI)

포트포워딩 없이 클라이언트나 동료에게 개발 중인 서비스를 공유할 수 있습니다. ngrok의 무료 대안이 됩니다.

Quick Tunnel — 설치 없이 임시 터널 열기

설정을 영구적으로 저장할 필요 없이, 잠깐 테스트하고 싶을 때는 Quick Tunnel이 편리합니다.

# 로컬 8080 포트를 임시 공개 (도메인은 자동 생성)
cloudflared tunnel --url http://localhost:8080

실행하면 https://random-words.trycloudflare.com 형태의 임시 URL이 발급됩니다. Cloudflare 계정이나 도메인이 없어도 작동합니다. 터미널을 닫으면 터널도 사라집니다.

웹훅 테스트, 모바일 기기에서의 로컬 개발 확인, 일시적인 파일 공유 등에 활용할 수 있습니다.

터널 상태 모니터링과 장애 대응

대시보드에서 상태 확인

Zero Trust 대시보드의 Networks → Tunnels에서 각 터널의 상태를 실시간으로 볼 수 있습니다.

  • HEALTHY: 4개 연결 모두 정상.
  • DEGRADED: 일부 연결이 끊겼지만 서비스는 가능.
  • DOWN: 모든 연결이 끊김. cloudflared 프로세스를 확인해야 합니다.
  • INACTIVE: 커넥터가 한 번도 연결되지 않음. 토큰이나 네트워크를 확인합니다.

자주 만나는 문제와 해결법

“ERR Unable to establish connection” — 아웃바운드 차단

회사 네트워크나 일부 공공 와이파이에서 QUIC(UDP 7844)이 차단된 경우 발생합니다. cloudflared는 QUIC 실패 시 HTTP/2로 자동 폴백하지만, 이마저도 차단되었다면 네트워크 관리자에게 문의해야 합니다.

# HTTP/2 폴백을 명시적으로 강제
cloudflared tunnel --protocol http2 run homelab

“502 Bad Gateway” — 로컬 서비스 미응답

터널 자체는 정상이지만, 매핑된 로컬 서비스가 꺼져 있거나 포트가 다를 때 나타납니다. curl http://localhost:PORT로 로컬에서 먼저 확인하세요.

“SSL certificate problem” — 자체 서명 인증서

Synology DSM, Portainer 등 자체 서명 인증서를 사용하는 서비스라면 No TLS Verify 옵션을 활성화해야 합니다. CLI 설정에서는 originRequest.noTLSVerify: true입니다.

NAS 재부팅 후 자동 시작 안 됨

Docker Compose에 restart: unless-stopped를 넣었는데도 안 되는 경우, Synology Container Manager에서 해당 프로젝트의 “자동 재시작” 설정을 별도로 확인합니다. DSM 7.2+에서는 Container Manager UI에서 프로젝트 단위로 자동 시작 여부를 제어합니다.

보안 강화 — Cloudflare Access와 함께 쓰기

Tunnel만으로도 포트포워딩보다 훨씬 안전하지만, 누구든 URL만 알면 접속할 수 있다는 점은 동일합니다. 관리 화면처럼 민감한 서비스에는 Cloudflare Access로 인증 레이어를 추가하는 것을 권장합니다.

Cloudflare Access의 자세한 설정은 다음 6회에서 다루겠지만, 터널과 함께 가장 기본적인 설정만 미리 소개합니다.

대시보드에서 액세스 정책 추가

Zero Trust 대시보드 → Access → Applications → Add an application에서 다음을 설정합니다.

  • Application domain: nas.example.com
  • Policy name: Allow me
  • Action: Allow
  • Include rule: Emails — [email protected]

이렇게 하면 nas.example.com에 접속할 때 이메일 인증(OTP) 화면이 먼저 나타납니다. 등록한 이메일로 코드를 받아 입력해야만 DSM에 도달할 수 있습니다. 이 인증은 Cloudflare 엣지에서 처리되므로, 인증에 실패한 요청은 NAS에 도달조차 하지 않습니다.

성능 팁 — 더 빠른 터널을 위해

QUIC 프로토콜 우선

cloudflared는 기본적으로 QUIC을 사용합니다. QUIC은 UDP 기반이라 TCP 핸드셰이크 오버헤드가 없고, 연결 마이그레이션을 지원해 네트워크 전환 시에도 끊김이 줄어듭니다. 특별한 이유가 없다면 기본 설정(QUIC)을 유지하세요.

HTTP/2 Origin 연결

cloudflared와 로컬 서비스 사이의 연결도 HTTP/2를 사용하면 멀티플렉싱 효과를 얻습니다. 로컬 서비스가 HTTP/2를 지원한다면 설정에 추가합니다.

ingress:
  - hostname: app.example.com
    service: https://localhost:3000
    originRequest:
      http2Origin: true
      noTLSVerify: true

캐시 활용

Cloudflare CDN 캐시가 터널 뒤의 콘텐츠에도 적용됩니다. 정적 파일이 많은 서비스라면 2회에서 설정한 캐시 규칙이 그대로 효과를 발휘합니다. NAS에서 제공하는 이미지나 동영상 썸네일을 캐시하면 NAS의 부하를 줄이고 응답 속도도 개선됩니다.

하나의 터널, 여러 머신 — 분산 홈랩 구성

터널 하나에 커넥터를 여러 대 연결할 수도 있지만, 일반적으로는 머신마다 별도의 터널을 만드는 것이 관리하기 쉽습니다.

# 터널 구성 예시
nas-tunnel      → NAS (DSM, Photos, Drive)
mac-tunnel      → Mac Studio (개발 서버, API)
pi-tunnel       → Raspberry Pi (Home Assistant)

각 터널은 독립적으로 상태를 관리하며, 한 머신이 꺼져도 다른 터널에는 영향이 없습니다. 대시보드에서 터널별 트래픽과 상태를 한눈에 확인할 수 있습니다.

여러 머신에 각각 터널을 구성한 홈랩 예시

기존 포트포워딩에서 마이그레이션하기

이미 포트포워딩으로 운영 중인 서비스가 있다면, 다음 순서로 전환하세요.

  1. 터널을 설정하고 테스트: 새 서브도메인(예: nas-new.example.com)으로 터널을 먼저 만들어 정상 작동을 확인합니다.
  2. DNS 전환: 기존 도메인의 DNS 레코드를 터널의 CNAME으로 변경합니다.
  3. 포트포워딩 제거: DNS 전파(최대 24시간, Cloudflare Proxy 모드면 즉시)가 완료된 후 공유기의 포트포워딩 규칙을 삭제합니다.
  4. 방화벽 정리: 열어둔 인바운드 포트를 닫습니다.

이 순서를 지키면 서비스 중단 없이 전환할 수 있습니다.

Cloudflare Tunnel 비용 명세표

Cloudflare Tunnel 플랜별 비용 비교표
항목 Free (무료) Teams (50석 이하) Enterprise
Cloudflare Tunnel 생성 무제한 무제한 무제한
퍼블릭 호스트네임 (서비스 매핑) 무제한 무제한 무제한
트래픽 대역폭 무제한 무제한 무제한
커넥터 수 (cloudflared 인스턴스) 무제한 무제한 무제한
Cloudflare Access (인증) 50명까지 무료 50명까지 무료 커스텀
SSL/TLS 인증서 무료 (자동) 무료 무료
DDoS 방어 포함 포함 포함
월 비용 $0 $0 (50석 이하) 별도 문의

Cloudflare Tunnel은 완전 무료입니다. 터널 수, 서비스 수, 트래픽 양에 제한이 없습니다. Cloudflare Access도 50명까지 무료이므로, 개인이나 소규모 팀의 홈랩 용도라면 비용이 전혀 발생하지 않습니다.

이것이 포트포워딩 대신 Cloudflare Tunnel을 선택해야 하는 가장 실질적인 이유이기도 합니다. 더 안전하면서 더 저렴(무료)합니다.

포트포워딩 vs Cloudflare Tunnel — 한눈에 비교

비교 항목 포트포워딩 Cloudflare Tunnel
인바운드 포트 오픈 필요 불필요
CGNAT 환경 지원 불가 가능
공인 IP 노출 노출됨 비노출
SSL 인증서 관리 수동 (Let’s Encrypt 등) 자동 (Cloudflare)
DDoS 방어 없음 자동 포함
유동 IP 대응 DDNS 필요 불필요
인증 레이어 직접 구현 Cloudflare Access 연동
설정 난이도 중간 쉬움
비용 무료 무료

마무리 — 포트를 닫고, 터널을 여세요

Cloudflare Tunnel은 홈랩 운영의 게임 체인저입니다. 공유기 설정을 만질 필요도, 공인 IP를 노출할 필요도, DDNS를 설정할 필요도 없습니다. cloudflared 하나만 실행하면 Cloudflare의 전 세계 엣지 네트워크가 여러분의 집 서버 앞에 서게 됩니다.

오늘 설정을 마쳤다면, 다음 질문은 자연스럽게 떠오릅니다. “터널로 서비스를 공개했는데, 누가 접속하는지 어떻게 통제하지?”

다음 6회에서는 Cloudflare Zero Trust와 Access를 다룹니다. 구글 계정으로 로그인한 사람만 NAS에 접속하게 하거나, 특정 국가의 IP만 허용하거나, 재택근무 직원에게만 사내 서비스를 열어주는 방법까지 — 터널 위에 쌓는 인증·권한 레이어를 완전 정복합니다.

이미지는 Leonardo AI 로 생성되었습니다.

이미지는 Claude AI 로 생성되었습니다.


📚 시리즈: Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지 (총 16화 중 5화)
이전 4화  (다음 차수는 아직 게시되지 않았습니다)
작성일 댓글 한 개

[Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지] 4/16화: Cloudflare Pages 정적 사이트 5분 배포 완전 가이드

Cloudflare Pages 정적 사이트 글로벌 배포 개념도

이 글은 「Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지」 시리즈 4회입니다. 지난 3회까지 Cloudflare의 본질(1회), DNS·CDN 셋업(2회), 무료 SSL/TLS와 보안 헤더(3회)를 다뤘습니다. 오늘은 이 기반 위에 내 웹사이트를 실제로 올리는 단계—Cloudflare Pages를 이용한 Jamstack 정적 사이트 배포를 다룹니다.

“서버 없이 웹사이트를 운영한다”는 말이 2026년에는 더 이상 과장이 아닙니다. GitHub에 코드를 푸시하면 전 세계 330개 이상 엣지 노드에 자동 배포되고, HTTPS·CDN·프리뷰 환경까지 원클릭으로 끝나는 시대. 그 중심에 Cloudflare Pages가 있습니다. 무료 플랜만으로도 월 500회 빌드, 무제한 대역폭, 무제한 사이트 수를 제공하기 때문에, 개인 블로그부터 소규모 비즈니스 랜딩 페이지까지 비용 걱정 없이 운영할 수 있습니다.

Jamstack이란 무엇인가 — 정적 사이트가 다시 주목받는 이유

Cloudflare Pages를 제대로 활용하려면 먼저 Jamstack 개념을 이해해야 합니다. Jamstack은 JavaScript, API, Markup의 앞글자를 딴 웹 아키텍처로, 핵심 원칙은 단순합니다.

  • 사전 빌드(Pre-rendering): HTML을 서버가 매번 생성하는 대신, 빌드 시점에 미리 만들어 둡니다.
  • CDN 우선 배포: 완성된 정적 파일을 전 세계 엣지에 배포해 사용자와 가장 가까운 곳에서 서빙합니다.
  • 동적 기능은 API로: 댓글, 결제, 인증 같은 동적 기능은 서드파티 API 또는 서버리스 함수로 분리합니다.
Jamstack 아키텍처 빌드·배포·서빙 흐름도

전통적인 워드프레스 같은 서버 사이드 렌더링(SSR) 방식은 요청마다 PHP가 데이터베이스를 조회하고 HTML을 조립합니다. 트래픽이 몰리면 서버 부하가 급증하고, 보안 패치를 놓치면 해킹 위험에 노출됩니다. 반면 Jamstack의 정적 사이트는 이미 완성된 HTML 파일을 CDN이 직접 서빙하므로 서버 부하가 사실상 제로이고, 공격 표면도 극히 작습니다.

2026년 현재 Jamstack 생태계는 놀라울 만큼 성숙했습니다. 대표적인 정적 사이트 생성기(SSG)만 해도 이렇게 다양합니다.

  • Hugo: Go 기반, 빌드 속도 최강. 수천 페이지도 수 초 만에 빌드.
  • Astro: 아일랜드 아키텍처로 부분 하이드레이션 지원. 블로그·문서 사이트에 최적.
  • Next.js (정적 내보내기): React 생태계와 완벽 호환. output: 'export' 설정으로 정적 빌드.
  • Nuxt (정적 생성): Vue 기반 풀스택 프레임워크의 정적 모드.
  • 11ty(Eleventy): 설정 최소, 템플릿 엔진 자유 선택. 가볍고 빠름.
  • Gatsby: GraphQL 데이터 레이어가 특징. 콘텐츠 중심 사이트에 강점.

이 중 어떤 도구를 쓰든 최종 결과물은 HTML·CSS·JS 파일 묶음이고, 이걸 Cloudflare Pages에 올리기만 하면 됩니다.

Cloudflare Pages란 — 무료 정적 사이트 배포의 새 기준

Cloudflare Pages는 2020년 말 베타로 시작해 2021년 정식 출시된 정적 사이트 호스팅 플랫폼입니다. Netlify, Vercel과 같은 카테고리에 속하지만, Cloudflare의 글로벌 네트워크 위에서 동작한다는 결정적 차이가 있습니다.

Pages의 핵심 특징

  • 무제한 대역폭: 무료 플랜에서도 대역폭 제한이 없습니다. Netlify의 월 100GB, Vercel의 월 100GB 제한과 비교하면 압도적입니다.
  • 무제한 사이트 수: 프로젝트를 몇 개든 만들 수 있습니다.
  • 월 500회 빌드(무료): 하루 평균 16회 이상 배포해도 넉넉합니다.
  • 자동 프리뷰 배포: Pull Request마다 고유 URL이 생겨 팀 리뷰가 편합니다.
  • 글로벌 엣지 배포: 330개 이상 도시의 데이터센터에 자동 배포. 한국 서울에도 PoP가 있어 국내 사용자 응답 속도가 빠릅니다.
  • 무료 SSL: 커스텀 도메인을 연결하면 Let’s Encrypt 인증서가 자동 발급됩니다. 3회에서 다룬 Cloudflare의 SSL 인프라와 동일합니다.
  • Functions(서버리스): Pages 프로젝트에 /functions 디렉토리를 추가하면 Cloudflare Workers 기반 서버리스 함수를 함께 배포할 수 있습니다. 9회에서 Workers를 상세히 다룹니다.

Pages vs Netlify vs Vercel — 2026년 비교

정적 사이트 배포 플랫폼 3강 비교입니다. 무료 플랜 기준으로 핵심 차이를 정리했습니다.

항목 Cloudflare Pages Netlify Vercel
월 대역폭 무제한 100 GB 100 GB
월 빌드 횟수 500회 300분(시간 기준) 6,000분(시간 기준)
동시 빌드 1개 1개 1개
프리뷰 배포 무제한 무제한 무제한
사이트 수 무제한 무제한 무제한
엣지 노드 수 330+ ~20 ~20
서버리스 함수 Workers (무료 10만 req/일) Functions (125K req/월) Serverless (100GB-hrs)
SSR 지원 Workers 통합 자체 런타임 자체 런타임 (Next.js 최적화)
커머셜 제한 없음 없음 비상업 프로젝트만(Hobby)

Cloudflare Pages의 가장 큰 강점은 무제한 대역폭글로벌 엣지 노드 수입니다. 블로그 글 하나가 갑자기 바이럴 되어 트래픽이 폭증해도 추가 비용이 발생하지 않고, 전 세계 어디서든 빠른 응답 속도를 보장합니다.

반면 Vercel은 Next.js와의 긴밀한 통합이 장점이고, Netlify는 오래된 생태계와 풍부한 플러그인이 강점입니다. 순수 정적 사이트를 비용 걱정 없이 운영하고 싶다면 Cloudflare Pages가 2026년 현재 가장 합리적인 선택입니다.

실습 ① — GitHub 연동으로 5분 배포

가장 일반적이고 권장되는 배포 방식입니다. GitHub 저장소에 코드를 푸시하면 자동으로 빌드·배포가 이루어집니다.

사전 준비

  • Cloudflare 계정 (무료 플랜 OK — 2회에서 생성한 계정 그대로 사용)
  • GitHub 계정과 정적 사이트 저장소

아직 정적 사이트가 없다면, 실습용으로 Astro 프로젝트를 빠르게 만들어 보겠습니다. Mac Studio 또는 Synology NAS DS+925에 SSH 접속한 뒤 아래 명령어를 실행합니다.

실습용 Astro 프로젝트 생성 (Mac Studio / Synology NAS)

# Node.js 18+ 필요. Mac Studio에서 Homebrew로 설치된 경우:
node --version   # v20.x 이상 확인

# Astro 프로젝트 생성 (대화형 설정)
npm create astro@latest my-first-pages -- --template blog

# 프로젝트 디렉토리 진입
cd my-first-pages

# 로컬에서 개발 서버 확인 (선택)
npm run dev
# → http://localhost:4321 에서 블로그 템플릿 확인

# Git 초기화 및 GitHub 푸시
git init
git add -A
git commit -m "feat: initial Astro blog"

# GitHub에 저장소 생성 후 (https://github.com/new)
git remote add origin https://github.com/YOUR_USERNAME/my-first-pages.git
git branch -M main
git push -u origin main

Synology NAS DS+925에서 실행하는 경우, SSH로 접속한 뒤 동일한 명령어를 사용합니다. NAS에 Node.js가 설치되어 있지 않다면 Docker 컨테이너 안에서 실행할 수도 있습니다.

# Synology NAS — Docker로 Node.js 사용하는 경우
docker run --rm -it -v $(pwd):/app -w /app node:20-slim bash

# 컨테이너 안에서 위의 npm create astro 명령 동일하게 실행

Cloudflare Pages 프로젝트 생성 — 대시보드 방식

GitHub에 코드가 올라갔으면 Cloudflare 대시보드에서 Pages 프로젝트를 연결합니다.

  1. Cloudflare 대시보드 접속: dash.cloudflare.com → 좌측 메뉴에서 Workers & Pages 클릭
  2. Create 버튼 클릭 → Pages 탭 선택 → Connect to Git
  3. GitHub 계정 연결: “Connect GitHub” 클릭 → GitHub OAuth 인증 → 저장소 접근 권한 부여
  4. 저장소 선택: 방금 만든 my-first-pages 저장소 선택
  5. 빌드 설정:
    • Production branch: main
    • Framework preset: Astro 선택 (자동 감지되는 경우가 많음)
    • Build command: npm run build
    • Build output directory: dist
  6. Save and Deploy 클릭
Cloudflare Pages GitHub 연동 자동 배포 흐름

첫 빌드가 시작됩니다. Astro 블로그 템플릿 기준으로 보통 30초~1분이면 완료됩니다. 빌드가 끝나면 https://my-first-pages-abc.pages.dev 형태의 URL이 자동 생성됩니다. 이 URL로 바로 접속하면 전 세계 엣지에 배포된 내 사이트를 볼 수 있습니다.

이후부터는 main 브랜치에 코드를 푸시할 때마다 자동으로 새 빌드가 트리거되고, 배포가 완료되면 사이트가 업데이트됩니다. 별도의 CI/CD 파이프라인을 구성할 필요가 전혀 없습니다.

프레임워크별 빌드 설정 레퍼런스

Cloudflare Pages 대시보드에서 프레임워크를 선택하면 빌드 명령어와 출력 디렉토리가 자동 설정됩니다. 하지만 수동으로 입력해야 하는 경우를 위해 주요 프레임워크별 설정을 정리합니다.

프레임워크 Build command Output directory 비고
Astro npm run build dist 가장 매끄러운 통합
Hugo hugo public 환경변수 HUGO_VERSION 지정 권장
Next.js (Static Export) npx next build out next.config.jsoutput: 'export' 필수
Nuxt (Static) npx nuxt generate .output/public Nuxt 3 기준
Gatsby npx gatsby build public
11ty (Eleventy) npx @11ty/eleventy _site
Vite (vanilla) npx vite build dist React/Vue SPA 포함
Jekyll jekyll build _site Ruby 환경 빌드 시간 주의
순수 HTML (없음) / 또는 해당 폴더 빌드 불필요, 바로 배포

Hugo를 사용하는 경우, Cloudflare Pages의 빌드 환경에 설치된 Hugo 버전이 오래되었을 수 있습니다. 환경 변수로 원하는 버전을 지정하세요.

# Cloudflare Pages 환경 변수 설정 (대시보드 > Settings > Environment variables)
HUGO_VERSION = 0.147.1
NODE_VERSION = 20

실습 ② — Wrangler CLI로 직접 배포

GitHub 연동 없이 로컬에서 바로 배포하는 방법도 있습니다. CI/CD를 직접 구성하고 싶거나, GitHub Actions 등 외부 파이프라인에서 배포할 때 유용합니다.

Wrangler 설치 및 로그인

# Wrangler CLI 전역 설치
npm install -g wrangler

# Cloudflare 계정 인증 (브라우저가 열림)
wrangler login

# 인증 확인
wrangler whoami

프로젝트 빌드 후 직접 배포

# Astro 프로젝트 기준 — 먼저 로컬 빌드
cd my-first-pages
npm run build

# Cloudflare Pages에 배포 (첫 실행 시 프로젝트 자동 생성)
wrangler pages deploy dist --project-name my-first-pages

# 실행 결과 예시:
# ✨ Deployment complete!
# https://abc123def.my-first-pages.pages.dev

wrangler pages deploy 명령 하나로 빌드된 dist 폴더의 모든 파일이 Cloudflare 엣지에 업로드됩니다. 프로젝트가 아직 없으면 자동 생성할지 물어봅니다.

프로덕션 vs 프리뷰 배포

# 프로덕션 배포 (기본 — main 브랜치에 해당)
wrangler pages deploy dist --project-name my-first-pages --branch main

# 프리뷰 배포 (feature 브랜치에 해당)
wrangler pages deploy dist --project-name my-first-pages --branch feature/new-design

# 프리뷰 배포는 고유 URL 생성:
# https://feature-new-design.my-first-pages.pages.dev

CLI 배포의 장점은 자동화의 자유도입니다. GitHub Actions, GitLab CI, Jenkins 등 어떤 CI 도구에서든 wrangler pages deploy 한 줄로 배포할 수 있습니다.

GitHub Actions 연동 예시

GitHub 연동 대신 GitHub Actions에서 Wrangler CLI로 배포하는 워크플로 예시입니다. 빌드 환경을 세밀하게 제어하고 싶을 때 유용합니다.

# .github/workflows/deploy.yml
name: Deploy to Cloudflare Pages
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: 20

      - run: npm ci
      - run: npm run build

      - uses: cloudflare/wrangler-action@v3
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
          command: pages deploy dist --project-name my-first-pages

CLOUDFLARE_API_TOKEN은 Cloudflare 대시보드 → My Profile → API Tokens에서 “Cloudflare Pages: Edit” 권한으로 생성합니다. CLOUDFLARE_ACCOUNT_ID는 대시보드 우측 사이드바 “Account ID”에서 확인할 수 있습니다.

커스텀 도메인 연결 — 2회 DNS 설정의 실전 적용

*.pages.dev 도메인도 충분히 쓸 만하지만, 내 도메인을 연결하면 브랜드 정체성과 SEO 모두 개선됩니다. 2회에서 Cloudflare에 DNS를 셋업한 도메인이 있다면 연결이 특히 간단합니다.

대시보드에서 커스텀 도메인 추가

  1. Workers & Pages → 프로젝트 선택 → Custom domains
  2. Set up a custom domain 클릭
  3. 도메인 입력: 예) blog.yourdomain.com
  4. DNS가 이미 Cloudflare에 있으면 CNAME 레코드가 자동 추가
  5. SSL 인증서도 자동 발급 (3회에서 다룬 Universal SSL과 동일 메커니즘)
# Cloudflare DNS에 자동 추가되는 레코드 형태
# Type: CNAME
# Name: blog
# Target: my-first-pages.pages.dev
# Proxy status: Proxied (주황색 구름)

외부 DNS를 사용하는 경우에는 수동으로 CNAME 레코드를 추가해야 합니다. 하지만 2회에서 이미 Cloudflare DNS로 마이그레이션했다면 클릭 한 번이면 끝입니다. 이것이 시리즈를 순서대로 따라온 보람입니다.

루트 도메인(yourdomain.com)도 연결할 수 있습니다. 일반적으로 루트 도메인에 CNAME을 쓸 수 없지만, Cloudflare DNS는 CNAME Flattening 기술로 루트 도메인에도 CNAME을 설정할 수 있게 해 줍니다. Pages 프로젝트에 루트 도메인을 추가하면 자동으로 처리됩니다.

www 리다이렉트 설정

www.yourdomain.comyourdomain.com 모두 접근 가능하게 하되, 하나로 통일하고 싶다면 Cloudflare의 Redirect Rules를 사용합니다.

# Cloudflare 대시보드 → 도메인 → Rules → Redirect Rules
# 규칙 추가:
# - When: Hostname equals "www.yourdomain.com"
# - Then: Dynamic redirect
#   URL: concat("https://yourdomain.com", http.request.uri.path)
#   Status code: 301

이렇게 하면 www 접속 시 깔끔하게 루트 도메인으로 301 리다이렉트됩니다. SEO 점수에도 긍정적입니다.

프리뷰 배포(Preview Deployments) 200% 활용하기

Cloudflare Pages의 가장 실용적인 기능 중 하나가 프리뷰 배포입니다. main 이외의 브랜치에 푸시하거나 Pull Request를 열면, 해당 변경사항만 반영된 별도의 URL이 자동 생성됩니다.

Cloudflare Pages 프리뷰 배포 브랜치별 비교

프리뷰 배포의 동작 방식

  • 브랜치별 URL: feature-redesign.my-first-pages.pages.dev 형태로 브랜치 이름이 서브도메인에 반영됩니다.
  • 커밋별 URL: 매 커밋마다 고유 해시 URL도 생성됩니다. 예: abc1234.my-first-pages.pages.dev
  • GitHub PR 코멘트: GitHub 연동 시 PR에 자동으로 프리뷰 URL이 코멘트로 달립니다.
  • 무제한: 프리뷰 배포 수에 제한이 없습니다.

실전 활용 시나리오

시나리오 1 — 디자인 리뷰: 디자이너에게 프리뷰 URL을 공유하면 로컬 환경 없이도 실제 배포된 상태로 확인할 수 있습니다.

시나리오 2 — A/B 테스트 초안: 랜딩 페이지 두 가지 버전을 각각 다른 브랜치에 만들고, 두 프리뷰 URL을 비교합니다.

시나리오 3 — 클라이언트 승인: 프리랜서라면 작업물을 프리뷰 URL로 공유해 클라이언트 피드백을 받을 수 있습니다. 프로덕션에 영향 없이 수정 → 재배포 → 재확인이 자유롭습니다.

프리뷰 접근 제한 — Cloudflare Access 연동

프리뷰 URL은 기본적으로 공개입니다. 사내 프로젝트라면 외부 노출이 부담스러울 수 있습니다. 이때 Cloudflare Access(6회에서 상세히 다룹니다)를 연동하면 프리뷰 배포에 인증 벽을 세울 수 있습니다.

# Cloudflare 대시보드 → Zero Trust → Access → Applications
# 프리뷰 도메인 패턴: *.my-first-pages.pages.dev
# 정책: 특정 이메일 도메인만 허용
# → 인증되지 않은 접근 시 Cloudflare 로그인 화면 표시

빌드 설정 최적화 팁

환경 변수 관리

API 키, 분석 도구 ID 등 환경별로 다른 값은 Cloudflare Pages의 환경 변수 기능으로 관리합니다.

# 대시보드 → 프로젝트 → Settings → Environment variables

# Production 환경
SITE_URL = https://yourdomain.com
ANALYTICS_ID = G-XXXXXXXXXX

# Preview 환경 (별도 설정 가능)
SITE_URL = https://preview.yourdomain.com
ANALYTICS_ID = G-PREVIEW0000

프로덕션과 프리뷰 환경에 서로 다른 환경 변수를 설정할 수 있어, 프리뷰에서는 분석 추적을 끄거나 테스트용 API 엔드포인트를 사용하는 것이 가능합니다.

빌드 캐시 활용

Cloudflare Pages는 node_modules를 자동 캐시합니다. 하지만 빌드 시간을 더 줄이고 싶다면 몇 가지 팁이 있습니다.

  • 패키지 매니저 락 파일 유지: package-lock.json(npm) 또는 pnpm-lock.yaml(pnpm)을 커밋하면 의존성 설치가 빨라집니다.
  • 불필요한 devDependencies 정리: 빌드에 필요 없는 패키지는 제거합니다.
  • Hugo 사용 시 버전 고정: 앞서 언급한 HUGO_VERSION 환경 변수로 빌드 재현성을 확보합니다.

빌드 실패 시 디버깅

빌드가 실패하면 대시보드의 Deployments 탭에서 빌드 로그를 확인할 수 있습니다. 흔한 실패 원인과 해결법입니다.

증상 원인 해결
npm ERR! ERESOLVE 의존성 충돌 환경 변수 NPM_FLAGS = --legacy-peer-deps 추가
Error: Cannot find module 락 파일 누락 package-lock.json 커밋
Hugo: command not found Hugo 미설치 HUGO_VERSION 환경 변수 설정
빌드는 성공인데 페이지 비어있음 Output directory 오류 빌드 설정의 출력 디렉토리 확인 (dist, public 등)
Pages only supports files up to 25 MiB 단일 파일 크기 초과 대용량 에셋은 R2(8회)에 분리

Pages의 숨은 고급 기능

_headers 파일 — 커스텀 HTTP 헤더

3회에서 배운 보안 헤더를 Pages에서도 적용할 수 있습니다. 프로젝트 루트(빌드 출력 디렉토리)에 _headers 파일을 추가하면 됩니다.

# 빌드 출력 디렉토리에 위치 (예: public/_headers)
/*
  X-Frame-Options: DENY
  X-Content-Type-Options: nosniff
  Referrer-Policy: strict-origin-when-cross-origin
  Permissions-Policy: camera=(), microphone=(), geolocation=()
  Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'

/assets/*
  Cache-Control: public, max-age=31536000, immutable

경로 패턴별로 헤더를 다르게 설정할 수 있습니다. /assets/* 경로에는 1년 캐시를 적용해 정적 에셋의 재다운로드를 방지하는 것이 대표적인 최적화입니다.

_redirects 파일 — URL 리다이렉트·리라이트

# 빌드 출력 디렉토리에 위치 (예: public/_redirects)

# 301 영구 리다이렉트
/old-post    /new-post    301

# 302 임시 리다이렉트
/event       /event-2026  302

# Splat(와일드카드) 리다이렉트
/blog/*      /posts/:splat  301

# SPA 라우팅용 폴백 (클라이언트 사이드 라우팅)
/*           /index.html    200

SPA(Single Page Application)를 배포할 때 마지막 줄이 핵심입니다. React Router, Vue Router 등 클라이언트 사이드 라우팅을 사용하는 경우, 모든 경로를 index.html로 리라이트(200)해야 새로고침 시 404가 발생하지 않습니다.

Pages Functions — 서버리스 함수 간단 체험

Pages 프로젝트에 functions/ 디렉토리를 추가하면 서버리스 함수가 자동으로 배포됩니다. 정적 사이트와 API를 하나의 프로젝트에서 관리할 수 있는 강력한 기능입니다. (9회 Workers에서 깊이 다루지만, 맛보기로 확인해 봅니다.)

// functions/api/hello.js
export async function onRequestGet(context) {
  return new Response(JSON.stringify({
    message: "Hello from Cloudflare Pages Functions!",
    timestamp: new Date().toISOString()
  }), {
    headers: { "Content-Type": "application/json" }
  });
}

이 파일을 프로젝트에 추가하고 배포하면 https://yourdomain.com/api/hello 엔드포인트가 자동 생성됩니다. 파일 경로가 곧 URL 경로가 되는 파일 시스템 라우팅 방식입니다.

# 로컬 테스트 — Wrangler로 Pages Functions 포함 개발 서버 실행
wrangler pages dev dist --port 8788

# 테스트 요청
curl http://localhost:8788/api/hello
# → {"message":"Hello from Cloudflare Pages Functions!","timestamp":"2026-05-29T..."}

이 기능 덕분에 폼 제출 처리, 외부 API 프록시, 간단한 인증 로직 등을 별도 백엔드 서버 없이 Pages 프로젝트 안에서 해결할 수 있습니다.

실전 응용 — Synology NAS에서 Hugo 블로그 운영하기

Mac Studio나 Synology NAS DS+925를 홈랩으로 운영하면서 Hugo 블로그를 Cloudflare Pages로 배포하는 실전 워크플로를 정리합니다.

NAS와 Mac Studio 홈랩 Hugo 블로그 배포 워크플로

NAS에서 Hugo 블로그 작성·배포 자동화

# Synology NAS에 SSH 접속
ssh your-nas-user@nas-ip

# Hugo 프로젝트 클론 (이미 GitHub에 있는 경우)
cd /volume1/projects
git clone https://github.com/YOUR_USERNAME/my-hugo-blog.git
cd my-hugo-blog

# 새 글 작성
# Docker로 Hugo 실행 (NAS에 Hugo 바이너리 직접 설치하기 어려운 경우)
docker run --rm -v $(pwd):/src -w /src hugomods/hugo:latest new content posts/cloudflare-pages-guide.md

# 에디터로 글 작성 (VS Code Remote SSH 추천)
# → /volume1/projects/my-hugo-blog/content/posts/cloudflare-pages-guide.md

# 작성 완료 후 푸시 → Cloudflare Pages 자동 빌드·배포
git add -A
git commit -m "feat: add Cloudflare Pages guide post"
git push origin main

# 약 30초 후 https://yourdomain.com 에 새 글 반영!

이 워크플로의 아름다운 점은, NAS가 항상 켜져 있으므로 어디서든 SSH나 VS Code Remote로 접속해 글을 쓰고 git push 한 줄이면 전 세계에 배포된다는 것입니다. 서버 관리, 배포 파이프라인 걱정이 완전히 사라집니다.

Mac Studio에서의 로컬 개발 + 배포

# Mac Studio — Homebrew로 Hugo 설치
brew install hugo

# 새 사이트 생성
hugo new site my-blog
cd my-blog

# 테마 추가 (예: PaperMod — 인기 블로그 테마)
git init
git submodule add https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod

# hugo.toml 기본 설정
cat > hugo.toml << 'EOF'
baseURL = "https://blog.yourdomain.com/"
languageCode = "ko-kr"
title = "나의 기술 블로그"
theme = "PaperMod"

[params]
  env = "production"
  description = "Cloudflare Pages로 배포한 기술 블로그"
EOF

# 첫 글 작성
hugo new content posts/hello-world.md

# 로컬 프리뷰
hugo server -D
# → http://localhost:1313

# 빌드 + Wrangler로 직접 배포
hugo
wrangler pages deploy public --project-name my-blog

Cloudflare Pages 월 비용 명세표

이번 회차에서 다룬 Cloudflare Pages 관련 비용을 플랜별로 정리합니다.

항목 Free Pro ($20/월) Business ($200/월)
사이트(프로젝트) 수 무제한 무제한 무제한
월 빌드 횟수 500회 5,000회 20,000회
동시 빌드 1개 5개 20개
대역폭 무제한 무제한 무제한
커스텀 도메인 무제한 무제한 무제한
프리뷰 배포 무제한 무제한 무제한
SSL 인증서 자동·무료 자동·무료 자동·무료
Pages Functions 10만 req/일 1,000만 req/월 5,000만 req/월
빌드 시간 제한 빌드당 20분 빌드당 20분 빌드당 20분
최대 파일 크기 25 MiB/파일 25 MiB/파일 25 MiB/파일
최대 파일 수 20,000개/배포 20,000개/배포 20,000개/배포

결론: 개인 블로그나 소규모 프로젝트라면 Free 플랜으로 충분합니다. 월 500회 빌드는 매일 16번 이상 배포할 수 있는 양이고, 대역폭 무제한이므로 트래픽 폭증에도 추가 비용이 없습니다. Pro 이상은 팀 단위 협업이나 다수 프로젝트를 동시 빌드해야 할 때 고려하면 됩니다.

이전 회차와 연결 — DNS·SSL이 Pages를 완성한다

이번 4회의 내용은 1~3회에서 쌓은 기반 위에 올려져 있습니다.

  • 2회(DNS)에서 Cloudflare에 등록한 도메인 → Pages 커스텀 도메인 연결 시 CNAME이 자동 추가됩니다.
  • 3회(SSL)에서 설정한 Full(Strict) 모드 → Pages 도메인에도 동일하게 적용되어 엔드투엔드 HTTPS가 보장됩니다.
  • 1회에서 소개한 Cloudflare의 330+ 글로벌 엣지 → Pages 배포가 바로 이 네트워크 위에서 동작합니다.

이렇게 DNS → SSL → 배포가 하나의 플랫폼 안에서 매끄럽게 연결되는 것이 Cloudflare 생태계의 진짜 힘입니다. 각각 다른 서비스를 조합하는 것과 비교하면 설정 복잡도와 장애 포인트가 크게 줄어듭니다.

마무리 — 정적 사이트 배포, 이제 서버가 필요 없다

Cloudflare Pages는 "정적 사이트 배포"라는 작업의 마찰을 거의 제로에 가깝게 만들었습니다. GitHub 푸시 한 번이면 전 세계 배포가 완료되고, 무제한 대역폭 덕분에 비용 걱정도 없습니다. _headers, _redirects 파일로 세밀한 제어가 가능하고, Pages Functions로 간단한 서버리스 로직까지 같은 프로젝트에서 처리할 수 있습니다.

1~4회까지의 여정을 돌아보면, Cloudflare 계정 하나로 DNS, CDN, SSL, 그리고 정적 사이트 호스팅까지 모두 무료로 확보한 셈입니다. 다음 5회부터는 Phase 2—홈랩·자가호스팅 영역으로 넘어갑니다.

다음 회차 예고: 5회에서는 Cloudflare Tunnel을 다룹니다. Synology NAS나 Mac Studio 같은 홈 서버를 포트 포워딩·공인 IP 없이 안전하게 외부에 공개하는 방법—인바운드 포트를 단 하나도 열지 않고 HTTPS 접속을 가능하게 하는 마법 같은 기술입니다.

이미지는 Leonardo AI 로 생성되었습니다.

이미지는 Claude AI 로 생성되었습니다.


📚 시리즈: Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지 (총 16화 중 4화)
이전 3화  (다음 차수는 아직 게시되지 않았습니다)
작성일 댓글 남기기

[Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지] 3/16화: 클라우드플레어 SSL 무료 HTTPS 설정과 보안 헤더 자동화 완전 가이드

Cloudflare SSL 무료 HTTPS 보안 설정 일러스트

이 글은 「Cloudflare 완전 정복」 시리즈 3회입니다. 2회에서 도메인을 Cloudflare DNS에 연결하고 CDN 캐시까지 설정했다면, 오늘은 그 위에 HTTPS라는 자물쇠를 채울 차례입니다.

왜 2026년에 HTTPS를 다시 이야기하는가

“아직도 HTTPS 설정 글이 필요해?” 하고 물을 수 있습니다. 하지만 현실은 조금 다릅니다. 2026년 현재 Chrome은 HTTP 사이트에 접속하면 주소창에 “주의 요함”이라는 경고를 띄우고, Google 검색 순위에서도 HTTPS는 사실상 필수 요소입니다. 특히 블로그나 개인 프로젝트를 운영하는 분들이 많이 놓치는 부분이 있습니다. 인증서를 설치했다고 끝이 아니라는 것이죠.

인증서만 걸어놓고 보안 헤더를 설정하지 않으면, 클릭재킹(Clickjacking), MIME 스니핑, 다운그레이드 공격 같은 위협에 여전히 노출됩니다. Cloudflare를 쓰면 이 모든 것을 무료로, 클릭 몇 번으로 해결할 수 있습니다. 오늘 이 글 하나로 인증서 발급부터 보안 헤더 자동화까지 깔끔하게 정리하겠습니다.

Cloudflare SSL/TLS — 구조부터 이해하기

Cloudflare의 SSL/TLS를 제대로 설정하려면, 먼저 트래픽이 어떤 구간을 지나가는지 이해해야 합니다. 크게 두 구간으로 나뉩니다.

  • 브라우저 ↔ Cloudflare 엣지: 방문자가 여러분의 도메인에 접속할 때, 가장 가까운 Cloudflare 데이터센터까지의 구간입니다.
  • Cloudflare 엣지 ↔ 원본 서버: Cloudflare가 여러분의 실제 서버(NAS, VPS, 호스팅)에 콘텐츠를 요청하는 구간입니다.

많은 분이 첫 번째 구간만 생각하고 “HTTPS가 걸렸네” 하고 넘어갑니다. 하지만 두 번째 구간이 HTTP로 열려 있으면 중간자 공격에 취약해집니다. Cloudflare는 이 두 구간을 어떻게 처리할지 네 가지 암호화 모드로 나눠서 제공합니다.

Cloudflare SSL 암호화 모드 4가지 비교 다이어그램

SSL/TLS 암호화 모드 4가지

① Off (암호화 없음)

모든 구간이 HTTP입니다. 2026년에 이 설정을 쓸 이유는 전혀 없습니다. Cloudflare 대시보드에서도 권장하지 않는다는 경고가 뜹니다.

② Flexible (유연)

브라우저와 Cloudflare 사이만 HTTPS이고, Cloudflare에서 원본 서버까지는 HTTP입니다. 언뜻 보면 편리합니다. 원본 서버에 인증서를 설치하지 않아도 방문자 브라우저에는 자물쇠가 뜨니까요. 하지만 Cloudflare와 원본 서버 사이 구간이 평문이라는 근본적인 문제가 있습니다. 워드프레스처럼 리다이렉트 루프가 생기는 경우도 잦습니다. 임시 테스트 외에는 사용하지 마세요.

③ Full (전체)

양쪽 모두 HTTPS입니다. 다만 원본 서버의 인증서가 자체 서명(Self-signed)이어도 허용합니다. Cloudflare가 원본 인증서의 유효성을 검증하지 않으므로, 중간자가 가짜 인증서를 제시해도 Cloudflare가 이를 걸러내지 못합니다.

④ Full (Strict) — 권장

양쪽 모두 HTTPS이며, 원본 서버의 인증서가 신뢰할 수 있는 CA에서 발급되었거나 Cloudflare Origin CA 인증서여야 합니다. 가장 안전한 모드이고, 이 글에서 안내하는 최종 목표입니다.

어떤 모드를 골라야 할까 — 상황별 추천

  • 호스팅 업체(카페24, 가비아 등) 사용: 대부분 Let’s Encrypt 인증서를 제공하므로 → Full (Strict)
  • Synology NAS / 자가 서버: Cloudflare Origin CA를 설치하면 → Full (Strict)
  • 인증서 설치가 불가능한 환경: 최소한 → Full (Flexible은 피할 것)

실전 설정 1 — Cloudflare 대시보드에서 SSL/TLS 켜기

2회에서 도메인을 이미 Cloudflare에 연결했다고 가정합니다. 아직이라면 2회 가이드를 먼저 따라 주세요.

Step 1: 암호화 모드를 Full (Strict)로 변경

Cloudflare 대시보드에 로그인한 뒤, 해당 도메인을 선택합니다.

  • 왼쪽 메뉴에서 SSL/TLS → Overview로 이동합니다.
  • 상단의 암호화 모드에서 Full (strict)를 클릭합니다.
  • 변경은 즉시 적용됩니다. 별도 저장 버튼은 없습니다.

이 시점에서 원본 서버에 유효한 인증서가 없으면 526 에러가 발생합니다. 당황하지 마세요. 바로 다음 단계에서 원본 인증서를 만들겠습니다.

Step 2: Cloudflare Origin CA 인증서 발급

Cloudflare는 원본 서버 전용 무료 인증서를 제공합니다. 유효 기간은 최대 15년이며, Cloudflare를 통하지 않는 직접 접속에서는 신뢰되지 않지만, Cloudflare 프록시 뒤에서는 완벽하게 작동합니다.

  • SSL/TLS → Origin Server로 이동합니다.
  • Create Certificate 버튼을 클릭합니다.
  • 기본 설정 그대로 두면 됩니다:
    • Private key type: RSA (2048)
    • Hostnames: *.example.comexample.com (와일드카드 포함)
    • Certificate Validity: 15 years
  • Create를 누르면 Origin CertificatePrivate Key가 화면에 표시됩니다.

⚠️ Private Key는 이 화면을 벗어나면 다시 볼 수 없습니다. 반드시 복사해서 안전한 곳에 저장하세요.

Step 3: 원본 서버에 인증서 설치 — Synology NAS 편

Synology NAS DS+925에 Cloudflare Origin CA 인증서를 설치하는 실전 명령어입니다.

방법 A — DSM 웹 UI 사용 (권장)

  • DSM에 로그인 → 제어판 → 보안 → 인증서 탭으로 이동합니다.
  • 추가 버튼 → 새 인증서 추가인증서 가져오기를 선택합니다.
  • 아까 복사한 파일을 입력합니다:
    • 개인 키: Private Key 내용을 origin-key.pem 파일로 저장해 업로드
    • 인증서: Origin Certificate 내용을 origin-cert.pem 파일로 저장해 업로드
    • 중간 인증서: Cloudflare Origin CA 루트 인증서 (아래 명령어로 다운로드)

방법 B — SSH 명령어 사용

Synology NAS에 SSH로 접속한 뒤 다음 명령어를 실행합니다.

# Cloudflare Origin CA 루트 인증서(RSA) 다운로드
curl -o /tmp/origin_ca_rsa_root.pem \
  https://developers.cloudflare.com/ssl/static/origin_ca_rsa_root.pem

# 인증서 파일 준비 (대시보드에서 복사한 내용을 붙여넣기)
cat > /tmp/origin-cert.pem <<'EOF'
-----BEGIN CERTIFICATE-----
(여기에 Origin Certificate 붙여넣기)
-----END CERTIFICATE-----
EOF

cat > /tmp/origin-key.pem <<'EOF'
-----BEGIN PRIVATE KEY-----
(여기에 Private Key 붙여넣기)
-----END PRIVATE KEY-----
EOF

# 인증서 정보 확인
openssl x509 -in /tmp/origin-cert.pem -noout -subject -dates

SSH로 파일을 준비한 뒤, DSM 웹 UI에서 인증서 가져오기로 세 파일을 업로드하면 됩니다. 인증서를 기본 인증서로 설정하면 DSM 웹 인터페이스와 역방향 프록시에 자동 적용됩니다.

Step 3-B: Mac Studio / 일반 리눅스 서버에 설치

Mac Studio에서 nginx를 원본 서버로 사용하는 경우입니다.

# 인증서 디렉토리 생성
sudo mkdir -p /etc/nginx/ssl

# 인증서 파일 저장 (대시보드에서 복사한 내용)
sudo nano /etc/nginx/ssl/origin-cert.pem
sudo nano /etc/nginx/ssl/origin-key.pem

# Cloudflare Origin CA 루트 인증서 다운로드
sudo curl -o /etc/nginx/ssl/origin_ca_rsa_root.pem \
  https://developers.cloudflare.com/ssl/static/origin_ca_rsa_root.pem

# nginx 설정 (server 블록에 추가)
# /etc/nginx/sites-available/default 또는 해당 설정 파일
cat <<'NGINX'
server {
    listen 443 ssl;
    server_name example.com *.example.com;

    ssl_certificate     /etc/nginx/ssl/origin-cert.pem;
    ssl_certificate_key /etc/nginx/ssl/origin-key.pem;
    ssl_client_certificate /etc/nginx/ssl/origin_ca_rsa_root.pem;

    # TLS 1.2 이상만 허용
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;

    location / {
        root /var/www/html;
        index index.html;
    }
}
NGINX

# 설정 검증 및 재시작
sudo nginx -t
sudo systemctl reload nginx

이렇게 하면 Cloudflare ↔ 원본 서버 구간도 암호화되어 Full (Strict) 모드가 정상 작동합니다.

Universal SSL — 무료 인증서의 실체

Cloudflare에 도메인을 등록하면 Universal SSL이라는 무료 인증서가 자동으로 발급됩니다. 2회에서 DNS를 연결한 순간, 사실 이미 브라우저 쪽(엣지) 인증서는 활성화된 상태입니다.

Universal SSL의 특징

  • 발급 비용: 완전 무료 (Free 플랜 포함)
  • 인증서 종류: DV(Domain Validation) 인증서
  • 발급 CA: Google Trust Services 또는 Let’s Encrypt (Cloudflare가 자동 선택)
  • 갱신: Cloudflare가 만료 전 자동 갱신. 사용자가 신경 쓸 필요 없음
  • 와일드카드: *.example.com 포함 (Free 플랜에서도 제공)
  • 적용 범위: Cloudflare 프록시(오렌지 구름)가 켜진 레코드에만 적용

무료 플랜에서도 와일드카드 인증서를 제공한다는 점이 핵심입니다. 일반적으로 와일드카드 인증서는 유료이거나 설정이 번거로운데, Cloudflare는 도메인만 연결하면 자동으로 처리합니다.

Edge Certificate vs Origin Certificate 비교

  • Edge Certificate (Universal SSL): 브라우저 ↔ Cloudflare 구간. 자동 발급·갱신. 방문자가 보는 인증서.
  • Origin Certificate: Cloudflare ↔ 원본 서버 구간. 수동 발급(15년 유효). Cloudflare를 거치지 않는 직접 접속에서는 신뢰 안 됨.

두 인증서는 역할이 다릅니다. 양쪽 모두 설정해야 end-to-end 암호화가 완성됩니다.

실전 설정 2 — HTTPS 강제 리다이렉트

인증서를 설치했다고 해서 모든 방문자가 HTTPS로 접속하는 건 아닙니다. http://example.com으로 직접 타이핑하는 사용자도 있고, 오래된 북마크나 외부 링크가 HTTP인 경우도 있습니다. 두 가지 설정으로 이 문제를 해결합니다.

Always Use HTTPS

  • SSL/TLS → Edge Certificates에서 Always Use HTTPSOn으로 토글합니다.
  • HTTP로 들어오는 모든 요청을 301 리다이렉트로 HTTPS로 보냅니다.
  • 원본 서버에 도달하기 전에 Cloudflare 엣지에서 처리하므로, 서버 부하가 전혀 없습니다.

Automatic HTTPS Rewrites

  • 같은 페이지에서 Automatic HTTPS RewritesOn으로 토글합니다.
  • HTML 안에 http://로 시작하는 리소스 링크(이미지, CSS, JS 등)를 자동으로 https://로 바꿔줍니다.
  • 이른바 Mixed Content(혼합 콘텐츠) 문제를 방지합니다. HTTPS 페이지에서 HTTP 리소스를 로드하면 브라우저가 경고를 띄우거나 차단하는데, 이 기능이 자동으로 해결합니다.

두 설정 모두 무료 플랜에서 사용 가능하며, 켜는 데 10초면 충분합니다.

실전 설정 3 — TLS 최소 버전 올리기

TLS 1.0과 1.1은 이미 보안 취약점이 알려진 오래된 프로토콜입니다. 대부분의 최신 브라우저는 TLS 1.2 이상만 지원하므로, 구버전을 허용할 이유가 없습니다.

  • SSL/TLS → Edge Certificates에서 Minimum TLS VersionTLS 1.2로 설정합니다.
  • 보안이 특히 중요한 서비스라면 TLS 1.3으로 올릴 수도 있지만, 일부 구형 클라이언트 호환성 문제가 있을 수 있으므로 TLS 1.2가 현실적인 최선입니다.

TLS 1.3의 장점

TLS 1.3은 Cloudflare에서 기본 활성화되어 있습니다. 클라이언트가 지원하면 자동으로 1.3을 사용합니다.

  • 핸드셰이크 속도: TLS 1.2의 2-RTT에서 1-RTT로 단축 (0-RTT 재접속도 지원)
  • 보안: 취약한 암호 스위트 제거, Forward Secrecy 필수화
  • 성능: 첫 페이지 로드가 체감 가능하게 빨라짐

보안 헤더 — HTTPS 다음에 반드시 해야 할 것

여기서부터가 오늘의 핵심입니다. 인증서를 설치하고 HTTPS를 강제한 것만으로는 절반만 한 겁니다. 보안 헤더(Security Headers)는 브라우저에게 “이 사이트를 어떻게 다뤄야 하는지” 지시하는 HTTP 응답 헤더입니다.

웹 보안 헤더 6종 요약 인포그래픽

필수 보안 헤더 6가지

1. HSTS (Strict-Transport-Security)

브라우저에게 “이 사이트는 앞으로 지정된 기간 동안 반드시 HTTPS로만 접속해라”고 지시합니다. HTTP → HTTPS 리다이렉트조차 거치지 않고, 브라우저 자체에서 HTTPS로 바꿔 접속합니다.

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
  • max-age=31536000: 1년(초 단위). 브라우저가 이 기간 동안 HTTPS만 사용.
  • includeSubDomains: 모든 서브도메인에도 적용.
  • preload: HSTS Preload List에 등록 요청. 등록되면 브라우저가 첫 방문부터 HTTPS를 강제합니다.

⚠️ HSTS 주의사항: 한번 설정하면 되돌리기 어렵습니다. HTTPS에서 HTTP로 다시 돌아가야 할 상황이 없다면(거의 없겠지만) 적용하세요. max-age를 처음엔 86400(1일)로 시작해서 문제가 없으면 점진적으로 늘리는 것도 방법입니다.

2. X-Content-Type-Options

X-Content-Type-Options: nosniff

브라우저가 응답의 MIME 타입을 “추측”하지 못하게 합니다. 예를 들어 공격자가 악성 스크립트를 이미지 파일로 위장해 업로드하면, 브라우저가 MIME 스니핑으로 이를 실행할 수 있습니다. nosniff는 이를 차단합니다.

3. X-Frame-Options

X-Frame-Options: SAMEORIGIN

사이트가 다른 페이지의 <iframe>에 삽입되는 것을 제한합니다. 클릭재킹 공격 방어의 기본입니다. DENY(완전 차단)와 SAMEORIGIN(같은 출처만 허용) 중 선택할 수 있습니다.

4. X-XSS-Protection

X-XSS-Protection: 1; mode=block

구형 브라우저의 내장 XSS 필터를 활성화합니다. 최신 브라우저는 CSP로 대체하고 있지만, 하위 호환성 차원에서 설정해두면 좋습니다.

5. Referrer-Policy

Referrer-Policy: strict-origin-when-cross-origin

사용자가 링크를 클릭해 다른 사이트로 이동할 때, 어디에서 왔는지(Referrer) 정보를 얼마나 전달할지 제어합니다. strict-origin-when-cross-origin은 같은 출처에서는 전체 URL을, 다른 출처에서는 도메인만 전달합니다.

6. Content-Security-Policy (CSP)

Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; upgrade-insecure-requests

가장 강력하면서도 설정이 까다로운 헤더입니다. 어떤 출처의 리소스(스크립트, 스타일, 이미지 등)를 로드할 수 있는지 세밀하게 제어합니다. XSS 공격의 근본적인 방어선이 됩니다.

위 예시는 기본적인 정책입니다. Google Analytics, 외부 폰트, 광고 스크립트 등을 사용한다면 해당 도메인을 허용 목록에 추가해야 합니다. 처음엔 Report-Only 모드로 시작해 차단되는 리소스를 확인한 뒤 본격 적용하는 것이 안전합니다.

Content-Security-Policy-Report-Only: default-src 'self'; report-uri /csp-report

Cloudflare에서 보안 헤더 자동화하기

보안 헤더를 적용하는 방법은 크게 세 가지입니다. 원본 서버에서 설정하거나, Cloudflare에서 설정하거나, 양쪽을 조합하거나. Cloudflare를 쓰고 있다면 Cloudflare 쪽에서 일괄 관리하는 것이 가장 효율적입니다.

방법 1 — Cloudflare 대시보드: HSTS 설정

HSTS는 Cloudflare 대시보드에서 직접 켤 수 있습니다.

  • SSL/TLS → Edge Certificates로 이동합니다.
  • HTTP Strict Transport Security (HSTS) 섹션에서 Enable HSTS를 클릭합니다.
  • 권장 설정:
    • Max Age: 12 months (최대)
    • Include subdomains: On
    • Preload: On (HSTS Preload List 등록 의향이 있을 때)
    • No-Sniff: On (X-Content-Type-Options: nosniff 자동 추가)
  • 경고 문구를 확인하고 Save를 누릅니다.

이것만으로 HSTS와 X-Content-Type-Options 두 가지가 한번에 적용됩니다.

방법 2 — Transform Rules로 나머지 헤더 추가

HSTS 외의 보안 헤더는 Cloudflare의 Transform Rules (HTTP Response Header Modification)로 추가합니다. 무료 플랜에서 최대 10개의 규칙을 만들 수 있습니다.

  • Rules → Transform Rules로 이동합니다.
  • Modify Response Header 탭을 선택합니다.
  • Create Rule을 클릭합니다.

아래 설정으로 규칙 하나에 여러 헤더를 묶어서 추가합니다.

Rule name: Security Headers

When incoming requests match: All incoming requests (모든 요청에 적용)

Then: 아래 헤더들을 각각 Set static으로 추가합니다.

  • X-Frame-OptionsSAMEORIGIN
  • X-XSS-Protection1; mode=block
  • Referrer-Policystrict-origin-when-cross-origin
  • Permissions-Policycamera=(), microphone=(), geolocation=()
  • Content-Security-Policy → 사이트에 맞는 정책 (아래 예시 참조)

워드프레스 블로그용 CSP 예시:

default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' *.googleapis.com *.gstatic.com *.google-analytics.com *.googletagmanager.com; style-src 'self' 'unsafe-inline' *.googleapis.com; img-src 'self' data: https:; font-src 'self' *.gstatic.com *.googleapis.com; connect-src 'self' *.google-analytics.com *.analytics.google.com *.googletagmanager.com; frame-src 'self' *.youtube.com *.youtube-nocookie.com; upgrade-insecure-requests

정적 사이트(Hugo, Next.js 등)용 CSP 예시:

default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; upgrade-insecure-requests

Deploy를 누르면 즉시 적용됩니다.

Cloudflare Transform Rules 보안 헤더 자동 삽입 흐름도

방법 3 — Cloudflare API로 자동화 (고급)

여러 도메인을 관리하거나, 인프라를 코드로 관리(IaC)하고 싶다면 Cloudflare API를 사용할 수 있습니다.

# Cloudflare API로 Transform Rule 생성
# API 토큰 생성: Cloudflare 대시보드 → My Profile → API Tokens
# 필요 권한: Zone.Transform Rules (Edit)

ZONE_ID="your-zone-id"
API_TOKEN="your-api-token"

curl -X POST \
  "https://api.cloudflare.com/client/v4/zones/${ZONE_ID}/rulesets/phases/http_response_headers_transform/entrypoint" \
  -H "Authorization: Bearer ${API_TOKEN}" \
  -H "Content-Type: application/json" \
  --data '{
    "rules": [
      {
        "expression": "true",
        "description": "Security Headers",
        "action": "rewrite",
        "action_parameters": {
          "headers": {
            "X-Frame-Options": {
              "operation": "set",
              "value": "SAMEORIGIN"
            },
            "X-Content-Type-Options": {
              "operation": "set",
              "value": "nosniff"
            },
            "X-XSS-Protection": {
              "operation": "set",
              "value": "1; mode=block"
            },
            "Referrer-Policy": {
              "operation": "set",
              "value": "strict-origin-when-cross-origin"
            },
            "Permissions-Policy": {
              "operation": "set",
              "value": "camera=(), microphone=(), geolocation=()"
            }
          }
        }
      }
    ]
  }'

이 API 호출 한 번으로 모든 보안 헤더가 설정됩니다. CI/CD 파이프라인에 넣어두면 도메인 추가 시 자동 적용도 가능합니다.

설정 검증 — 내 사이트는 안전한가

설정을 마쳤으면 반드시 확인해야 합니다. 세 가지 방법을 소개합니다.

검증 1: 브라우저 개발자 도구

Chrome에서 사이트에 접속한 뒤 F12 → Network 탭을 엽니다. 페이지의 메인 요청을 클릭하고 Response Headers를 확인합니다. 위에서 설정한 헤더들이 보이면 성공입니다.

검증 2: 터미널 명령어

# curl로 응답 헤더 확인 (Synology NAS 또는 Mac Studio 터미널에서)
curl -I https://example.com

# 출력 예시에서 확인할 항목:
# strict-transport-security: max-age=31536000; includeSubDomains; preload
# x-content-type-options: nosniff
# x-frame-options: SAMEORIGIN
# x-xss-protection: 1; mode=block
# referrer-policy: strict-origin-when-cross-origin

검증 3: 온라인 스캐너

보안 헤더 전문 스캐너에서 종합 점수를 확인합니다.

  • securityheaders.com: 무료. A+ 등급이 목표입니다. 위의 6가지 헤더를 모두 설정하면 A+ 달성 가능.
  • SSL Labs (ssllabs.com/ssltest): SSL/TLS 설정 전반을 심층 분석. A+ 등급이 목표.
  • Cloudflare SSL/TLS Recommender: 대시보드 SSL/TLS 탭에서 자동 권장 사항을 확인.

securityheaders.com에서 A+ 등급을 받았다면, 보안 헤더 설정은 완벽합니다.

Synology NAS 홈랩 실전 — 원본 서버 보안 강화

Cloudflare 엣지에서 보안 헤더를 추가했더라도, Cloudflare 프록시를 거치지 않는 직접 접속(내부망 등)을 대비해 원본 서버에도 기본 헤더를 설정하는 것이 좋습니다.

Synology DSM 역방향 프록시에서 헤더 추가

DSM의 역방향 프록시는 웹 UI에서 커스텀 헤더를 추가하는 기능이 제한적입니다. nginx 설정을 직접 수정해야 합니다.

# SSH로 Synology NAS 접속 후
# 역방향 프록시 사용자 설정 파일 생성
sudo cat > /usr/local/etc/nginx/conf.d/security-headers.conf <<'EOF'
# Security Headers for Origin Server
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
EOF

# nginx 설정 테스트
sudo nginx -t

# nginx 재시작 (DSM 서비스 재시작)
sudo synoservice --restart nginx

⚠️ DSM 업데이트 시 이 설정이 초기화될 수 있으므로, 작업 스케줄러에 복원 스크립트를 등록해두는 것이 좋습니다.

Authenticated Origin Pulls — 원본 접근 제한

보안을 한 단계 더 올리려면 Authenticated Origin Pulls를 활성화합니다. Cloudflare가 원본 서버에 접속할 때 클라이언트 인증서를 제시하도록 하여, Cloudflare를 통하지 않는 모든 접근을 원천 차단합니다.

  • Cloudflare 대시보드 → SSL/TLS → Origin ServerAuthenticated Origin PullsOn으로 토글합니다.
  • 원본 서버 nginx에 Cloudflare 클라이언트 인증서 검증을 추가합니다:
# Cloudflare의 클라이언트 인증서 (Authenticated Origin Pulls용)
curl -o /etc/nginx/ssl/cloudflare-origin-pull-ca.pem \
  https://developers.cloudflare.com/ssl/static/authenticated_origin_pull_ca.pem

# nginx 서버 블록에 추가
ssl_client_certificate /etc/nginx/ssl/cloudflare-origin-pull-ca.pem;
ssl_verify_client on;

이 설정이 활성화되면, 누군가가 원본 서버 IP를 알아내 직접 접속하더라도 Cloudflare 클라이언트 인증서가 없으므로 403 에러가 반환됩니다.

자주 하는 실수와 해결법

실수 1: ERR_TOO_MANY_REDIRECTS (리다이렉트 루프)

가장 흔한 문제입니다. 원인: SSL 모드가 Flexible인데, 원본 서버(워드프레스 등)에서도 HTTPS를 강제하는 경우. Cloudflare → 원본 서버로 HTTP 요청 → 원본이 HTTPS로 리다이렉트 → Cloudflare가 다시 HTTP로 → 무한 반복.

해결: SSL 모드를 Full 또는 Full (Strict)로 변경하면 즉시 해결됩니다.

실수 2: 526 Invalid SSL Certificate

Full (Strict) 모드인데 원본 서버에 유효한 인증서가 없는 경우. Cloudflare Origin CA를 설치하거나, Let’s Encrypt 인증서를 발급받으면 됩니다.

실수 3: Mixed Content 경고

페이지는 HTTPS인데 일부 리소스(이미지, 스크립트)가 HTTP로 로드되는 경우. Automatic HTTPS Rewrites를 켜면 대부분 해결됩니다. 그래도 남으면 소스 코드에서 http://https://로 직접 수정하세요.

실수 4: HSTS 설정 후 사이트 접속 불가

HSTS를 적용했는데 인증서에 문제가 생기면, 브라우저가 HTTP 폴백조차 허용하지 않아 사이트에 접속할 수 없게 됩니다. 처음에는 max-age를 짧게(1일 = 86400초) 설정하고, 안정성을 확인한 뒤 점진적으로 늘리세요.

실수 5: CSP가 너무 엄격해서 사이트가 깨짐

CSP를 설정하면 외부 서비스(Analytics, 광고, 폰트 등)의 스크립트가 차단될 수 있습니다. 반드시 Report-Only 모드로 먼저 테스트하세요.

월 비용 명세표

이번 회차에서 다룬 기능들의 플랜별 비용입니다.

기능 Free ($0) Pro ($20/월) Business ($200/월)
Universal SSL (Edge 인증서) ✅ 포함 ✅ 포함 ✅ 포함
Origin CA 인증서 (15년) ✅ 무료 ✅ 무료 ✅ 무료
Always Use HTTPS
Automatic HTTPS Rewrites
HSTS 설정
TLS 1.3
Minimum TLS Version 설정
Transform Rules (헤더 수정) ✅ 10개 ✅ 25개 ✅ 50개
Authenticated Origin Pulls
Advanced Certificate Manager $10/월 추가 $10/월 추가
Total Encryption Mode 설정

핵심 결론: 이 글에서 다룬 모든 보안 설정은 무료 플랜으로 충분합니다. Advanced Certificate Manager(커스텀 인증서 업로드, 인증서 우선순위 제어)는 대부분의 개인/소규모 사이트에서는 불필요합니다.

한 장 요약 — 오늘 해야 할 체크리스트

여기까지 읽었으면 이제 직접 적용할 차례입니다. 순서대로 따라가세요.

  • SSL/TLS 모드를 Full (Strict)로 변경
  • Origin CA 인증서 발급 → 원본 서버에 설치
  • Always Use HTTPS 켜기
  • Automatic HTTPS Rewrites 켜기
  • Minimum TLS Version을 1.2로 설정
  • HSTS 활성화 (max-age 86400부터 시작)
  • Transform Rules로 보안 헤더 5종 추가
  • securityheaders.com에서 A+ 등급 확인
  • ☐ (선택) Authenticated Origin Pulls 활성화

모두 무료입니다. 걸리는 시간은 Origin CA 인증서 설치까지 포함해도 30분 이내입니다.

다음 4회에서는 Cloudflare Pages로 정적 사이트를 무료 배포하는 방법을 다룹니다. GitHub 저장소 하나로 빌드·배포·커스텀 도메인·HTTPS까지 자동화되는 Jamstack 워크플로를 실습합니다.

이미지는 Leonardo AI 로 생성되었습니다.

이미지는 Claude AI 로 생성되었습니다.


📚 시리즈: Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지 (총 16화 중 3화)
이전 2화  (다음 차수는 아직 게시되지 않았습니다)
작성일 댓글 한 개

[Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지] 2/16화: 클라우드플레어 DNS 설정부터 CDN 캐시까지 30분 완성 가이드

클라우드플레어 DNS 대시보드 설정 화면

이 글은 「Cloudflare 완전 정복」 시리즈 2회입니다. 1회에서 Cloudflare가 단순 CDN을 넘어 연결성 클라우드로 진화했다는 큰 그림을 살펴봤다면, 오늘은 직접 손을 움직일 차례입니다. 도메인 1개, 30분, 비용 0원 — 이 세 조건만으로 DNS 보호, 글로벌 CDN, 캐시 최적화를 한꺼번에 켜 보겠습니다.

왜 DNS부터 시작해야 하는가

Cloudflare의 모든 기능은 DNS를 자사 네임서버로 위임하는 순간부터 작동합니다. 터널도, Zero Trust도, Workers도 결국 DNS 레코드 위에 올라갑니다. 반대로 말하면, DNS 설정 하나를 제대로 해 두면 이후 시리즈에서 다룰 모든 기능을 추가 비용 없이 점진적으로 활성화할 수 있습니다.

클라우드플레어 DNS 설정의 핵심 이점 세 가지:

  • Anycast 네트워크 — 전 세계 330개 이상 도시에서 DNS 응답. 국내 사용자도 서울·도쿄 PoP에서 수 밀리초 내에 응답받습니다.
  • DDoS 방어 기본 포함 — 무료 플랜에서도 무제한 DNS 쿼리 DDoS 완화가 적용됩니다.
  • 프록시(오렌지 구름) 한 번 클릭 — A/AAAA/CNAME 레코드에 프록시를 켜는 순간, CDN + SSL + 기본 WAF가 동시에 활성화됩니다.
Cloudflare DNS 프록시 요청 흐름도

Step 1 — Cloudflare에 도메인 추가 (5분)

1-1. 계정 생성 및 사이트 추가

dash.cloudflare.com/sign-up에서 무료 계정을 만든 뒤, 대시보드 상단 「+ Add a site」를 클릭합니다. 도메인(예: example.com)을 입력하고 Free 플랜을 선택하세요.

1-2. 기존 DNS 레코드 자동 스캔

Cloudflare가 현재 네임서버에 등록된 레코드를 자동으로 가져옵니다. 가져온 목록을 확인하고, 빠진 레코드가 있으면 수동으로 추가합니다. 특히 MX 레코드(이메일)와 TXT 레코드(SPF/DKIM)가 빠지기 쉬우니 꼭 확인하세요.

1-3. 네임서버 변경

Cloudflare가 할당한 두 개의 네임서버(예: anna.ns.cloudflare.com, bob.ns.cloudflare.com)를 도메인 등록 대행사(가비아, 호스팅케이알, Namecheap 등)의 관리 패널에서 교체합니다.

주의: 네임서버 변경은 전파에 최대 24~48시간이 걸릴 수 있지만, 대부분 1~2시간 내에 완료됩니다.

Step 2 — DNS 레코드 구성과 프록시 활성화 (10분)

2-1. 핵심 레코드 설정

네임서버 전파가 완료되면(대시보드에 “Active” 표시), DNS 탭에서 레코드를 정리합니다.

워드프레스 블로그를 Cloudflare CDN으로 가속하는 전형적인 구성:

  • A@ → 서버 IP (프록시 ON 🟠)
  • CNAMEwwwexample.com (프록시 ON 🟠)
  • MX@ → 메일 서버 (프록시 OFF ⬜, MX는 프록시 불가)
  • TXT — SPF/DKIM/DMARC (프록시 OFF ⬜)

2-2. 오렌지 구름(프록시)의 의미

레코드 옆 구름 아이콘이 🟠 주황색이면 트래픽이 Cloudflare를 경유합니다. 이 순간부터:

  • 원본 서버 IP가 외부에 노출되지 않습니다 (보안 향상).
  • Cloudflare의 글로벌 CDN 캐시가 자동 적용됩니다.
  • 무료 SSL/TLS 인증서가 자동 발급됩니다.
  • 기본 DDoS 방어가 활성화됩니다.

⬜ 회색 구름(DNS only)은 Cloudflare를 단순 DNS 리졸버로만 사용합니다. 메일 서버(MX), SSH 직접 접속용 서브도메인 등에 적합합니다.

2-3. 실습 — CLI로 DNS 전파 확인

Synology NAS SSH 또는 Mac Studio 터미널에서 다음 명령어로 네임서버 전환과 프록시 적용을 확인합니다:

# 네임서버가 Cloudflare로 변경됐는지 확인
dig NS example.com +short
# 기대 출력: anna.ns.cloudflare.com. / bob.ns.cloudflare.com.

# A 레코드가 Cloudflare IP로 프록시되는지 확인
dig A example.com +short
# 프록시 ON이면 원본 IP 대신 Cloudflare IP(104.x.x.x 또는 172.x.x.x)가 표시됨

# 응답 헤더에서 Cloudflare 경유 확인
curl -sI https://example.com | grep -i "cf-ray\|server"
# 기대 출력: server: cloudflare / cf-ray: xxxxxxx-ICN

cf-ray 헤더가 보이면 성공입니다. 끝에 붙는 3글자 코드(예: ICN)는 응답한 Cloudflare PoP의 IATA 공항 코드로, ICN은 인천(서울) 엣지입니다.

프록시 ON과 DNS Only 비교 일러스트

Step 3 — CDN 캐시 설정 최적화 (15분)

3-1. Cloudflare가 기본으로 캐시하는 것

프록시를 켜는 순간 Cloudflare는 정적 파일을 자동으로 캐시합니다. 별도 설정 없이 캐시되는 확장자:

js, css, png, jpg, jpeg, gif, ico, svg, woff, woff2, ttf, eot, webp, avif, mp4, webm

HTML은 기본적으로 캐시하지 않습니다. 워드프레스처럼 동적 페이지를 운영하는 경우, HTML 캐시를 원하면 Cache Rules에서 명시적으로 설정해야 합니다.

3-2. Cache Rules로 워드프레스 최적화

대시보드 → Caching → Cache Rules에서 무료 플랜 기준 최대 10개의 규칙을 만들 수 있습니다. 워드프레스 블로그에 권장하는 기본 규칙 두 가지:

규칙 1: 관리자 영역 캐시 제외

  • When: URI Path contains /wp-admin OR URI Path contains /wp-login
  • Then: Bypass cache

규칙 2: 정적 콘텐츠 공격적 캐시

  • When: URI Path contains /wp-content/uploads
  • Then: Eligible for cache, Edge TTL = 1 month, Browser TTL = 1 week

3-3. 브라우저 캐시 TTL 설정

Caching → Configuration에서 Browser Cache TTL을 설정합니다. 권장값:

  • 블로그/뉴스 사이트: 4시간 (콘텐츠 업데이트 빈도 고려)
  • 정적 포트폴리오: 1개월
  • 자주 바뀌는 API 응답: Respect Existing Headers (서버 Cache-Control 존중)

3-4. 캐시 적중률 확인

설정 후 하루 정도 지나면 대시보드 → Analytics & Logs → Traffic에서 캐시 적중률(Cache Hit Ratio)을 확인할 수 있습니다. 정적 콘텐츠 중심 사이트라면 80% 이상이 목표치입니다.

CLI로도 개별 요청의 캐시 상태를 바로 확인할 수 있습니다:

# 캐시 상태 헤더 확인
curl -sI https://example.com/wp-content/uploads/photo.jpg | grep "cf-cache-status"
# HIT = 캐시에서 서빙 (원본 서버 부하 없음)
# MISS = 캐시 없어서 원본에서 가져옴 (다음 요청부턴 HIT)
# DYNAMIC = 캐시 대상 아님 (HTML 등)
# BYPASS = Cache Rules에 의해 캐시 건너뜀

3-5. 캐시 퍼지 (필요 시)

콘텐츠를 수정했는데 이전 버전이 계속 보인다면 캐시를 수동으로 비워야 합니다:

# Cloudflare API로 특정 URL 캐시 퍼지 (API 토큰 필요)
curl -X POST "https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/purge_cache" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{"files":["https://example.com/updated-page"]}'

# 전체 캐시 퍼지 (주의: 일시적 부하 증가)
curl -X POST "https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/purge_cache" \
  -H "Authorization: Bearer YOUR_API_TOKEN" \
  -H "Content-Type: application/json" \
  --data '{"purge_everything":true}'

대시보드에서도 Caching → Configuration → Purge Cache로 동일하게 가능합니다. 일반적으로는 대시보드 UI가 더 편합니다.

Cloudflare 캐시 상태 코드 인포그래픽

워드프레스 사용자를 위한 추가 팁

Cloudflare 워드프레스 플러그인

워드프레스를 운영한다면 공식 Cloudflare 플러그인을 설치하세요. 글 발행·수정 시 해당 URL의 캐시를 자동으로 퍼지해 줍니다. 설정 방법:

  1. 워드프레스 관리자 → 플러그인 → 새로 추가 → “Cloudflare” 검색 → 설치·활성화
  2. Cloudflare 대시보드에서 API 토큰 생성 (권한: Zone → Cache Purge → Edit)
  3. 플러그인 설정에서 토큰 입력 → 연동 완료

이렇게 하면 글을 수정할 때마다 수동으로 캐시를 비울 필요가 없습니다.

APO (Automatic Platform Optimization)

워드프레스 전용 유료 옵션인 APO($5/월)를 사용하면 HTML까지 Cloudflare 엣지에 캐시하여 TTFB(첫 바이트 도달 시간)를 극적으로 줄일 수 있습니다. 무료 플랜으로 시작하고, 트래픽이 늘면 고려해 볼 만한 옵션입니다.

월 비용 명세표

기능 Free (무료) Pro ($20/월) Business ($200/월)
DNS 호스팅 무제한 쿼리, 무제한 레코드 동일 동일
CDN / Anycast 무제한 대역폭, 전송료 0원 동일 동일
SSL/TLS (Universal) 자동 발급·갱신 포함 동일 + 고급 인증서 옵션 동일 + 전용 인증서
Cache Rules 10개 25개 50개
Page Rules (레거시) 3개 20개 50개
DDoS 방어 무제한 (Unmetered) 동일 동일
워드프레스 APO $5/월 추가 포함 포함
이미지 최적화 (Polish) 미포함 포함 포함

핵심: 오늘 다룬 DNS + CDN + 캐시 설정은 무료 플랜에서 100% 사용 가능합니다. 대역폭 제한도, 전송료도 없습니다. 월 수만 PV 규모의 블로그라면 무료 플랜만으로 충분합니다.

30분 셋업 체크리스트

오늘 한 작업을 정리합니다:

  • ✅ Cloudflare 계정 생성 + 도메인 추가
  • ✅ 네임서버를 Cloudflare로 변경
  • ✅ A/CNAME 레코드에 프록시(🟠) 활성화
  • ✅ MX/TXT 레코드는 DNS only(⬜)로 유지
  • ✅ Cache Rules 2개 설정 (관리자 제외 + 업로드 공격적 캐시)
  • ✅ Browser Cache TTL 설정
  • curl -sI로 cf-ray 헤더와 캐시 상태 확인

이것만으로 여러분의 사이트는 글로벌 330개 도시의 CDN 위에 올라갔고, 원본 서버 IP는 숨겨졌으며, 정적 파일은 방문자와 가장 가까운 엣지에서 서빙됩니다.

다음 회차 예고

3회에서는 오늘 자동으로 켜진 SSL/TLS를 한 단계 더 강화합니다. Full (Strict) 모드, HSTS, 보안 헤더(CSP·X-Frame-Options)까지 — “주소창 자물쇠”를 완벽하게 만드는 HTTPS 설정 완전 가이드를 준비하고 있습니다.

이미지는 Leonardo AI 로 생성되었습니다.

이미지는 Claude AI 로 생성되었습니다.


📚 시리즈: Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지 (총 16화 중 2화)
이전 1화  (다음 차수는 아직 게시되지 않았습니다)
작성일 댓글 한 개

[Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지] 1/16화: 2026 클라우드플레어 시작 — CDN 그 너머, 연결성 클라우드 완전 해부

A breathtaking aerial view of Earth at night showcasing city lights across continents.

이 글은 「Cloudflare 완전 정복」 시리즈 1회입니다. 총 16회에 걸쳐 무료 CDN·DNS부터 2026년 AI 에이전트 인프라까지, Cloudflare의 모든 것을 실습 명령어와 월 비용 명세표와 함께 파헤칩니다.

“Cloudflare? 그거 무료 CDN 아니야?” — 아마 많은 분이 이렇게 기억하실 겁니다. 블로그에 달아두면 속도가 좀 빨라지고, DDoS를 막아주는 그 서비스. 맞습니다, 한때는 그랬습니다. 하지만 2026년 5월 현재, Cloudflare는 완전히 다른 회사가 되었습니다. 지난주(5월 19일) 발표된 Agents Week 2026의 내용을 보면, 이 회사가 향하는 곳이 어디인지 확실해집니다. AI 에이전트가 스스로 코드를 실행하고, 이메일을 보내고, 외부 API를 호출하는 — 그 모든 인프라를 엣지에서 제공하겠다는 선언입니다.

이 시리즈는 그래서 시작합니다. Cloudflare를 단 한 번도 써본 적 없는 분부터, 이미 Workers를 쓰고 있지만 2026년 신기능이 궁금한 개발자까지 — 16회에 걸쳐 단계별로 안내하겠습니다. 매 회차마다 Synology NAS DS+925Mac Studio 홈랩 환경에서 실제로 동작하는 명령어를 제공하고, 기능별 비용을 투명하게 정리합니다.

왜 2026년에 다시 Cloudflare인가

클라우드 시장은 지난 10년간 AWS·GCP·Azure 세 거인의 무대였습니다. “클라우드를 쓴다”는 말은 곧 “이 셋 중 하나의 리전에 서버를 띄운다”는 뜻이었죠. 그런데 이 모델에는 구조적인 문제가 있습니다.

  • 리전 종속: 서울 리전을 선택하면 부산의 사용자도, 도쿄의 사용자도 서울까지 왕복해야 합니다.
  • 송신 비용(egress): 데이터를 밖으로 꺼낼 때마다 과금됩니다. AWS S3에서 1TB를 꺼내면 약 $90. 매달.
  • 복잡성: IAM 정책, VPC 설정, 서브넷, 보안 그룹… 간단한 API 하나 띄우는 데 20가지 설정이 필요합니다.
  • 콜드 스타트: 서버리스(Lambda 등)를 쓰면 함수가 잠들었다 깨어나는 데 수백 밀리초가 걸립니다.

Cloudflare는 이 모든 문제에 대해 정반대의 답을 내놓았습니다. 리전이 없습니다 — 전 세계 330개 이상 도시의 데이터센터 모두가 곧 서버입니다. 송신 비용이 없습니다 — R2 스토리지의 egress는 $0입니다. 설정이 단순합니다 — wrangler deploy 한 줄이면 전 세계 배포가 끝납니다. 콜드 스타트가 없습니다 — Workers는 V8 isolate 기반으로 0ms 콜드 스타트를 달성합니다.

그리고 2026년, Cloudflare는 여기서 한 발 더 나아갑니다. 단순히 “더 빠른 클라우드”가 아니라, AI 에이전트가 살아 숨 쉬는 플랫폼이 되겠다는 것입니다.

Cloudflare 2010-2026 진화 타임라인

Cloudflare의 진화 — CDN에서 연결성 클라우드까지

Cloudflare의 역사를 따라가 보면, 매 2~3년마다 정체성이 한 단계씩 확장되어 왔음을 알 수 있습니다. 현재의 모습을 이해하려면 이 궤적을 아는 것이 중요합니다.

2010~2013: CDN과 DDoS 방어의 민주화

Matthew Prince와 Michelle Zatlyn이 공동 창업한 Cloudflare는 “인터넷을 더 빠르고, 더 안전하게”라는 슬로건으로 시작했습니다. 핵심은 리버스 프록시 — 웹사이트 앞에 Cloudflare가 서서 캐시와 보안을 동시에 제공하는 모델입니다. 혁신적이었던 것은 가격이었습니다. 당시 CDN은 Akamai 같은 대형 업체가 연간 수천만 원의 계약으로만 제공하던 서비스였는데, Cloudflare는 이를 무료로 열었습니다.

2014: Universal SSL — 무료 HTTPS의 시대를 열다

2014년 9월, Cloudflare는 모든 무료 플랜 사용자에게 SSL 인증서를 무료로 제공한다고 발표했습니다. 하룻밤 사이에 인터넷의 암호화된 사이트 수가 두 배로 늘었다는 유명한 일화가 여기서 나옵니다. Let’s Encrypt가 출범하기 1년 전의 일입니다. “보안은 특권이 아니라 기본권”이라는 Cloudflare의 철학이 처음으로 선명하게 드러난 순간이었습니다.

2017~2018: Workers 출시 — CDN 회사에서 컴퓨팅 회사로

2017년, Cloudflare는 Workers를 발표합니다. CDN의 엣지 서버에서 JavaScript 코드를 실행할 수 있게 한 것입니다. Chrome의 V8 엔진을 isolate 형태로 돌리는 이 아키텍처는, AWS Lambda 같은 기존 서버리스와 근본적으로 달랐습니다. VM이나 컨테이너를 띄우는 게 아니라, 경량 isolate 안에서 코드가 실행되니 콜드 스타트가 사실상 없었습니다.

이 순간이 Cloudflare의 첫 번째 정체성 전환점입니다. CDN에 콘텐츠를 캐싱하는 회사에서, 엣지에서 코드를 실행하는 컴퓨팅 플랫폼이 된 것입니다.

2019~2020: 네트워크 인프라의 확장

1.1.1.1 퍼블릭 DNS와 WARP VPN이 출시되고, Cloudflare Access(제로 트러스트 접근 제어)와 Cloudflare Tunnel(인바운드 포트 없이 내부 서비스를 안전하게 공개)이 등장합니다. Cloudflare Pages로 정적 사이트 호스팅에 진입하고, Durable Objects로 상태를 가진(stateful) 엣지 컴퓨팅의 문을 열었습니다.

CDN → 컴퓨팅 → 네트워크 인프라로의 두 번째 전환입니다.

2022: R2와 D1 — 스토리지 전쟁 선언

R2는 Cloudflare가 AWS S3에 정면으로 도전장을 내민 오브젝트 스토리지입니다. S3 호환 API를 쓰면서 송신 비용(egress)이 $0. 이는 단순한 가격 경쟁이 아닙니다. 클라우드 업계의 가장 큰 고착(lock-in) 요인이 바로 egress 비용이었기 때문입니다. 데이터를 넣는 건 공짜인데 꺼내려면 돈이 드니, 한번 넣으면 옮기기 어렵죠. R2는 이 족쇄를 끊었습니다.

D1은 엣지에서 돌아가는 SQLite 데이터베이스입니다. Workers와 결합하면, 별도의 데이터베이스 서버 없이 전 세계에서 SQL 쿼리를 실행할 수 있습니다.

2023~2024: AI 인프라 진입과 “연결성 클라우드” 선언

2023년, Workers AI가 등장합니다. 엣지 서버에 GPU를 배치하여 LLM 추론을 제공하는 서비스입니다. Vectorize(벡터 데이터베이스)와 AI Gateway(LLM API 프록시·캐시)도 함께 출시됩니다.

2024년, Cloudflare는 공식적으로 자사를 “연결성 클라우드(Connectivity Cloud)”로 재정의합니다. AWS가 “컴퓨팅 클라우드”, GCP가 “데이터 클라우드”를 표방한다면, Cloudflare는 “모든 것을 연결하는 클라우드”를 선언한 것입니다.

2025: FL2 아키텍처 — Rust 기반 성능 혁신

Cloudflare는 자사 네트워크의 핵심 런타임을 FL2(Firewall Language 2)라는 Rust 기반 아키텍처로 전환합니다. 이를 통해 전 세계 주요 네트워크 대비 60%의 성능 우위를 확보했다고 발표합니다. 이것은 단순한 소프트웨어 최적화가 아니라, Cloudflare의 모든 제품 — CDN, WAF, Workers, AI — 이 돌아가는 기반 플랫폼 자체의 교체입니다.

2026년 5월: Agents Week — AI 에이전트의 집이 되다

그리고 바로 지난주(5월 19일~23일), Cloudflare는 Agents Week 2026을 통해 가장 대담한 비전을 제시합니다. AI 에이전트가 코드를 실행하고, 파일을 읽고, 이메일을 보내고, API를 호출하는 — 그 모든 행위의 인프라를 Cloudflare 엣지에서 제공하겠다는 것입니다. 이에 대해서는 아래에서 더 자세히 다루겠습니다.

연결성 클라우드 — 기존 클라우드와 무엇이 다른가

“연결성 클라우드”라는 표현이 마케팅 용어처럼 들릴 수 있습니다. 하지만 기술적 실체를 살펴보면, Cloudflare가 AWS·GCP·Azure와 구조적으로 다른 접근을 취하고 있음을 알 수 있습니다.

리전이 없다 — “지구 전체가 하나의 리전”

전통적 클라우드에서는 코드를 배포할 때 리전(서울, 도쿄, 버지니아 등)을 선택합니다. 그 리전의 데이터센터에서 서버가 돌아가고, 전 세계 사용자가 그 한 곳으로 요청을 보냅니다. CDN으로 정적 자산은 분산할 수 있지만, 비즈니스 로직(서버 코드)은 여전히 한 곳에 고정됩니다.

Cloudflare Workers는 다릅니다. 코드를 배포하면 330개 이상 도시의 모든 엣지 노드에 자동 배포됩니다. 서울의 사용자 요청은 서울에서, 뉴욕의 요청은 뉴욕에서, 상파울루의 요청은 상파울루에서 처리됩니다. 리전을 선택하는 개념 자체가 없습니다.

V8 Isolate — 컨테이너보다 가볍고 빠른 실행 단위

AWS Lambda는 요청이 들어오면 마이크로VM(Firecracker)을 부팅합니다. 최적화를 많이 했지만, 여전히 수십~수백 밀리초의 콜드 스타트가 있습니다. Cloudflare Workers는 Chrome V8 엔진의 isolate를 사용합니다. 하나의 프로세스 안에서 수천 개의 isolate가 메모리를 공유하되 코드는 격리됩니다. 새 isolate를 만드는 데 걸리는 시간은 5밀리초 미만. 사실상 콜드 스타트 제로입니다.

네트워크 = 플랫폼

가장 핵심적인 차이는 여기 있습니다. AWS에게 네트워크는 “서비스를 연결하는 배관”입니다. Cloudflare에게 네트워크는 서비스 그 자체입니다. CDN, DNS, WAF, DDoS 방어, 로드밸런싱, VPN — 이 모든 것이 같은 엣지 노드에서, 같은 소프트웨어 스택 위에서 돌아갑니다. 요청이 Cloudflare 네트워크에 진입하는 순간, 보안 검사·캐싱·라우팅·컴퓨팅이 한 곳에서 동시에 일어납니다.

이것이 “연결성 클라우드”의 진짜 의미입니다. 클라우드의 핵심 가치를 “컴퓨팅 자원의 임대”가 아니라 “모든 것의 연결과 보호”로 재정의한 것입니다.

Cloudflare 2026 AI 에이전트 아키텍처

2026 Agents Week — 게임 체인저가 된 일주일

2026년 5월 셋째 주, Cloudflare는 Agents Week를 통해 AI 에이전트 시대를 위한 인프라 플랫폼 비전을 전면에 내세웠습니다. 단순히 “우리도 AI 합니다”가 아닙니다. AI 에이전트가 자율적으로 작업을 수행하려면 반드시 필요한 것들 — 실행 환경, 상태 관리, 네트워크 보안, 외부 통신 — 을 체계적으로 제공하겠다는 포괄적인 발표였습니다.

주요 발표 내용 한눈에 보기

  • Sandboxes GA: 에이전트에게 셸·파일시스템·백그라운드 프로세스를 제공하는 영속적(persistent) 실행 환경. 에이전트가 코드를 작성하고, 실행하고, 결과를 확인하는 모든 과정이 격리된 샌드박스 안에서 이루어집니다.
  • Workflows v2: 최대 5만 개의 동시 워크플로우를 지원하는 오케스트레이션 엔진. 에이전트의 복잡한 다단계 작업을 안정적으로 관리합니다.
  • Cloudflare Mesh + Workers VPC: 에이전트 간, 그리고 에이전트와 내부 서비스 간의 사설 네트워크. 인터넷에 노출하지 않고도 에이전트가 내부 API를 호출할 수 있습니다.
  • MCP Server Portals: Zero Trust 기반의 에이전트 게이트웨이. AI 에이전트가 외부 도구(MCP 서버)에 접근할 때, 인증·인가·감사를 Cloudflare가 중앙에서 관리합니다.
  • Email Service (public beta): 에이전트가 이메일을 발송·수신·처리할 수 있는 네이티브 이메일 인프라. SendGrid나 SES 없이 Cloudflare만으로 가능합니다.
  • Artifacts: Git 호환 버전 스토리지. 에이전트가 생성한 코드·문서·데이터를 버전 관리합니다.
  • Anthropic Claude Managed Agents 통합 (5월 19일 발표): Anthropic의 Claude가 Cloudflare 인프라 위에서 관리형 에이전트로 실행될 수 있는 통합입니다.

왜 이것이 중요한가

AI 에이전트는 단순한 챗봇과 다릅니다. 챗봇은 “질문 → 답변”의 한 번짜리 상호작용이지만, 에이전트는 자율적으로 여러 단계의 작업을 수행합니다. 코드를 짜고, 테스트를 돌리고, 결과를 분석하고, 필요하면 외부 API를 호출하고, 이메일을 보냅니다.

이런 에이전트에게 필요한 것은 무엇일까요?

  • 격리된 실행 환경: 에이전트가 코드를 실행할 때, 호스트 시스템을 오염시키지 않아야 합니다 → Sandboxes
  • 상태 관리: 에이전트의 작업 맥락(context)이 유지되어야 합니다 → Durable Objects + Artifacts
  • 보안 경계: 에이전트가 어떤 자원에 접근할 수 있는지 통제해야 합니다 → MCP Server Portals + Zero Trust
  • 네트워크 연결: 에이전트가 내부 서비스와 안전하게 통신해야 합니다 → Cloudflare Mesh
  • 오케스트레이션: 여러 에이전트의 작업을 조율해야 합니다 → Workflows v2

Cloudflare는 이 모든 것을 엣지에서, 하나의 플랫폼으로 제공합니다. 에이전트가 서울에서 실행되면 서울 엣지에서, 런던에서 실행되면 런던 엣지에서 — 사용자와 가장 가까운 곳에서 돌아갑니다.

이 시리즈의 13~16회에서 이 기능들을 하나씩 실습과 함께 깊이 다룰 예정입니다. 지금은 “Cloudflare가 향하는 방향”을 이해하는 것으로 충분합니다.

시리즈 로드맵 — 16회의 여정

이 시리즈는 4단계(Phase)로 구성됩니다. 각 단계마다 대상 독자와 난이도가 달라지므로, 본인의 수준과 관심사에 맞는 단계부터 읽으셔도 됩니다. 물론, 1회부터 순서대로 읽으면 가장 체계적으로 이해할 수 있습니다.

Cloudflare 완전 정복 16회 시리즈 로드맵

Phase 1: 입문·기초 (1~4회) — “무료로 시작하는 Cloudflare”

대상 독자: 블로거, 소상공인, Cloudflare를 처음 접하는 분

  • 1회 (지금 읽고 계신 글): 왜 2026년에 다시 Cloudflare인가
  • 2회: DNS 설정과 CDN 기초 — 워드프레스·티스토리에 Cloudflare 입히기
  • 3회: SSL/HTTPS 설정과 보안 헤더 — 내 사이트를 안전하게
  • 4회: Cloudflare Pages로 정적 사이트 배포 — GitHub 연결부터 커스텀 도메인까지

Phase 2: 홈랩·자가호스팅 (5~8회) — “NAS를 안전하게 세상에 공개하기”

대상 독자: Synology NAS 사용자, 홈서버 운영자, 재택근무자

  • 5회: Cloudflare Tunnel — 포트 포워딩 없이 NAS 외부 접속
  • 6회: Zero Trust와 Cloudflare Access — 재택근무 보안 게이트웨이
  • 7회: 1.1.1.1과 WARP VPN — DNS 광고 차단과 개인 정보 보호
  • 8회: Cloudflare R2 — S3 대체 오브젝트 스토리지, NAS 백업 연동

Phase 3: 개발자 플랫폼 (9~12회) — “서버 없이 풀스택 앱 만들기”

대상 독자: 1인 개발자, SaaS 창업자, 사이드 프로젝트 운영자

  • 9회: Cloudflare Workers — 서버리스 엣지 컴퓨팅의 기본
  • 10회: Workers KV, D1, Durable Objects — 엣지 데이터 스토어 완전 가이드
  • 11회: Wrangler CLI — 로컬 개발부터 배포까지
  • 12회: Workers AI — 엣지에서 LLM 돌리기

Phase 4: 2026 AI 에이전트 시대 (13~16회) — ★ 시그니처

대상 독자: AI 엔지니어, 에이전트 빌더, 풀스택 개발자

  • 13회: Agents Week 2026 해부 — Sandboxes, Dynamic Workers, 그 의미
  • 14회: MCP Server Portals와 AI 에이전트 보안 — NeighborJack 사례에서 배우는 교훈
  • 15회: Email Service, Workflows v2 — 에이전트 오케스트레이션 실전
  • 16회: Cloudflare 풀스택 — 1인 개발자의 서버리스 창업 아키텍처

Cloudflare 2026 사용법 — 첫 걸음 내딛기

서론이 길었습니다. 이제 직접 시작해봅시다. 이번 회차에서는 Cloudflare 계정을 만들고, 도메인을 연결하고, 실제로 Cloudflare가 동작하는지 확인하는 것까지 진행합니다.

1단계: 계정 생성

dash.cloudflare.com에 접속하여 이메일과 비밀번호로 계정을 생성합니다. 무료 플랜으로 시작하면 됩니다. 신용카드가 필요 없습니다.

2단계: 도메인 추가

대시보드에서 “Add a site”를 클릭하고 보유한 도메인을 입력합니다. Cloudflare가 기존 DNS 레코드를 자동 스캔합니다. 플랜은 Free를 선택합니다.

Cloudflare가 제시하는 두 개의 네임서버(예: ada.ns.cloudflare.com, bob.ns.cloudflare.com)를 도메인 등록기관(가비아, 카페24, Namecheap 등)의 네임서버 설정에 입력합니다. 전파까지 보통 수 분에서 최대 24시간 걸리지만, 대부분 30분 이내에 완료됩니다.

3단계: 동작 확인 — 실습 명령어

도메인이 Cloudflare에 연결됐는지 확인해봅시다. 아래 명령어는 Synology NAS DS+925(SSH 접속 후)과 Mac Studio에서 모두 동작합니다.

# ── Synology NAS (SSH) 또는 Mac Studio 터미널 ──

# 1. 네임서버가 Cloudflare로 변경됐는지 확인
dig NS yourdomain.com +short
# 기대 결과: ada.ns.cloudflare.com. / bob.ns.cloudflare.com. (예시)

# 2. Cloudflare의 1.1.1.1 DNS로 직접 질의
dig @1.1.1.1 yourdomain.com A +short
# 기대 결과: Cloudflare 프록시 IP (104.x.x.x 또는 172.x.x.x 대역)

# 3. HTTP 헤더에서 Cloudflare 프록시 동작 확인
curl -sI https://yourdomain.com | grep -iE "(cf-ray|server|cf-cache)"
# 기대 결과:
#   server: cloudflare
#   cf-ray: xxxxxxx-ICN    (ICN = 서울 PoP)
#   cf-cache-status: HIT 또는 DYNAMIC

cf-ray 헤더 끝의 세 글자는 요청이 처리된 Cloudflare PoP(Point of Presence)의 IATA 공항 코드입니다. ICN은 인천(서울), NRT는 나리타(도쿄). 서울에서 접속했는데 ICN이 나온다면, Cloudflare가 여러분의 요청을 서울 엣지에서 처리하고 있다는 뜻입니다.

Mac Studio에서 cloudflared 설치 (미리 준비)

이후 회차(5회 Tunnel 편)에서 본격적으로 사용하겠지만, 미리 설치해두면 편합니다.

# ── Mac Studio ──

# Homebrew로 cloudflared 설치
brew install cloudflared

# 설치 확인
cloudflared --version
# 기대 결과: cloudflared version 2026.x.x (built ...)

# Cloudflare 계정 인증 (브라우저가 열림)
cloudflared login

Synology NAS에서 cloudflared 설치 (Docker 방식)

Synology NAS DS+925은 Container Manager(Docker)를 지원합니다. SSH 접속 후 아래 명령어로 cloudflared를 준비합니다.

# ── Synology NAS DS+925 (SSH) ──

# cloudflared 이미지 풀
sudo docker pull cloudflare/cloudflared:latest

# 버전 확인
sudo docker run --rm cloudflare/cloudflared:latest --version

# (참고) 실제 Tunnel 설정은 5회에서 상세히 다룹니다.
# 지금은 이미지가 정상적으로 풀되는지만 확인하세요.

보너스: 내 IP가 Cloudflare를 통과하는지 확인

# ── 어디서든 (NAS, Mac, 또는 일반 PC) ──

# Cloudflare의 추적(trace) 엔드포인트
curl https://1.1.1.1/cdn-cgi/trace

# 출력 예시:
# fl=xxx
# h=1.1.1.1
# ip=YOUR_PUBLIC_IP
# ts=1716451200
# visit_scheme=https
# uag=curl/8.x.x
# colo=ICN           ← 서울 데이터센터
# sliver=none
# http=http/2
# loc=KR             ← 한국
# tls=TLSv1.3
# sni=plaintext
# warp=off           ← WARP 미사용 상태

colo=ICNloc=KR이 보인다면, 여러분의 요청은 서울의 Cloudflare 엣지 노드를 거치고 있습니다.

월 비용 명세표 — Cloudflare 플랜 비교 (2026년 5월 기준)

Cloudflare의 가장 큰 강점 중 하나는 무료 플랜의 범위가 넓다는 것입니다. 개인 블로그나 소규모 프로젝트는 대부분 무료 플랜으로 충분합니다.

기능 Free (무료) Pro ($20/월) Business ($200/월)
CDN·캐싱 무제한 대역폭 무제한 + 향상된 캐시 무제한 + 커스텀 캐시 키
DNS 무제한 쿼리 동일 동일
SSL/TLS Universal SSL (공유) 전용 인증서 전용 + 와일드카드
DDoS 방어 무제한, 무과금 동일 동일
WAF(웹 방화벽) 기본 규칙 세트 관리형 규칙 + OWASP 고급 커스텀 규칙
Page Rules 3개 20개 50개
Workers 10만 req/일 동일 (유료 플랜 별도) 동일 (유료 플랜 별도)
R2 스토리지 10GB, 100만 A/1000만 B ops, egress $0 동일 (종량 가능) 동일 (종량 가능)
Pages 500 빌드/월, 무제한 대역폭 5,000 빌드/월 20,000 빌드/월
Zero Trust 50 사용자 동일 (유료 플랜 별도) 동일 (유료 플랜 별도)
이미지 최적화 Polish + Mirage 동일
분석·로그 기본 분석 향상된 분석 로그 보존 + 실시간
SLA 100% 가동 SLA

핵심 포인트: CDN 대역폭, DNS, DDoS 방어는 모든 플랜에서 무제한·무과금입니다. 이것만으로도 Cloudflare를 사용할 이유가 충분합니다. Pro 플랜($20/월)은 이미지가 많은 쇼핑몰이나 미디어 사이트에 적합하고, 대부분의 개인·소규모 프로젝트는 무료 플랜으로 시작해서 필요할 때 업그레이드하면 됩니다.

참고로 Workers 유료 플랜은 사이트 플랜과 별도로 $5/월부터 시작합니다(1천만 요청 포함). 이 부분은 9회(Workers 편)에서 자세히 다룹니다.

클라우드플레어 시작, 지금이 적기인 이유 — 정리

긴 이야기를 했지만, 핵심은 세 문장으로 요약됩니다.

  • Cloudflare는 더 이상 CDN 회사가 아닙니다. 컴퓨팅·스토리지·보안·AI를 엣지에서 통합 제공하는 연결성 클라우드입니다.
  • 2026년 Agents Week는 전환점입니다. AI 에이전트 인프라라는 새로운 시장에서 Cloudflare가 선두에 섰습니다.
  • 무료로 시작할 수 있습니다. CDN, DNS, DDoS 방어, SSL, 기본 Workers — 신용카드 없이 지금 바로 써볼 수 있습니다.

다음 16회에 걸쳐, 이 모든 것을 직접 손으로 만지며 배워보겠습니다. 매 회차마다 Synology NAS와 Mac Studio 홈랩에서 실제로 동작하는 명령어를 제공하고, 기능별 비용을 투명하게 공개합니다. 이론이 아니라 실전입니다.

다음 회차 예고: 2회에서는 Cloudflare DNS 설정을 심층적으로 다룹니다. 워드프레스 사이트에 Cloudflare를 올바르게 연결하는 방법, 프록시 모드(주황색 구름 ☁️)와 DNS 전용 모드(회색 구름)의 차이, 그리고 CDN 캐시가 실제로 얼마나 속도를 개선하는지 측정해봅니다.

Photo by Zelch Csaba on Pexels

이미지는 Claude AI 로 생성되었습니다.


📚 시리즈: Cloudflare 완전 정복: 입문부터 2026 AI 에이전트까지 (총 16화 중 1화)