왜 ‘DNS 전파’가 느려질까? 개념부터 바로잡기
많은 팀이 “DNS 전파가 아직 안 됐다”는 말로 배포 지연을 설명합니다. 하지만 기술적으로는 ‘전파(propagation)’라기보다 ‘캐시 만료(cache expiry)’가 핵심입니다. 클라이언트는 보통 재귀(리커시브) DNS 리졸버(기업 DNS, ISP, 공용 DNS 등)의 캐시를 참조합니다. 우리가 레코드를 바꿔도, 전 세계 수많은 캐시가 기존 TTL(Time To Live)이 끝날 때까지는 이전 값을 제공할 수 있습니다. 이 글은 DevOps 엔지니어 관점에서 A 레코드와 CNAME 중심으로 “전파 지연”을 최소화하는 실전 최적화 방법을 다룹니다.
핵심 요약:
- DNS 지연의 대부분은 TTL과 캐시 계층 구조에서 온다.
- 레코드 변경 24
72시간 기다릴 이유는 없다. 올바른 TTL 전략과 단계적 배포로 수분수십 분 이내로 줄일 수 있다. - A와 CNAME은 성질이 달라서 최적화 포인트가 다르다. 특히 CNAME 체인과 apex 제한에 주의하라.
DevOps를 위한 DNS 구조 초간단 복습
- 권한(authoritative) DNS: 도메인의 ‘정답’을 가진 서버(예: Route 53, Cloudflare, NS1, Akamai 등).
- 재귀(recursive) DNS: 클라이언트 대신 질의하고 결과를 캐시(예: 8.8.8.8, 1.1.1.1, 기업 DNS).
- TTL: 레코드가 캐시에서 유효한 시간. TTL이 남아 있는 동안 리졸버는 동일 값을 반환.
- SOA/NS 레코드: 영역 시작(SOA)에는 네거티브 캐싱 TTL(권한 서버에 따라 TTL과 별도) 등이 포함. NS는 권한 서버 위임 정보를 제공.
- 음수 캐싱(negative caching): NXDOMAIN(존재하지 않음) 응답도 캐시된다. 한 번 없는 것으로 캐시되면, TTL 동안 새로 만든 레코드를 못 본다.
전파 지연의 실제 원인
- 과도한 TTL: 1시간~24시간 TTL이면 변경 반영이 느려짐.
- 다중 캐시 레이어: 브라우저, OS, 로컬 리졸버, 기업 프록시, 공용 리졸버 등 각자 캐시 보유.
- CNAME 체인: CNAME → CNAME → A/AAAA처럼 길어지면 각 단계 TTL이 영향을 준다.
- 네임서버 변경: 레지스트리(TLD) 위임 TTL이 보통 높아 최종 교체에 시간이 필요.
- 네거티브 캐싱: 레코드를 만들기 전 다수의 요청이 NXDOMAIN을 캐시했을 때.
- DNSSEC/키 롤오버: DS/KEY 전파와 검증 실패 시 일시적 장애 가능.
- UDP 조각/EDNS0 이슈: 큰 응답이 조각되며 일부 네트워크에서 손실되어 ‘전파 안 됨’처럼 보이는 현상.
A 레코드 vs CNAME: 언제, 왜, 어떻게 최적화할까
- A 레코드: 도메인 → IPv4(AAAA는 IPv6). 직접 IP로 연결, 한 단계로 끝나 빠르고 단순. IP 변경이 잦다면 TTL과 배포 전략이 중요.
- CNAME: 도메인 → 다른 이름. CDNs, Managed LB, 멀티-리전 라우팅에서 유용. 단, apex에는 표준상 CNAME 불가(대부분의 DNS 제공자는 ALIAS/ANAME로 우회 제공).
최적화 포인트:
- A: IP 변경 전 저(低) TTL로 미리 내리고, 롤백 대비 이중 퍼블리시 혹은 가중치 라우팅 활용.
- CNAME: 체인 길이 최소화, TTL 적정화, apex는 ALIAS/ANAME로 평탄화(flatten), CDN 벤더 별 중간 호스트네임 일관성 확보.
실전 전략 1: TTL 전략 설계
권장 접근:
- 변경 48
72시간 전: 대상 레코드 TTL을 60300초로 낮춘다. - 변경 직후: 모니터링으로 안정성 확인 후, 기본 TTL(900~3600초 등)로 되돌린다.
- 네거티브 TTL 관리: SOA의 minimum/negative TTL(예: 300~600초)을 합리적으로 설정. 새 레코드 생성 전 불필요한 NXDOMAIN을 발생시키지 않도록 한다.
주의:
- 일부 DNS 제공자는 TTL 최소값을 제한(예: 최소 60/120초).
- 리졸버는 TTL 상한 또는 하한을 자체적으로 적용할 수 있다(클램핑). 0~30초 TTL이 항상 의미가 있지는 않다.
- TTL을 낮추면 권한 서버 쿼리 부하가 높아진다. 트래픽/비용/쿼터 고려.
실전 전략 2: 단계적 배포(Blue/Green, Canary, Weighted DNS)
- Weighted DNS(Route 53, NS1, Cloudflare Load Balancer):
- 기존 A 레코드와 새 A 레코드를 가중치로 함께 퍼블리시.
- 점진적으로 가중치를 이동하며 오류율/지연을 모니터링.
- 지역/지연 기반 라우팅:
- 신규 리전/POP만 부분적으로 트래픽 유입.
- 헬스 체크 연동:
- 대상 IP/엔드포인트의 상태에 따라 자동으로 레코드를 제외. TTL이 낮을수록 Failover가 빠름.
예시(Route 53 Terraform):
resource "aws_route53_record" "app_blue" {
zone_id = var.zone_id
name = "app.example.com"
type = "A"
ttl = 60
set_identifier = "blue"
weighted_routing_policy {
weight = 80
}
records = ["203.0.113.10"]
}
resource "aws_route53_record" "app_green" {
zone_id = var.zone_id
name = "app.example.com"
type = "A"
ttl = 60
set_identifier = "green"
weighted_routing_policy {
weight = 20
}
records = ["203.0.113.20"]
}
점진적 전환 후, green 안정성 확인 시 weight를 100으로 전환.
실전 전략 3: CNAME 최적화와 apex 이슈
- 체인 최소화: CNAME → CNAME → A 같은 다단계 체인은 캐시·지연·장애면에서 취약. 가능하면 한 단계로.
- apex(루트, example.com)는 CNAME 불가: ALIAS/ANAME를 제공하는 DNS(Cloudflare, Route 53의 “ALIAS”, NS1 등)를 사용해 평탄화.
- CDN 전환: 기존의 cdn.old.example.net → cdn.newvendor.net 전환 시, 중간 별칭 수를 줄이고 TTL을 일시적으로 낮춘다.
- 와일드카드 주의: *.example.com을 CNAME으로 잡고 내부 서비스가 추가 CNAME을 붙이면 체인이 길어지기 쉬움.
예시(BIND 존 파일에서 A/ALIAS 개념적 표현):
$ORIGIN example.com.
@ 300 IN A 203.0.113.10
www 300 IN CNAME edge.cdnvendor.net.
api 60 IN A 203.0.113.20
apex에 CNAME을 넣고 싶으면 제공자별 ALIAS/ANAME 기능을 사용해야 한다.
실전 전략 4: 네임서버(NS) 변경/마이그레이션 계획
DNS 제공자 이전은 단순 레코드 변경보다 훨씬 ‘느리게 보일’ 수 있습니다. 이유는:
- TLD(레지스트리) 위임 TTL은 대개 몇 시간~48시간으로 높고, 우리가 조정 불가.
- 일부 리졸버는 TLD 위임을 공격적으로 캐시.
권장 플랜:
- 신규 제공자에 존(zone)을 사전 동기화(레코드 미리 생성).
- 일정 기간 이중 호스팅(양쪽 NS 모두 최신 동일 데이터 유지). 대부분 제공자에서 허용.
- 레지스트리 NS 변경.
- 모니터링과 체계적 검증(다수 리졸버/지역에서 쿼리).
- 안정화 이후 구 제공자 존 정리.
이중 호스팅은 전환 중 일부 리졸버가 옛/새 NS를 번갈아 참조하더라도 항상 같은 정답을 보도록 보장한다.
실전 전략 5: 네거티브 캐싱과 사전 퍼블리시
- 새 서브도메인을 론치할 때:
- 런칭 전 며칠 동안 TTL 낮게 레코드 퍼블리시(비공개 엔드포인트라도 가짜 방화벽 뒤에 두거나 403 반환).
- “없는 도메인”으로 미리 요청이 몰려 NXDOMAIN이 캐시되는 상황을 방지.
- 삭제/디프리케이트:
- 갑작스런 삭제는 NXDOMAIN 캐시를 유발. 리디렉션/저TTL로 과도기 제공이 더 매끄럽다.
도구와 검증 방법: dig부터 Ripe Atlas까지
기본 점검(dig):
# 재귀 리졸버(기본) 경유
dig www.example.com +nocmd +noall +answer
# 특정 리졸버를 지정
dig @1.1.1.1 www.example.com
dig @8.8.8.8 www.example.com
# 권한 서버까지 추적
dig +trace www.example.com
# TTL 확인
dig www.example.com +ttlunits
# CNAME 체인 확인
dig www.example.com CNAME +noall +answer
여러 지역에서의 관측:
- Ripe Atlas(측정 캠페인 생성).
- 공용 DNS API: https://dns.google/resolve?name=www.example.com&type=A
- 여러 “DNS checker” 사이트는 참고용이지만, 샘플 편향에 주의.
로컬 캐시 비우기:
- Linux(systemd-resolved): sudo resolvectl flush-caches
- macOS: sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
- Windows: ipconfig /flushdns
- Chrome: chrome://net-internals/#dns → Host resolver cache Clear
브라우저/프록시 레벨 캐시, CDN 에지 캐시(별개)도 고려.
장애처럼 보이는 전파 지연의 숨은 원인
- 혼재 레코드: 동일 이름에 CNAME과 다른 레코드를 동시에 둘 수 없다. CNAME과 A/MX/TXT 동시 존재 금지.
- MX/NS에 CNAME 사용 금지: 표준 위반. 권한 서버 일부가 거부.
- SPF include/redirect 체인: DNS 조회 10회 제한 초과 시 메일 배달 실패. CNAME 체인과 결합 시 더 빨리 초과.
- UDP 조각/EDNS0: 레코드가 커져 512바이트 초과 시 조각. 방화벽/경로에서 조각 드랍 → 일부 리졸버에서만 실패.
- 대응: 레코드 압축, 필요시 TCP fallback 허용, EDNS0 UDP 크기 보수적으로 설정, TXT 레코드 분할.
- IPv6 누락: AAAA가 없으면 일부 네트워크에서 성능/접근성 저하. 듀얼스택 권장.
- ECS(EDNS Client Subnet): CDN 최적화를 위해 사용. 프라이버시/캐시 파편화 영향. 예상하지 못한 지연/불일치 가능.
A 레코드 변경 무중단 시나리오
목표: app.example.com의 IP를 203.0.113.10 → 203.0.113.20으로 교체.
- T-72h: app.example.com TTL을 300초로 낮춘다.
- T-24h: 헬스 체크/모니터링 준비, 새 인스턴스(203.0.113.20) 가동 및 로드 테스트.
- T-0h: Weighted A(80:20)로 신규 IP 트래픽 일부 유입.
- T+30m: 오류율과 p95 Latency 검토. 문제 없으면 50:50 → 100:0.
- T+2h: TTL을 기본값(1800~3600초)로 복원.
- 롤백 플랜: 가중치 즉시 되돌림, 필요 시 방화벽/로드밸런서에서 신규 IP 트래픽 차단.
검증 명령:
dig app.example.com A +short
dig @8.8.8.8 app.example.com A +short
dig @1.1.1.1 app.example.com A +short
다양한 리졸버에서 새/옛 IP 비율이 점차 변하는지 확인.
CNAME 기반 CDN 전환 시나리오
목표: www.example.com → 구 CDN(cdnA.net)에서 신 CDN(cdnB.net)으로 전환.
- www의 TTL을 120초로 낮춤.
- 신 CDN에서 호스트네임 할당(ex: edge.cdnB.net) 및 SSL/도메인 검증 사전 완료.
- 기존 체인 점검: www → cdnA.net → vendorA → … 체인이 길다면 간소화.
- 유지보수 창 없이 전환:
- 가중치가 가능한 DNS(Cloudflare Load Balancer/NS1/Route 53)로 www를 두 CNAME 대상으로 분배.
- 혹은 임시 A/ALIAS로 두 CDN 에지를 병행(벤더 지원 여부 확인).
- 모니터링: 지역별 에러/성능(RUM, Synthetic) 확인.
- 안정화 후 TTL 복원, 구 CDN 비활성화.
주의: apex가 필요한 경우 ALIAS/ANAME 사용. 일부 CDN은 apex CNAME 지원을 전제로 한 문서가 있으나, 실제로는 DNS 제공자 기능에 의존한다.
DNSSEC, 보안과 전파
- DNSSEC 활성화/비활성화, 키 롤오버는 “전파” 관점에서 예민하다. DS 레코드(TLD) 퍼블리시/제거 타이밍과 TTL을 고려.
- 잘못된 DS/KEY 조합은 일부 리졸버에서만 검증 실패 → 간헐 이슈로 보일 수 있다.
- 권장:
- 자동화된 ZSK 롤오버, 충분한 오버랩 기간.
- DS 추가/삭제 시 최소 24~48시간 모니터링 창 확보.
- 오류 시 Negative Trust Anchor 임시 적용 프로세스 준비(운영팀/레지스트라 지침 확인).
사내/스플릿-호라이즌(Split-horizon) DNS 동기화
- 내부와 외부 존이 다른 답을 주는 경우, 변경 작업은 양쪽에 동시 적용되어야 한다.
- 내부 리졸버 캐시 만료 시간도 별도. 기업 VPN/프록시가 독자 캐시 보유 가능.
- 운영 팁:
- 내부/외부에 동일한 TTL 정책 유지 또는 내부 TTL 더 낮게.
- 자동 동기화 파이프라인(Terraform, GitOps)으로 이탈 방지.
관측/모니터링과 SLO
- 전파 SLO 예시: “레코드 변경 후 10분 내 95% 리졸버에서 새 응답, 30분 내 99%”.
- 측정 방법:
- Ripe Atlas로 다수 노드에서 주기적 dig.
- 주요 공용 리졸버(8.8.8.8/1.1.1.1/9.9.9.9) 질의 결과 TTL/응답 비교.
- RUM으로 실제 유저 네트워크에서 도메인 조회 시간/연결 오류 수집.
- 알림:
- TTL 경과 시간을 고려한 지연 허용치를 알림 로직에 반영.
- CDN/엣지 에러율, TCP SYN 실패율 등도 함께 모니터링.
비용·성능 트레이드오프
- 낮은 TTL은 빠른 전환과 장애 회피에 유리하지만, 권한 서버 쿼리 증가로 비용/쿼터/가용성 리스크가 있다.
- 고정 인프라(변경 적은 레코드)는 TTL을 높여(1~24h) 리졸버 캐시 효율을 개선.
- 변경 가능성이 큰 엔드포인트(서비스 엔트리포인트)는 300~900초 등 중간 TTL로 운영, 변경 전 일시 저하.
베스트 프랙티스 체크리스트
- 변경 48~72h 전 TTL 낮추기.
- CNAME 체인 최소화, apex는 ALIAS/ANAME 사용.
- Weighted/헬스체크 기반 라우팅으로 단계적 전환.
- 네임서버 이전은 이중 호스팅 + 충분한 모니터링 창.
- 네거티브 캐싱 방지 위해 사전 퍼블리시.
- IPv6(AAAA)와 SPF/DKIM/DMARC 등 메일 관련 레코드의 조회 한도 검토.
- DNSSEC 변경 시 DS/KEY 전파 계획 수립.
- 도구 체계화: dig +trace, 여러 리졸버 테스트, 캐시 플러시 절차 정리.
- 자동화: IaC(Terraform), CI/CD 파이프라인에 DNS 변경 스텝과 롤백 포함.
자주 하는 실수와 회피법
- “DNS 체크 사이트에서만 옛값” → 해당 사이트 리졸버 캐시일 수 있음. 여러 리졸버로 교차 검증.
- TTL을 낮추지 않고 바로 변경 → 수 시간 이상 회색지대 발생.
- CNAME과 다른 레코드 공존 → 표준 위반. 권한 서버가 응답 거부 가능.
- TXT 레코드 과대(예: SPF 너무 길거나 include 중첩) → UDP 조각과 검증 실패. 레코드 분할/정리.
- 브라우저/OS 캐시를 무시 → 로컬 캐시 플러시도 점검 항목에 포함.
운영 자동화 예시: Terraform + GitOps
- 변경 작업 PR → 승인 시
- 1단계: TTL 저하 커밋 적용
- 일정 경과 후 2단계: 레코드 값 변경 + Weighted 적용
- 모니터링 자동 확인(합격 시) → 3단계: TTL 복원
- 실패 시 PR 롤백 플랜 자동화
- 예시 스니펫(Route 53, ALIAS):
resource "aws_route53_record" "apex" {
zone_id = var.zone_id
name = "example.com"
type = "A"
alias {
name = aws_lb.app.dns_name
zone_id = aws_lb.app.zone_id
evaluate_target_health = true
}
}
ALIAS를 통해 apex에서 LB/CloudFront 등으로 평탄화.
케이스 스터디: “DNS 전파 48시간”을 15분으로 줄이기
상황:
- 전자상거래 사이트, 주말 트래픽 급증.
- 기존 단일 리전 IP에서 멀티 리전으로 전환 필요. 문제:
- 이전 배포에서 TTL 1시간 상태로 바로 변경, 일부 고객 1시간 동안 옛 리전에 접속해 높은 레이턴시와 오류. 해결:
- 배포 3일 전 대상 레코드 TTL 300초로 낮춤.
- 전환 시 Weighted DNS(60:40, 30:70, 0:100)로 15분에 걸쳐 이동.
- Ripe Atlas와 공용 리졸버 질의로 업데이트 상태 실시간 확인.
- 전환 완료 후 TTL 1800초로 복원. 결과:
- 오류율 40% → 2% 미만.
- 평균 전환 시간 1시간+ → 15분 내 99% 리졸버 갱신.
문제 해결 런북(요약)
- 증상 수집: 어느 네트워크/리졸버/지역에서 옛 응답이 나오는지.
- TTL 확인: dig +ttlunits로 남은 TTL 파악.
- 캐시 플러시 가이드: 사용자 OS/브라우저, 사내 DNS.
- 권한 서버 상태: 최신 레코드 적용 여부, 여러 NS 동기화.
- CNAME 체인/EDNS0 크기/UDP 조각 확인.
- 네거티브 캐싱 여부: NXDOMAIN 흔적 파악.
- 임시 우회: Weighted로 트래픽 유도, CDN 규칙 조정.
- 사후 교훈: TTL 정책, 자동화 파이프라인 개선.
마무리: “전파”가 아니라 “계획 가능한 캐시”
DNS는 본질적으로 캐시 시스템입니다. “전파를 기다린다”는 수동적 접근 대신, TTL 전략·가중치 라우팅·사전 퍼블리시·이중 호스팅·자동화로 전환을 설계하면 대부분의 변경은 수분~수십 분 내로 안정적으로 마무리할 수 있습니다. A 레코드와 CNAME 각각의 특성을 이해하고, 체인 최소화와 apex 평탄화, 네거티브 캐싱 관리, NS 마이그레이션 절차를 갖춘다면 DevOps 팀은 “DNS 때문에 배포가 늦어지는” 순간을 과감히 줄일 수 있습니다.
실천 과제:
- 이번 주에 변경 가능성이 있는 레코드 TTL을 분류하고, 표준 운영 TTL과 변경 전 저하 TTL 정책을 문서화.
- CNAME 체인 시각화(스크립트/도구)로 2단계 초과 체인을 줄인다.
- 네임서버 이전 계획을 이중 호스팅/검증 런북과 함께 리허설.
- IaC 파이프라인에 DNS 변경 단계, 가드레일, 롤백을 추가.
DNS 전파 지연은 피할 수 없는 운명이 아닙니다. 올바른 설계와 운영 패턴으로 충분히 예측 가능하고, 빠르게, 그리고 안전하게 다룰 수 있습니다.