← 모든 글

도메인 등록부터 SSL 까지 — 24시간 내 셋업 체크리스트

결제 콜백 340건을 묵음 처리한 SSL 설정 실수에서 배운 것. Cloudflare Flexible 금지 이유, nginx 리디렉션 루프 방지, 결제·정산 팀 전용 24시간 셋업 체크리스트.

왜 결제·정산 팀에게 도메인 셋업이 '단순 인프라'가 아닌가

카드사 웹훅, PG사 콜백, 정산 API 엔드포인트—이 세 가지는 모두 HTTPS 주소를 전제로 동작한다. 대부분의 결제 게이트웨이는 callback_url 등록 시 https://로 시작하는 주소만 허용하며, HTTP 엔드포인트는 등록 자체가 거부된다. 즉, 도메인과 SSL이 올바르게 맞물리지 않으면 서비스가 뜨는 순간부터 거래가 유실된다.

HEDVION에서 실제로 겪은 일이다. 새 정산 서브도메인(webhook.hedvion.com)을 빠르게 올려야 하는 상황에서 Cloudflare SSL 모드를 잘못 선택하고 nginx 리디렉션 설정과 충돌이 발생해, PG사 콜백이 2시간 동안 묵음 처리됐다. 결제 건수로 따지면 약 340건, 재처리 인력 비용으로 환산하면 팀원 반나절이었다. 이 경험이 이 체크리스트를 정식으로 문서화한 직접적인 이유다. 매번 기억을 더듬는 대신, 다음 번엔 단계를 하나씩 체크하면서 올린다.

레지스트라 선택: 갱신 단가와 자동 갱신이 전부다

도메인 등록 자체는 레지스트라마다 기능 차이가 크지 않다. 하지만 결제·정산 서비스의 도메인은 만료되는 순간 서비스 전체가 중단되기 때문에, 갱신 단가와 자동 갱신 설정이 가장 중요한 선택 기준이다. 첫 해 할인은 레지스트라 마케팅 수단에 불과하다.

구체적인 수치를 보면: Namecheap 기준 .com 신규 등록은 연간 약 $6–8이지만 갱신은 $13–15다. GoDaddy는 신규를 $1–2에 유인하고 갱신 시 $20 이상을 청구하는 경우가 많다. WHOIS 프라이버시는 별도 과금 없이 기본 제공하는 곳을 선택한다—개인정보 노출 문제도 있지만, 스팸성 도메인 이전 유도 메일을 차단하는 현실적인 이유도 있다. 우리 팀이 신규 도메인에 우선 추천하는 옵션은 Cloudflare Registrar다. ICANN 원가 수준(.com 기준 연간 약 $9.15)으로 갱신 단가가 고정되어 있고, DNS 관리가 같은 플랫폼에서 이루어져 운영 복잡도가 줄어든다. 단, 이미 다른 레지스트라에서 운영 중인 도메인은 이전 비용과 락업 기간을 먼저 확인해야 한다.

등록 직후 첫 번째 작업은 네임서버를 Cloudflare로 전환하는 것이다. 이후 DNS 관리, 기본 DDoS 방어, SSL 처리를 Cloudflare 한 곳에서 다룰 수 있어 소규모 팀 기준 운영 부담이 확연히 줄어든다.

Cloudflare 설정: SSL 모드 선택이 결제 인프라의 분기점

Cloudflare에 사이트를 추가하면 기존 DNS 레코드를 자동 스캔해준다. www 서브도메인이 누락된 경우가 빈번하므로 꼭 수동으로 재확인한다. 여기서 가장 중요한 설정은 SSL/TLS 모드다. 결제 인프라 맥락에서 이 선택은 트레이드오프가 명확하다.

  • Flexible: Cloudflare↔사용자 구간은 HTTPS, Cloudflare↔원서버 구간은 HTTP. 원서버에 인증서 없이도 HTTPS가 붙어 테스트 환경에 편리하지만, 콜백 본문(주문 금액, 결제 상태, 부분 카드 정보)이 원서버까지 평문으로 이동한다. PCI DSS 관점에서도 위반 소지가 있고, 내부 감사에서 지적 사항이 된다. 프로덕션 결제 환경에서는 사용하지 않는다.
  • Full (Strict): 브라우저↔Cloudflare, Cloudflare↔원서버 양 구간 모두 유효한 인증서로 암호화. 원서버에 Let's Encrypt 인증서 설치가 추가되지만 certbot --nginx -d domain.com 한 줄로 5분 안에 완료된다. HEDVION의 모든 정산·콜백 엔드포인트는 예외 없이 Full (Strict)를 적용한다.

Proxy 모드(주황 구름)는 원서버 IP를 숨기고 Cloudflare가 앞단에서 트래픽을 처리한다. 주의할 점은 PG사나 카드사가 특정 IP에서만 콜백을 보내는 방화벽 화이트리스트 구성을 요구하는 경우, 반대 방향도 마찬가지다—PG사 어드민에 콜백 수신 URL을 등록할 때 원서버 IP가 아닌 Cloudflare IP 대역(104.x.x.x, 172.x.x.x 등)을 확인해야 한다. 이 부분을 놓치면 프록시 모드를 켜는 순간 기존 화이트리스트 기반 방어가 깨진다.

nginx 설정: 리디렉션 루프를 막는 법

nginx에서 새 도메인에 대한 server 블록을 추가할 때 Cloudflare Proxy 모드와의 조합에서 가장 흔히 발생하는 문제가 리디렉션 루프다. Cloudflare가 HTTPS로 받아 원서버에 HTTP(80번 포트)로 전달하는데, nginx에 return 301 https://$host$request_uri; 형태의 HTTP→HTTPS 강제 리디렉션이 걸려 있으면 무한 루프가 된다. 앞서 언급한 340건 콜백 유실 사고도 정확히 이 패턴에서 발생했다.

방지하는 방법은 간단하다. HTTP→HTTPS 리디렉션을 nginx에서 처리하지 말고 Cloudflare 대시보드의 "Always Use HTTPS" 설정으로 위임한다. 원서버 nginx는 HTTP 요청을 그냥 받아서 처리하면 된다.

server {
    listen 80;
    server_name payment.example.com;

    # Cloudflare Proxy 모드 시: nginx에서 HTTPS 리디렉션 제거
    # Cloudflare 대시보드 > SSL/TLS > Edge Certificates > Always Use HTTPS ON

    location / {
        proxy_pass http://upstream_payment;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

설정 변경 후에는 반드시 문법 검사 후 재로드한다.

nginx -t && systemctl reload nginx

Full (Strict) 모드라면 Certbot으로 원서버 인증서를 발급하고, 443 블록을 nginx가 자동 생성한 형태로 유지한다. 90일 자동 갱신 타이머가 활성화되어 있는지도 함께 확인한다(systemctl status certbot.timer).

DNS 전파: 실제 소요 시간과 현장 검증법

"최대 48시간"은 이론적 최댓값이다. 실제로는 Cloudflare 네임서버로 전환 후 1.1.1.1, 8.8.8.8 기준으로 대부분 1시간 이내에 전파가 완료된다. HEDVION 팀 경험상 레지스트라 네임서버 변경 → Cloudflare "Active" 상태 전환 → A 레코드 전파까지 평균 40분~1시간 20분이었다.

전파 확인은 아래 명령으로 진행한다.

# Cloudflare 리졸버 기준 A 레코드 확인
dig payment.example.com @1.1.1.1

# Google 리졸버 기준 교차 확인
dig payment.example.com @8.8.8.8

# Proxy 모드라면 응답 IP가 Cloudflare 대역이어야 함 (104.x.x.x 또는 172.x.x.x)

급하게 셋업해야 하는 상황이라면 전파 전에 /etc/hosts에 직접 IP를 매핑해 동작을 먼저 검증할 수 있다. 단, 검증 후 반드시 해당 항목을 제거한다—로컬 hosts 항목이 남아 있으면 실제 DNS 전파 후에도 엉뚱한 서버로 붙어서 원인 파악이 늦어진다.

바로 써먹는 결제·정산 환경 전용 체크리스트

아래 순서대로 체크하면 실수 없이 올릴 수 있다. 항목별로 '왜'를 알고 체크하는 것이 중요하다.

등록 단계

  • 레지스트라 갱신 단가 확인 (신규 가격 ≠ 갱신 가격, 첫 해 할인에 속지 않는다)
  • WHOIS 프라이버시 기본 제공 여부 확인
  • 자동 갱신 ON + 만료 60일 전 알림 이메일 설정

Cloudflare 단계

  • 네임서버 변경 → Cloudflare 대시보드 "Active" 상태 확인
  • DNS 레코드: A, CNAME, www 서브도메인 누락 없는지 수동 재확인
  • SSL/TLS 모드: 프로덕션 결제 엔드포인트는 반드시 Full (Strict). Flexible은 절대 금지
  • "Always Use HTTPS" 활성화 (nginx 리디렉션 루프 방지)
  • PG사·카드사 화이트리스트가 있다면 Cloudflare IP 대역으로 업데이트

서버 단계

  • nginx server block 추가 + nginx -t 통과 + systemctl reload nginx
  • Certbot 인증서 발급 (Full Strict 사용 시): certbot --nginx -d domain.com
  • 자동 갱신 타이머 확인: systemctl status certbot.timer
  • curl -I http://domain 으로 리디렉션 루프 없는지 확인 (301 횟수 이상 반복되면 루프)

콜백·전파 검증 단계

  • dig @1.1.1.1 + dig @8.8.8.8 교차 확인
  • HTTPS 브라우저 접근 + 인증서 발급자 확인 (Let's Encrypt 또는 Cloudflare)
  • 결제 게이트웨이 어드민에서 콜백 URL 등록 + 테스트 발송 → 200 응답 확인

문제가 생겼을 때 먼저 볼 곳: 리디렉션 루프면 Cloudflare SSL 모드와 nginx 리디렉션 설정을 교차 확인한다. 변경이 즉시 반영되지 않으면 Cloudflare 대시보드에서 "Development Mode"를 켜거나 해당 경로를 Cache Purge한다. 인증서 경고가 뜨면 openssl s_client -connect domain:443으로 원서버 인증서 유효 여부를 직접 확인한다.

* 위 링크는 인프런 affiliate 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.

📚 추천 강의
한 입 크기로 잘라먹는 바이브코딩 (with Claude Code)
Claude Code로 바이브코딩, 개발자라면 꼭 들어야 할 필수 강의
강의 보러가기 →

* 위 추천 링크는 쿠팡파트너스 활동의 일환이며, 일정액의 수수료를 제공받을 수 있습니다.