Caddy
Caddy
자동 HTTPS 웹 서버. Go로 작성, 설정 간단.
Caddy
자동 HTTPS 웹 서버. Go로 작성, 설정 간단.
Caddy는 Go로 작성된 현대적인 웹 서버로, 자동 HTTPS가 가장 큰 특징입니다. 2015년 Matt Holt가 개발을 시작했으며, Let's Encrypt와 자동 통합되어 인증서 발급, 갱신, OCSP stapling까지 자동으로 처리합니다.
설정 파일(Caddyfile)이 매우 간결하여 Nginx나 Apache에 비해 설정이 쉽습니다. 몇 줄의 설정만으로 리버스 프록시, 로드 밸런싱, 파일 서빙, 압축, 헤더 조작 등을 구현할 수 있습니다.
정적 바이너리로 배포되어 의존성이 없고, 컨테이너 환경에서 특히 유용합니다. JSON API로 런타임 설정 변경이 가능하고, 모듈 시스템으로 기능을 확장할 수 있습니다. HTTP/3(QUIC)도 기본 지원합니다.
실무에서는 개발 환경의 로컬 HTTPS 설정, 소규모~중규모 프로젝트의 프로덕션 웹 서버, Kubernetes Ingress 대안으로 활용됩니다. 대규모 트래픽에서는 Nginx가 여전히 많이 쓰이지만, Caddy의 편의성으로 점유율이 증가하고 있습니다.
# Caddyfile - 프로덕션 설정 예제
# 글로벌 설정
{
email admin@example.com
acme_ca https://acme-v02.api.letsencrypt.org/directory
}
# 메인 사이트 - 자동 HTTPS
example.com {
# 정적 파일 서빙
root * /var/www/html
file_server
# SPA 라우팅
try_files {path} /index.html
# 압축
encode gzip zstd
# 보안 헤더
header {
X-Content-Type-Options nosniff
X-Frame-Options DENY
Referrer-Policy strict-origin-when-cross-origin
-Server
}
# 로그
log {
output file /var/log/caddy/access.log
format json
}
}
# API 리버스 프록시
api.example.com {
reverse_proxy localhost:8080 {
health_uri /health
health_interval 10s
# 로드 밸런싱 (여러 백엔드 시)
# lb_policy round_robin
}
# CORS 헤더
header Access-Control-Allow-Origin *
}
시니어: "로컬 개발 환경에서 HTTPS 필요하면 Caddy 쓰세요. mkcert 설정하고 Caddyfile 3줄이면 끝이에요."
주니어: "Nginx 대신 프로덕션에도 쓸 수 있나요?"
시니어: "충분히요. 인증서 자동 갱신이 기본이라 certbot 크론 같은 거 신경 안 써도 돼요. 다만 아주 높은 트래픽에서는 Nginx 튜닝이 더 익숙할 수 있어요."
면접관: "Caddy의 자동 HTTPS는 어떻게 동작하나요?"
지원자: "Caddy는 ACME 프로토콜로 Let's Encrypt와 통신합니다. 도메인 검증(HTTP-01 또는 DNS-01), 인증서 발급, 갱신을 모두 자동으로 처리하고, 만료 전에 백그라운드에서 갱신합니다. OCSP stapling도 자동이라 TLS 핸드셰이크 성능도 좋습니다."
리뷰어: "Caddyfile에 하드코딩된 backend 주소는 환경변수로 바꾸면 좋겠어요. Docker Compose에서 환경별로 다를 수 있으니까요."
개발자: "네, {$BACKEND_HOST} 같은 환경변수 플레이스홀더 지원하네요. 수정하겠습니다."