🌍 네트워크

DNS

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을 너무 길게 설정

TTL 24시간 설정 후 서버 마이그레이션하면, 최대 하루 동안 일부 사용자가 이전 서버로 접속합니다. 마이그레이션 전 최소 48시간 전에 TTL을 300초(5분) 이하로 낮추세요.

DNS 전파 시간 무시

DNS 변경은 즉시 반영되지 않습니다. 전 세계 DNS 서버에 전파되는 데 최대 48시간이 걸릴 수 있습니다. 중요한 변경은 트래픽이 적은 시간에 미리 진행하세요.

단일 DNS 제공자에만 의존

2016년 Dyn DNS 공격으로 Twitter, Netflix 등이 다운됐습니다. 중요 서비스는 Route 53 + Cloudflare처럼 복수의 DNS 제공자를 사용하세요.

올바른 DNS 설정 방법

평상시 TTL은 1시간(3600초), 변경 예정 시 5분(300초)으로 설정. DNSSEC을 활성화하여 DNS 스푸핑 방지. 모니터링 도구로 DNS 해석 시간을 상시 체크하세요.

🔗 관련 용어

📚 더 배우기