DNS
Domain Name System
도메인 이름을 IP 주소로 변환하는 시스템. 인터넷의 전화번호부 역할.
Domain Name System
도메인 이름을 IP 주소로 변환하는 시스템. 인터넷의 전화번호부 역할.
DNS(Domain Name System)는 사람이 기억하기 쉬운 도메인 이름(예: google.com)을 컴퓨터가 이해하는 IP 주소(예: 142.250.196.110)로 변환하는 분산 데이터베이스 시스템입니다. 인터넷의 전화번호부라고 불리며, DNS가 없다면 우리는 모든 웹사이트에 접속할 때 숫자로 된 IP 주소를 외워야 합니다.
DNS는 1983년 Paul Mockapetris에 의해 설계되었습니다. 초기 인터넷(ARPANET)에서는 hosts.txt 파일 하나로 모든 호스트 이름을 관리했지만, 네트워크가 급격히 성장하면서 이 방식은 한계에 부딪혔고, 분산형 계층 구조를 가진 DNS가 탄생했습니다.
DNS는 계층적 구조로 작동합니다. Root DNS 서버 → TLD(Top-Level Domain) 서버(.com, .kr 등) → Authoritative DNS 서버 순으로 쿼리가 전달됩니다. 로컬 DNS 리졸버는 이 결과를 캐싱하여 같은 도메인에 대한 반복 쿼리를 빠르게 처리합니다. 일반적인 DNS 조회는 100ms 이내에 완료됩니다.
현대 웹 서비스에서 DNS는 단순한 이름 해석을 넘어 로드 밸런싱, CDN 라우팅, 장애 복구(Failover), 지리적 라우팅 등 다양한 역할을 수행합니다. AWS Route 53, Cloudflare DNS 같은 서비스들은 99.99% 이상의 가용성을 보장하며, 전 세계 수십억 개의 쿼리를 매일 처리합니다.
import socket
import dns.resolver # pip install dnspython
# 기본 DNS 조회
hostname = "google.com"
ip_address = socket.gethostbyname(hostname)
print(f"{hostname} → {ip_address}") # google.com → 142.250.196.110
# dnspython으로 상세 DNS 조회
resolver = dns.resolver.Resolver()
# A 레코드 (IPv4 주소)
a_records = resolver.resolve("google.com", "A")
for rdata in a_records:
print(f"A Record: {rdata}")
# MX 레코드 (메일 서버)
mx_records = resolver.resolve("google.com", "MX")
for rdata in mx_records:
print(f"MX Record: {rdata.preference} {rdata.exchange}")
# TXT 레코드 (SPF, DKIM 등)
txt_records = resolver.resolve("google.com", "TXT")
for rdata in txt_records:
print(f"TXT Record: {rdata}")
# 커스텀 DNS 서버 사용 (Google DNS)
resolver.nameservers = ["8.8.8.8", "8.8.4.4"]
result = resolver.resolve("example.com", "A")
print(f"Google DNS 결과: {list(result)}")
# nslookup - 기본 DNS 조회
nslookup google.com
nslookup -type=MX google.com # 메일 서버 조회
nslookup google.com 8.8.8.8 # 특정 DNS 서버 사용
# dig - 상세 DNS 조회 (추천)
dig google.com # A 레코드
dig google.com MX # MX 레코드
dig google.com +short # IP만 출력
dig @8.8.8.8 google.com # Google DNS 사용
dig google.com +trace # DNS 해석 경로 추적
# DNS 캐시 확인 및 삭제 (macOS)
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
# DNS 캐시 삭제 (Linux)
sudo systemctl restart systemd-resolved
# DNS 캐시 삭제 (Windows)
ipconfig /flushdns
# 역방향 DNS 조회 (IP → 도메인)
dig -x 8.8.8.8 +short # dns.google 반환
# DNS 응답 시간 측정
dig google.com | grep "Query time"
const dns = require('dns');
const { Resolver } = require('dns').promises;
// 기본 DNS 조회 (콜백)
dns.lookup('google.com', (err, address, family) => {
console.log(`IP: ${address}, IPv${family}`);
});
// Promise 기반 DNS 조회 (권장)
async function dnsLookup() {
const resolver = new Resolver();
// A 레코드 조회
const addresses = await resolver.resolve4('google.com');
console.log('A Records:', addresses);
// MX 레코드 조회
const mxRecords = await resolver.resolveMx('google.com');
mxRecords.forEach(mx => {
console.log(`MX: ${mx.exchange} (priority: ${mx.priority})`);
});
// TXT 레코드 조회
const txtRecords = await resolver.resolveTxt('google.com');
console.log('TXT Records:', txtRecords);
// 역방향 조회 (IP → 도메인)
const hostnames = await resolver.reverse('8.8.8.8');
console.log('Reverse DNS:', hostnames);
}
// 커스텀 DNS 서버 설정
const customResolver = new Resolver();
customResolver.setServers(['8.8.8.8', '1.1.1.1']);
dnsLookup().catch(console.error);
"DNS TTL이 1시간으로 설정되어 있어서, IP 변경 후에도 최대 1시간 동안 이전 서버로 트래픽이 갈 수 있습니다. 긴급 상황을 대비해 TTL을 5분으로 낮추는 게 좋겠습니다. 참고로 Cloudflare는 기본 TTL이 300초입니다."
"DNS는 분산 캐싱 구조로 작동합니다. 클라이언트가 도메인을 요청하면, 먼저 로컬 DNS 캐시를 확인하고, 없으면 Recursive DNS 서버가 Root → TLD → Authoritative 서버 순으로 반복 쿼리를 수행합니다. 실제 프로덕션에서는 Route 53이나 Cloudflare를 사용해서 지역별 라우팅과 헬스체크 기반 페일오버를 구현했습니다."
"멀티 리전 서비스라면 GeoDNS를 적용해서 사용자와 가까운 리전으로 라우팅하는 게 좋습니다. 아시아 사용자는 ap-northeast-2로, 미국 사용자는 us-east-1로 보내면 레이턴시를 100ms 이상 줄일 수 있습니다."
TTL 24시간 설정 후 서버 마이그레이션하면, 최대 하루 동안 일부 사용자가 이전 서버로 접속합니다. 마이그레이션 전 최소 48시간 전에 TTL을 300초(5분) 이하로 낮추세요.
DNS 변경은 즉시 반영되지 않습니다. 전 세계 DNS 서버에 전파되는 데 최대 48시간이 걸릴 수 있습니다. 중요한 변경은 트래픽이 적은 시간에 미리 진행하세요.
2016년 Dyn DNS 공격으로 Twitter, Netflix 등이 다운됐습니다. 중요 서비스는 Route 53 + Cloudflare처럼 복수의 DNS 제공자를 사용하세요.
평상시 TTL은 1시간(3600초), 변경 예정 시 5분(300초)으로 설정. DNSSEC을 활성화하여 DNS 스푸핑 방지. 모니터링 도구로 DNS 해석 시간을 상시 체크하세요.