🔧 DevOps

Caddy

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} 같은 환경변수 플레이스홀더 지원하네요. 수정하겠습니다."

주의사항

더 배우기