Cloudflare
글로벌 CDN, DNS, 보안, 엣지 컴퓨팅 플랫폼.
주요 서비스
| 서비스 | 설명 |
|---|---|
| DNS | 권한 DNS 서버, 무료, 빠름 |
| CDN | 전 세계 PoP에서 정적 자산 캐싱 |
| DDoS Protection | L3/L4/L7 공격 자동 차단 |
| WAF | 웹 애플리케이션 방화벽 |
| Workers | 엣지에서 실행되는 서버리스 JS/WASM |
| Pages | 정적 사이트 + JAMstack 배포 |
| R2 | S3 호환 오브젝트 스토리지 (Egress 무료) |
| Tunnel | 서버를 외부에 안전하게 노출 (포트 오픈 불필요) |
| Zero Trust | VPN 없는 내부망 접근 제어 |
DNS 설정
| 레코드 타입 | 프록시 여부 | 특징 |
|---|---|---|
| A/CNAME (주황 구름) | Proxied | Cloudflare IP 노출, CDN·WAF 적용 |
| A/CNAME (회색 구름) | DNS only | 실제 서버 IP 노출, CDN 미적용 |
캐싱
Cache-Control: public, max-age=31536000, immutable → 엣지에서 캐시
Cache-Control: no-cache, no-store → 캐시 안 함
캐시 퍼지:
Dashboard → Caching → Cache Rules → Purge
API: POST /zones/{zone_id}/purge_cache
캐시 규칙 (Cache Rules)
조건: URI Path starts with /static/
동작: Cache Everything, Edge TTL 30 days
조건: URI Path contains /api/
동작: Bypass Cache
Workers
엣지에서 실행되는 서버리스 함수. V8 기반.
// src/index.ts
export default {
async fetch(request: Request, env: Env): Promise<Response> {
const url = new URL(request.url)
if (url.pathname === '/api/hello') {
return Response.json({ message: 'Hello from Edge!' })
}
// KV 읽기
const value = await env.MY_KV.get('key')
return new Response(value ?? 'Not found', { status: 200 })
}
}# wrangler.toml
name = "my-worker"
main = "src/index.ts"
compatibility_date = "2024-01-01"
[[kv_namespaces]]
binding = "MY_KV"
id = "xxxx"npx wrangler dev # 로컬 개발
npx wrangler deploy # 배포Cloudflare Tunnel
포트 오픈/공인 IP 없이 로컬 서버 외부 노출.
# 설치 및 인증
cloudflared tunnel login
# 터널 생성
cloudflared tunnel create my-tunnel
# 실행
cloudflared tunnel run --url http://localhost:3000 my-tunnel보안 설정
SSL/TLS 모드:
Off → HTTP만
Flexible → 브라우저↔CF는 HTTPS, CF↔서버는 HTTP
Full → 양방향 HTTPS (자체 서명 인증서 허용)
Full(Strict) → 양방향 HTTPS (유효한 인증서 필요) ← 권장
방화벽 규칙 (Firewall Rules):
특정 국가 차단: ip.geoip.country in {"CN" "RU"}
Rate Limiting: 1분에 100회 초과 시 차단