treeru.com
개발

Caddy로 HTTPS 자동화 — Let's Encrypt 인증서 무한 갱신

2025-12-23
Treeru

Nginx에서 HTTPS를 설정하려면 certbot 설치, 인증서 발급, cron 등록, 설정 파일 수정... 과정이 꽤 번거롭습니다. Caddy는 이 모든 걸 자동으로 처리합니다. 도메인만 적어주면 Let's Encrypt 인증서를 알아서 발급하고, 갱신도 알아서 합니다. 리버스 프록시 설정도 딱 한 줄이면 끝납니다.

자동

HTTPS 인증서

1줄

리버스 프록시

무한

인증서 갱신

10줄

전체 설정 파일

1Caddy vs Nginx 비교

Nginx는 성능과 커뮤니티 면에서 검증된 웹 서버이지만, 설정이 복잡하고 HTTPS 수동 관리가 필요합니다. Caddy는 Go로 작성된 모던 웹 서버로, 설정 간결함과 자동 HTTPS가 가장 큰 장점입니다.

항목NginxCaddy
HTTPS 설정certbot + cron 필요자동 (도메인만 입력)
설정 파일복잡한 블록 구조직관적 (Caddyfile)
HTTP/2수동 활성화기본 활성화
성능매우 높음충분히 높음
커뮤니티매우 큼성장 중
적합한 경우대규모 트래픽, 세밀한 제어중소규모, 빠른 설정

중소 규모 프로젝트에는 Caddy가 압도적으로 편합니다

일일 방문자 수만 명 수준까지는 Caddy의 성능으로 충분합니다. Nginx의 세밀한 튜닝이 필요한 대규모 서비스가 아니라면, 설정 편의성과 자동 HTTPS만으로도 Caddy를 선택할 이유가 됩니다.

2Caddyfile 기본 문법

Caddyfile은 Caddy의 설정 파일입니다. Nginx의 nginx.conf와 비슷한 역할인데, 문법이 훨씬 간결합니다. 도메인을 적고 중괄호 안에 설정을 넣으면 됩니다.

Caddyfile — 가장 기본적인 형태

# 정적 파일 서빙
example.com {
    root * /var/www/html
    file_server
}

# 이것만으로 HTTPS가 자동 적용됩니다
# HTTP → HTTPS 리다이렉트도 자동입니다

# Caddy 설치 및 실행 (Ubuntu/Debian)

# 저장소 추가 및 설치
sudo apt install -y debian-keyring debian-archive-keyring apt-transport-https
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' \
  | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' \
  | sudo tee /etc/apt/sources.list.d/caddy-stable.list
sudo apt update && sudo apt install caddy

# Caddyfile 위치: /etc/caddy/Caddyfile
# 서비스 시작
sudo systemctl enable caddy
sudo systemctl start caddy

3리버스 프록시 설정

Next.js 같은 앱 서버 앞에 Caddy를 리버스 프록시로 두는 게 일반적입니다. N100 같은 저전력 PC에 N100 리버스 프록시를 구성하는 방법도 함께 참고하세요. Caddy가 HTTPS를 담당하고, 내부적으로 PM2가 관리하는 Next.js 앱에 요청을 전달합니다.

Caddyfile — 리버스 프록시

example.com {
    reverse_proxy localhost:3000
}

# 이 한 줄이 Nginx에서는 이렇게 됩니다:
# server {
#     listen 443 ssl http2;
#     server_name example.com;
#     ssl_certificate /etc/letsencrypt/live/...;
#     ssl_certificate_key /etc/letsencrypt/live/...;
#     location / {
#         proxy_pass http://localhost:3000;
#         proxy_http_version 1.1;
#         proxy_set_header Upgrade $http_upgrade;
#         proxy_set_header Connection 'upgrade';
#         proxy_set_header Host $host;
#         proxy_cache_bypass $http_upgrade;
#     }
# }

Caddyfile — WebSocket + 헤더 전달

example.com {
    reverse_proxy localhost:3000 {
        header_up X-Real-IP {remote_host}
        header_up X-Forwarded-For {remote_host}
        header_up X-Forwarded-Proto {scheme}
    }
    # WebSocket은 자동 지원됩니다
}

Nginx 설정 20줄이 Caddy에서는 1줄

Caddy의 리버스 프록시는 WebSocket 업그레이드, HTTP/2 프로토콜 전환, 프록시 헤더 전달 등을 기본으로 처리합니다. 별도 설정 없이도 대부분의 앱이 정상 동작합니다.

4다중 도메인 운영

하나의 서버에서 여러 도메인을 운영할 때, Caddyfile에 도메인 블록을 추가하기만 하면 됩니다. 각 도메인마다 별도의 HTTPS 인증서가 자동으로 발급됩니다.

Caddyfile — 다중 도메인 + 서브도메인

# 메인 사이트
example.com {
    reverse_proxy localhost:3000
}

# 관리자 사이트
admin.example.com {
    reverse_proxy localhost:3001
}

# API 서버
api.example.com {
    reverse_proxy localhost:4000
}

# 다른 도메인의 서비스
another-domain.com {
    reverse_proxy localhost:5000
}

# 각 도메인마다 자동으로 HTTPS 인증서가 발급됩니다

DNS 레코드가 먼저 설정되어야 합니다

Caddy가 Let's Encrypt 인증서를 발급받으려면 도메인이 해당 서버의 IP를 가리키고 있어야 합니다. DNS 레코드를 먼저 설정하고, 전파 완료 후에 Caddy를 시작하세요. 전파 전에 시작하면 인증서 발급이 실패합니다.

5보안 헤더 설정

HTTPS만으로는 보안이 완벽하지 않습니다. XSS 방지, 클릭재킹 방지, HSTS 등 보안 헤더를 추가하면 사이트의 보안 수준이 크게 올라갑니다.

Caddyfile — 보안 헤더 추가

example.com {
    reverse_proxy localhost:3000

    header {
        # HSTS (HTTPS 강제)
        Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
        # XSS 방지
        X-Content-Type-Options "nosniff"
        X-Frame-Options "SAMEORIGIN"
        # 리퍼러 정보 제한
        Referrer-Policy "strict-origin-when-cross-origin"
        # 서버 정보 숨기기
        -Server
    }
}
헤더역할권장 여부
Strict-Transport-SecurityHTTP 접속 시 HTTPS로 강제 전환필수
X-Content-Type-OptionsMIME 타입 스니핑 방지필수
X-Frame-Optionsiframe 삽입 방지 (클릭재킹)필수
Referrer-Policy외부 사이트에 리퍼러 정보 제한권장

6인증서 자동 갱신 원리

Let's Encrypt 인증서의 유효 기간은 90일입니다. Caddy는 만료 30일 전부터 자동으로 갱신을 시도합니다. 이 과정에서 서비스 중단은 전혀 없습니다.

Caddy 인증서 관리 과정

1

Caddyfile에 도메인 감지 → ACME 프로토콜로 Let's Encrypt에 인증서 요청

2

HTTP-01 또는 TLS-ALPN-01 챌린지로 도메인 소유권 검증

3

인증서 발급 완료 → 자동 적용 (서비스 중단 없음)

4

만료 30일 전 자동 갱신 시도 → 실패 시 재시도

5

OCSP 스테이플링 자동 적용 → 클라이언트 연결 속도 향상

# 인증서 상태 확인

# Caddy 관리 API로 인증서 확인
curl localhost:2019/config/

# 인증서 저장 위치
ls ~/.local/share/caddy/certificates/

# Caddy 로그에서 인증서 관련 이벤트 확인
journalctl -u caddy | grep -i certificate

포트 80과 443이 열려 있어야 합니다

Let's Encrypt 인증서 발급과 갱신에는 포트 80(HTTP) 또는 443(HTTPS)이 필요합니다. 방화벽이나 클라우드 보안 그룹에서 이 포트들이 열려 있는지 반드시 확인하세요.

요약 체크리스트

Caddy HTTPS 자동화 핵심 요약

  • Caddy를 설치하고 systemd 서비스로 등록한다
  • Caddyfile에 도메인만 적으면 HTTPS가 자동 적용된다
  • 리버스 프록시는 reverse_proxy 한 줄로 설정한다
  • 다중 도메인은 도메인 블록을 추가하면 각각 인증서가 발급된다
  • 보안 헤더(HSTS, X-Frame-Options 등)를 반드시 추가한다
  • 포트 80/443이 열려 있어야 인증서 발급/갱신이 동작한다

본 글은 Caddy v2 기준으로 작성되었습니다. OS 환경, 방화벽 설정, DNS 전파 상태에 따라 설정 방법이 달라질 수 있습니다. 프로덕션 적용 전 반드시 스테이징 환경에서 테스트하시기 바랍니다. 본 콘텐츠의 비상업적 공유는 자유이나, 상업적 이용 시 문의 페이지를 통해 연락 바랍니다.

웹 서버 설정이 어려우신가요?

Treeru는 Caddy 리버스 프록시, HTTPS 자동화, 보안 헤더까지 포함한 서버 환경을 구축해 드립니다.

서버 구축 상담 신청
T

Treeru

웹 개발, IT 인프라, AI 솔루션 분야의 실무 인사이트를 공유합니다. 기업의 디지털 전환을 돕는 IT 파트너, Treeru입니다.

공유

댓글

(4개)
4.63/ 5

로그인하면 댓글을 작성할 수 있습니다.

2026-01-06
4.554.5

다중 도메인 설정이 이렇게 간단한 줄 몰랐네요. 메인 사이트, 어드민, API 서버를 하나의 Caddyfile로 관리하니까 깔끔합니다.

2026-01-03
454.0

Nginx 설정이 너무 어려워서 포기했었는데, Caddyfile은 직관적이라 5분 만에 리버스 프록시까지 설정 끝냈어요. 감사합니다!

2025-12-30
555.0

Let's Encrypt 인증서 갱신 실패로 사이트 접속 안 되는 사고를 겪어본 적 있는데, Caddy 쓰니까 그런 걱정이 완전히 사라졌습니다.

관련 글

© 2026 TreeRU. All rights reserved.

본 콘텐츠의 저작권은 TreeRU에 있으며, 출처를 밝히지 않은 무단 전재 및 재배포를 금합니다. 인용 시 출처(treeru.com)를 반드시 명시해 주세요.