Cloudflare Pages 시작하기 2편 - 도메인 설정
Cloudflare Pages 시작하기 2편 - 도메인 설정
요약
이 글의 핵심 3가지
- 커스텀 도메인 연결: example.com처럼 내 도메인을 Pages에 연결하고 자동 SSL 설정
- www 리다이렉트:
www.example.com과example.com을 통일하는 방법- 환경변수 관리: Production과 Preview 환경을 분리해서 안전하게 관리
읽는 시간: 25분 | 난이도: 중급
출처
이 글은 Cloudflare 공식 문서를 바탕으로 작성했습니다.
- Custom domains - 커스텀 도메인 설정
- www redirect - www 리다이렉트 가이드
- Build configuration - 빌드 및 환경변수 설정
커스텀 도메인이 필요한 이유
1편에서 pages.dev 도메인으로 첫 배포를 완료했습니다.
https://my-site.pages.dev처럼 말입니다.
이것만으로도 충분히 사용할 수 있지만, 실제 서비스를 운영한다면 내 도메인이 필요합니다.
커스텀 도메인의 장점:
- 전문적인 이미지
- 브랜드 인지도 향상 (my-site.pages.dev → my-site.com)
- 플랫폼 종속성 감소 (Cloudflare에서 다른 플랫폼으로 이전 시 URL 변경 최소화)
- 이메일, 결제, 외부 서비스 연동에 유리
도메인 준비하기
커스텀 도메인을 연결하기 전에 도메인이 필요합니다. 아직 없다면 여러 공급자 중 하나를 선택할 수 있습니다.
참고로 Moodturn, MoodturnPost는 Cloudflare Registrar를 사용하고 있습니다.
도메인을 구매했다면 이제 Cloudflare Pages에 연결할 차례예요.
Apex vs Subdomain 이해하기
도메인을 연결하기 전에 Apex와 Subdomain의 차이를 알아야 합니다.
Apex 도메인
example.com ← Apex (루트 도메인)Apex는 도메인의 루트입니다. www가 없는 깔끔한 형태입니다.
장점:
- URL이 짧고 기억하기 쉬움
- 브랜드 정체성을 대표하는 주소로 사용하기 적합
단점:
- 일반적인 DNS에서는 Apex에 CNAME 사용 불가
- Cloudflare DNS 같은 Flattening 지원 환경이 필요할 수 있음
Subdomain
www.example.com ← Subdomain (www)blog.example.com ← Subdomain (blog)api.example.com ← Subdomain (api)Subdomain은 도메인 앞에 접두사가 붙은 형태입니다.
장점:
- CNAME 레코드 사용 가능
- 외부 DNS 환경에서도 설정이 단순함
- 서비스별 분리에 유리 (blog, api 등)
단점:
- URL이 길어짐
- 쿠키, 인증, 분석 도구 설정이 분리될 수 있음 (서브도메인마다 설정해야 함)
실무에서는 보통 Apex를 메인 도메인으로 사용하고,
www는 Apex로 리다이렉트하는 방식을 많이 사용합니다.
커스텀 도메인 추가하기
Cloudflare Pages Dashboard에서 설정
- Build > Compute & AI > Workers & Pages > 커스텀도메인 적용할 프로젝트 선택
- Custom domains 탭 클릭
- Set up a custom domain 버튼 클릭

도메인 입력
도메인을 입력하는 화면이 나옵니다. 여기서 example.com처럼 Apex 도메인을 입력하세요.
domain:example.comContinue 클릭.
DNS 레코드 확인
Cloudflare가 자동으로 DNS 설정을 제안합니다.
# Cloudflare가 제안하는 설정Type: CNAME (Cloudflare DNS에서 Flattened)Name: example.com (또는 @)Target: your-project.pages.devProxy status: Proxied중요: Apex 도메인에서는 RFC상 CNAME을 사용할 수 없지만, Cloudflare DNS는 CNAME Flattening을 통해 Apex에서도 CNAME처럼 설정할 수 있도록 지원합니다.

DNS 설정 방법
두 가지 방법이 있습니다:
방법 1: Cloudflare DNS 사용 (권장)
도메인이 이미 Cloudflare에 등록되어 있거나, Cloudflare DNS를 사용 중이라면 자동으로 설정됩니다.
Activate domain 버튼을 클릭하면 DNS 레코드가 자동으로 추가됩니다.
✓ DNS record added✓ SSL certificate requested✓ Custom domain active
Your site is now available at:https://example.comSSL 인증서는 보통 5분 이내에 발급됩니다.
방법 2: 외부 DNS 사용
외부 DNS 프로바이더를 사용한다면 수동으로 레코드를 추가해야 합니다.
Namecheap 예시:
- Namecheap Dashboard → Domain List
- 도메인 선택 → Manage
- Advanced DNS 탭
# Subdomain (www)Type: CNAME RecordHost: wwwValue: your-project.pages.devTTL: Automatic
# Apex는 외부 DNS에서 제한적# Cloudflare DNS 사용을 권장외부 DNS의 한계:
- 외부 DNS 대부분은 Apex CNAME을 직접 지원하지 않으며, ALIAS/ANAME이 없는 경우 Apex 연결이 힘들어집니다
- Cloudflare Pages는 고정 IP를 제공하지 않아 A 레코드로의 직접 연결이 공식적으로 지원되지 않습니다
결론: Apex 도메인을 사용하려면 Cloudflare DNS 사용을 권장합니다
SSL 인증서 발급
DNS 설정이 완료되면 Cloudflare가 자동으로 SSL 인증서를 발급합니다.
Provisioning SSL certificate...⏳ Validating domain ownership⏳ Requesting Let's Encrypt certificate✓ SSL certificate issued
Your site is now accessible via HTTPS보통 1-5분 이내에 완료되지만, DNS 전파 시간에 따라 최대 24시간까지 걸릴 수 있습니다.
www ↔ Apex 리다이렉트 설정
커스텀 도메인을 추가했으면 이제 www를 처리해야 합니다.
중복 URL을 방지하고 검색 엔진과 사용자에게 명확한 기준을 제공하기 위해 한 가지 도메인으로 통일하는 것이 좋습니다.
선택지
두 가지 방식 중 하나를 선택하면 됩니다:
옵션 A: www → Apexwww.example.com → example.com
옵션 B: Apex → wwwexample.com → www.example.com옵션 A (Apex를 메인으로)는 URL이 짧고 깔끔해서 신규 서비스에서 자주 선택되는 방식입니다.
Redirect Rules로 리다이렉트 설정
Cloudflare의 Rules 엔진에서 Redirect 타입 규칙을 사용해서 www ↔ Apex 리다이렉트를 설정합니다.
설정 순서:
- Cloudflare Dashboard → Websites 선택
- 도메인 선택 (example.com)
- 왼쪽 메뉴에서 Rules → Overview 이동
- Create rule 클릭 후, Rule type에서 Redirect Rules 선택
- Redirect from WWW to root에서 Preview template 클릭


www → Apex 리다이렉트 규칙
Rule name: Redirect from WWW to root (your-site)
If incoming requests match: Type: Wildcard pattern Request URL: https://www.your-site.com/*
Then: Redirect to: Target URL: https://your-site.com/${1} Status code: 301 Preserve query string: ✓
Place at: Order: Last설명:
https://www.your-site.com/*www.your-site.com으로 들어오는 모든 요청을 매칭합니다.
${1}/이후의 경로 전체를 그대로 캡처합니다.
- 결과 예시:
https://www.example.com/blog/post- →
https://example.com/blog/post
- 301 (Permanent Redirect)
- 검색 엔진에 영구적인 주소 변경임을 명확히 알립니다.
- Preserve query string
- 쿼리 파라미터를 유지합니다.
- 예:
https://www.example.com/search?q=test- →
https://example.com/search?q=test
Apex → www 리다이렉트 규칙 (대안)
만약 www를 메인으로 사용하고 싶다면:
Rule name: Redirect from root to WWW (your-site)
If incoming requests match: Type: Wildcard pattern Request URL: https://your-site.com/*
Then: Redirect to: Target URL: https://www.your-site.com/${1} Status code: 301 Preserve query string: ✓
Place at: Order: Last리다이렉트 테스트
설정이 완료되면 반드시 테스트해야 합니다:
# curl로 리다이렉트 확인curl -I https://www.example.com
# 응답 예시HTTP/2 301location: https://example.com/브라우저에서도 확인해보세요:
www.example.com접속- 주소창이
example.com으로 변경되는지 확인 /blog같은 하위 경로도 테스트
Google Search Console에 등록
리다이렉트를 설정했으면 Google Search Console에도 반영해야 합니다.
- Google Search Console 접속
- 속성 추가
- Domain Property로 등록하면 apex와 www를 함께 관리할 수 있습니다.
이렇게 하면 검색 엔진이 단일 기준 도메인을 명확히 인식할 수 있습니다.
환경변수 관리
환경변수는 API 키, DB 연결 정보 같은 민감한 정보를 안전하게 관리하는 방법입니다.
Production vs Preview 환경 분리
Cloudflare Pages는 Production과 Preview 환경을 분리해서 관리할 수 있습니다.
Production 환경: - main 브랜치 배포 - 실제 사용자가 접속 - 프로덕션 API 서버 사용 - 실제 결제 시스템 연동
Preview 환경: - PR 배포 - 테스트 용도 - 스테이징 API 서버 사용 - 테스트 결제 시스템 연동환경변수 추가하기
- Cloudflare Pages 프로젝트 → Settings 탭
- Variables and Secrets 섹션
- +Add 클릭
- Type, Variable name, Value 입력 후, Save 클릭
- 변경 사항은 다음 배포부터 적용됩니다

Production 환경변수 설정
Production과 Preview는 각각 별도의 Variables and Secrets를 가질 수 있습니다.
먼저 상단의 환경 선택에서 Production 또는 Preview를 선택한 뒤, 같은 방식으로 변수를 각각 추가합니다.
이렇게 하면 Production과 Preview가 각각 다른 API 서버를 사용합니다.

프레임워크별 환경변수 사용법
Vite (React, Vue, Svelte):
// vite.config.js - 설정 불필요, 자동으로 주입됨
// 코드에서 사용const apiUrl = import.meta.env.VITE_API_URL;
console.log(apiUrl);// Production: https://api.example.com// Preview: https://staging-api.example.comNext.js:
Next.js에서는 `NEXT_PUBLIC_` 접두사가 붙은 환경변수는별도 설정 없이 자동으로 주입됩니다.Astro:
// astro.config.mjs - 설정 불필요
// 코드에서 사용const apiUrl = import.meta.env.PUBLIC_API_URL;SvelteKit:
// 코드에서 사용import { PUBLIC_API_URL } from "$env/static/public";
const apiUrl = PUBLIC_API_URL;환경변수 명명 규칙
프레임워크마다 환경변수 접두사가 다릅니다:
Vite: VITE_Next.js: NEXT_PUBLIC_Astro: PUBLIC_SvelteKit: PUBLIC_Nuxt: NUXT_PUBLIC_접두사가 없는 환경변수는 클라이언트 코드에서는 접근할 수 없으며, Pages Functions 또는 서버 측 코드에서만 사용해야 합니다.
보안상 민감한 정보(서버 전용 API 키 등)는 클라이언트로 노출되지 않도록 접두사 없이 설정하고, 반드시 Pages Functions에서만 사용해야 합니다.
환경변수 적용 확인
환경변수를 추가한 후에는 반드시 재배포가 필요합니다.
# 코드 변경 없이 재배포 트리거git commit --allow-empty -m "Trigger rebuild for env vars"git push origin main빌드 로그에서 환경변수가 주입되는지 확인할 수 있습니다:
[Build] Environment variables:VITE_API_URL=https://api.example.com (masked)NODE_VERSION=18민감한 값은 마스킹되어 표시됩니다.
프레임워크별 빌드 최적화
각 프레임워크마다 빌드를 최적화하는 방법이 있습니다. 빌드 시간을 줄이고 배포 속도를 높일 수 있습니다.
의존성 캐싱
Cloudflare Pages는 의존성 설치 결과를 캐싱하며, lock 파일이 변경되지 않으면 설치 단계를 건너뜁니다.
# 첫 번째 빌드[Build] Installing dependencies...npm install (34.2초)
# 두 번째 빌드 (package.json 변경 없음)[Build] Using cached node_modulesSkipped npm install (0.5초)최적화 팁:
- Lock 파일을 커밋하세요 (package-lock.json, pnpm-lock.yaml, yarn.lock)
- 불필요한 devDependencies 제거
- 정확한 버전 명시 (
^1.0.0대신1.0.0)
Vite 빌드 최적화
export default { build: { // 청크 크기 경고 임계값 조정 chunkSizeWarningLimit: 1000,
// 롤업 옵션 rollupOptions: { output: { // 청크 분할 최적화 manualChunks: { vendor: ["react", "react-dom"], ui: ["@mui/material"], }, }, },
// 소스맵 비활성화 (프로덕션) sourcemap: false, },};Next.js 빌드 최적화
module.exports = { // Static Export 설정 output: "export",
// 이미지 최적화 비활성화 (Static Export 필수) images: { unoptimized: true, },
// 불필요한 파일 제외 pageExtensions: ["tsx", "ts"],
// 기본값 (명시적 설정) swcMinify: true,};Astro 빌드 최적화
export default defineConfig({ // 빌드 최적화 build: { inlineStylesheets: "auto", },
// Vite 설정 vite: { build: { cssCodeSplit: true, }, },});빌드 캐시 초기화
가끔 빌드 캐시 때문에 문제가 생길 수 있습니다. 이럴 때는 캐시를 초기화하면 됩니다.
방법 1: Dashboard에서 초기화
- Deployments 탭
- 최근 배포 선택
- Retry deployment → Clear cache and retry
방법 2: 강제 재빌드
이 방법은 의존성 설치 단계를 다시 실행하게 만들어 대부분의 캐시 문제를 해결할 수 있지만,
모든 캐시를 완전히 초기화하는 공식 방법은 아닙니다.
# package.json에 더미 필드 추가{ "cache-buster": "v2" # 값을 변경해서 재빌드 트리거}
git add package.jsongit commit -m "Clear build cache"git push origin main다음 단계
2편에서는 커스텀 도메인, 리다이렉트, 환경변수, 빌드 최적화를 다뤘습니다.
현재 상태:
- 내 도메인으로 접속 가능 (example.com)
- www 리다이렉트 설정 완료
- Production/Preview 환경 분리
- 빌드 최적화 적용
다음 편 예고:
Cloudflare Pages 시작하기 3편 - 운영과 최적화에서 다룰 내용:
- 빌드 실패 디버깅 (의존성, 환경변수, 타임아웃)
- 롤백하는 방법
- 성능 최적화 (이미지, 번들 크기)
- 보안 헤더 설정 (_headers 파일)
- 모니터링 및 알림 설정
참고 자료
공식 문서
- Custom domains - 커스텀 도메인 상세
- Redirect Rules - 리다이렉트 설정
- Build configuration - 빌드 및 환경변수
- Environment variables - 환경변수 상세
프레임워크별 가이드
공유
이 글이 도움이 되었다면 다른 사람과 공유해주세요!