[Network] DNS: 도메인 이름 해석
정의
DNS (Domain Name System) 는 도메인 이름 (example.com) 을 IP 주소 (93.184.216.34) 로 변환하는 분산 데이터베이스. 인터넷의 가장 중요한 인프라.
기본 동작:
- 클라이언트 → resolver 에게 “example.com 의 IP” 요청
- resolver → root → TLD → authoritative 서버를 순회 (recursive)
- resolver → 결과를 캐시 + 클라이언트에 반환
L7 protocol, 보통 UDP 53 port (큰 응답은 TCP 53, modern 은 DoT/DoH).
도메인 계층
. ← root (.)
├── com. ← TLD
│ ├── google.com. ← second-level
│ │ ├── www.google.com. ← subdomain
│ │ └── mail.google.com.
│ └── example.com.
├── kr. ← ccTLD
│ └── naver.kr.
└── org.
오른쪽에서 왼쪽으로 읽기. . 가 root.
FQDN (Fully Qualified Domain Name): www.example.com. (마지막 . 까지).
DNS Record 종류
| Type | 용도 | 예시 |
|---|---|---|
| A | IPv4 주소 | example.com → 93.184.216.34 |
| AAAA | IPv6 주소 | example.com → 2606:2800:220:1::6:34 |
| CNAME | 별칭 (canonical name) | www.example.com → example.com |
| MX | 메일 서버 + 우선순위 | example.com → 10 mail.example.com |
| NS | nameserver | example.com → ns1.example.com |
| TXT | 임의 텍스트 (SPF, DKIM, 인증) | v=spf1 ... |
| SRV | service location (port + host) | _sip._tcp.example.com → 10 60 5060 sip.example.com |
| PTR | reverse lookup (IP → 도메인) | 34.216.184.93.in-addr.arpa → example.com |
| CAA | cert authority 제한 | example.com → issue "letsencrypt.org" |
| SOA | zone authority | nameserver, email, serial, refresh, ... |
| DNSKEY / DS / RRSIG | DNSSEC 서명 | - |
Resolution 흐름
client → recursive resolver → root → TLD → authoritative
("8.8.8.8" 등)
상세:
1. 클라이언트: "www.example.com 의 A 레코드?"
↓
2. recursive resolver (ISP, 8.8.8.8, 1.1.1.1)
- 캐시 hit 시 즉시 반환
- 캐시 miss:
↓
3. root (.) 에 질문: ".com 의 nameserver?"
- 응답: "a.gtld-servers.net 등"
↓
4. .com TLD 에 질문: "example.com 의 nameserver?"
- 응답: "ns1.example.com 등"
↓
5. example.com 의 authoritative 에 질문: "www.example.com 의 A?"
- 응답: "93.184.216.34"
↓
6. resolver 캐시 + 클라이언트에 반환
각 단계는 TTL 만큼 캐시. 일반적으로 5분 ~ 24시간.
recursive vs iterative
- recursive query: “최종 답을 줘”
- 클라이언트 → resolver
- iterative query: “당신이 아는 것만 줘”
- resolver → root / TLD / authoritative
대부분 OS / 브라우저는 recursive 만 사용. resolver 가 iterative 로 순회.
캐싱과 TTL
DNS 응답에 TTL (초). 짧으면 변경 빠르게 반영, 길면 부하 감소.
www.example.com. 300 IN A 93.184.216.34
↑
300 초 (5분) 캐시
다층 캐싱:
- 브라우저 cache (~수분)
- OS resolver cache (
systemd-resolved,dnsmasq) - ISP / public resolver cache
- authoritative cache 없음 (source of truth)
서비스 마이그레이션 / DNS 변경 시 TTL 미리 줄이기 (1시간 → 60초) 가 일반 패턴.
CNAME 함정
www.example.com. 300 IN CNAME example.com.
example.com. 300 IN A 93.184.216.34
www.example.com 조회 → CNAME → example.com 다시 조회 → A.
함정:
- apex / root 에는 CNAME 불가 (RFC).
example.com에는 CNAME 안 됨.- 회피: AWS Route 53 의 ALIAS (CNAME 처럼 보이지만 A 레코드 반환)
- CNAME 체인 길어지면 latency: 가능하면 직접 A
DNS over HTTPS (DoH) / DNS over TLS (DoT)
기존 DNS = 평문 UDP 53. 도청 / 변조 가능.
- DoT (RFC 7858): TLS 위에서 DNS. Port 853.
- DoH (RFC 8484): HTTPS 위에서 DNS. Port 443. 일반 HTTPS 트래픽처럼 보임.
브라우저 (Firefox, Chrome) 가 기본 DoH 활성화 중. 단점: ISP / 기업의 DNS 기반 필터링 우회 가능 → 정책 충돌.
DoQ (DNS over QUIC) 도 표준화 (RFC 9250).
DNSSEC
응답의 서명 검증:
. DNSKEY → ZSK / KSK (root signing key)
com. DS → .com 의 KSK 해시 (root 가 서명)
example.com. DS → example.com 의 KSK 해시 (.com 이 서명)
example.com. RRSIG → A 레코드의 서명
resolver 가 root → TLD → authoritative 전 chain 검증.
복잡 + 운영 어려움 → 채택률 낮음 (Top 1M 사이트의 약 4%). 큰 ISP / 정부 사이트는 적용.
EDNS (Extension)
- DNS 메시지 크기 확장 (기본 512 byte → 4096 등)
- EDNS Client Subnet (ECS): resolver 가 클라이언트 subnet 을 authoritative 에 전달 → geo-IP 정확도 향상 (CDN 핵심)
실용 예: 서비스 운영
A 레코드 + CDN
www.example.com 300 A 104.21.x.x (Cloudflare edge)
www.example.com 300 A 172.67.x.x (다른 edge)
여러 A 레코드 = round-robin 또는 anycast 라우팅.
MX 우선순위
example.com 3600 MX 10 primary-mail.example.com
example.com 3600 MX 20 backup-mail.example.com
낮은 숫자 = 높은 우선순위. primary 실패 시 backup.
TXT (SPF / DKIM / DMARC)
이메일 인증:
example.com 300 TXT "v=spf1 include:_spf.google.com ~all"
default._domainkey.example.com 300 TXT "v=DKIM1; k=rsa; p=MIGfMA0..."
_dmarc.example.com 300 TXT "v=DMARC1; p=reject; rua=mailto:..."
스팸 / 위장 방지의 필수.
Health check + failover
Route 53 / Cloudflare 같은 managed DNS 가 health check 수행:
primary 가 200 OK → primary A 반환
primary 가 5xx → backup A 반환
TTL 짧게 (30~60초) 두면 빠른 failover.
DNS 측정 도구
# 기본 lookup
dig example.com
dig example.com AAAA
dig example.com MX
# 특정 resolver
dig @8.8.8.8 example.com
# 전체 trace
dig +trace example.com
# 짧게
dig +short example.com
# nslookup (legacy)
nslookup example.com
# host (간결)
host example.com
# DoH
curl -H 'Accept: application/dns-json' \
'https://1.1.1.1/dns-query?name=example.com&type=A'
자주 보는 함정
함정 1: 캐시 stale
DNS 변경 후 일부 사용자 / ISP 가 옛 IP 캐시 → 일관성 문제. TTL 미리 줄이기.
함정 2: round-robin 의 불균등
A 레코드 여러 개를 resolver 가 순서대로 반환하지만 클라이언트가 첫 IP 만 시도하면 불균등. anycast / load balancer 가 더 정확.
함정 3: SOA refresh / retry
secondary nameserver 가 primary 의 변경을 늦게 감지. SOA 의 refresh / retry / expire 값 적절히.
함정 4: PTR 이 없으면 이메일 거부
송신 메일 서버의 PTR (reverse DNS) 가 매칭 안 되면 스팸 처리. 자체 SMTP 운영 시 필수.
함정 5: split-horizon DNS
내부에서 api.example.com → 사내 IP, 외부에서 → public IP. VPN 전환 시 캐시 혼선 가능.
함정과 베스트 프랙티스
- TTL 운영 변경 전 미리 줄이기: 마이그레이션 24시간 전부터
- DNSSEC 은 큰 조직만: 운영 복잡, 채택률 낮음
- DoH / DoT 활용: 도청 방지
- SPF + DKIM + DMARC 필수: 이메일 운영 시
- multiple authoritative nameserver: 단일 장애점 회피 (보통 2~4개)
- EDNS Client Subnet: CDN 의 geo-IP 정확도 의존성
- PTR 도 관리: 메일 / SSH 인증 영향
- monitoring: TTL, 응답 시간, error rate (NXDOMAIN 등)
- dig +trace 가 디버깅의 가장 강력한 도구
관련 위키
이 글의 용어 (6개)
- [Network] CIDR와 Subnettingnetwork
- 정의 CIDR (Classless Inter-Domain Routing) 은 IPv4 / IPv6 주소를 prefix length 로 표기하는 표준. 1993년 등장 (RFC 1…
- [Network] HTTP/3: QUIC 위의 HTTP, 0-RTT, connection migrationnetwork
- 정의 HTTP/3 (2022, RFC 9114) 는 HTTP 의 전송 레이어를 TCP → QUIC 으로 교체한 버전. UDP 위에 QUIC, QUIC 위에 HTTP. 핵심 동기:…
- [Network] IP: IPv4, IPv6, CIDRnetwork
- 정의 IP (Internet Protocol) 주소 는 인터넷에서 노드를 식별하는 논리 주소. IPv4 (32bit) 와 IPv6 (128bit) 두 버전이 병존. IPv4 4 …
- TCPnetwork
- 정의 TCP (Transmission Control Protocol)는 신뢰성 있는 연결 지향 전송 계층 프로토콜이다. RFC 9293 으로 정의되어 있다. HTTP/1.1·2,…
- TLS / SSLnetwork
- 정의 TLS (Transport Layer Security)는 (또는 위 ) 위에서 동작하는 암호화·인증 프로토콜이다. SSL 은 TLS 의 전신 (Netscape 1995, 더…
- UDPnetwork
- 정의 UDP (User Datagram Protocol)는 비연결·비신뢰 전송 계층 프로토콜이다. RFC 768 (1980) 로 정의되었다. 와 대비된다. "보내고 잊는다(fir…
💬 댓글