2부 · 주소를 찾아서: 도메인과 DNS
← 1부 | 목차 | 다음: 3부 · HTTP →
지금 다루는 단계: ① DNS 조회 — 여정의 첫 발걸음입니다.
flowchart LR
U["사용자<br/>주소 입력"]:::user
DNS["① DNS 조회<br/>이름 → 주소"]:::focus
TCP["② 연결"]:::dim
REQ["③ 요청"]:::dim
SRV["④ 서버"]:::dim
RES["⑤ 응답"]:::dim
REN["⑥ 렌더링"]:::dim
U --> DNS --> TCP --> REQ --> SRV --> RES --> REN
classDef user fill:#fff3b0,stroke:#d4a017,color:#000
classDef focus fill:#cfe8ff,stroke:#2b6cb0,color:#000,stroke-width:3px
classDef dim fill:#f0f0f0,stroke:#bbb,color:#999
컴퓨터는 이름이 아니라 번호로 찾아간다
우리는 google.com이라는 이름을 기억합니다. 하지만 인터넷 위의 컴퓨터들은 이름이 아니라 번호로 서로를 찾습니다. 이 번호를 IP 주소(IP address)라고 합니다.
google.com → 142.250.x.x (이런 식의 숫자)
IP 주소는 인터넷에서의 전화번호 같은 것입니다. 집집마다 다른 번호가 있듯, 인터넷에 연결된 모든 컴퓨터(서버 포함)에는 주소가 있어요.
문제는, 사람이 142.250.x.x 같은 숫자를 외우긴 어렵다는 것이죠. 그래서 이름 ↔ 번호를 연결해 주는 전화번호부가 필요합니다. 그게 바로 DNS입니다.
DNS(Domain Name System, 도메인 이름 시스템): 사람이 읽는 이름(google.com)을 컴퓨터가 쓰는 번호(IP 주소)로 바꿔 주는 인터넷의 전화번호부.
도메인 이름의 구조
www.example.com 같은 주소는 점(.)으로 나뉜 조각들로 이루어집니다. 오른쪽에서 왼쪽으로 갈수록 범위가 좁아집니다.
www . example . com │ │ │ │ │ └── 최상위 도메인(TLD): .com, .org, .kr 등 큰 분류 │ └──────────── 도메인 이름: 우리가 등록해 소유하는 부분 └────────────────────── 서브도메인: 한 도메인 안의 세부 구역 (예: www, blog, mail)
.com,.kr,.org같은 최상위 도메인(TLD)은 가장 큰 우편번호 구역입니다.example부분이 우리가 돈을 내고 등록해 쓰는 고유한 이름입니다.www,blog,shop같은 서브도메인은 그 안의 세부 구역이고요.
이름이 주소로 바뀌는 과정
브라우저가 example.com의 주소를 알아내는 과정은, 전화번호부를 한 번에 한 권 뒤지는 게 아니라 여러 번호부에 차례로 물어보는 릴레이입니다.
sequenceDiagram
participant B as 브라우저
participant R as DNS 리졸버<br/>(통신사 등)
participant Root as 루트 서버
participant TLD as .com 서버
participant Auth as example.com<br/>담당 서버
B->>R: example.com 주소 알아?
Note over R: 먼저 캐시(기억)부터 확인
R->>Root: .com은 어디서 관리해?
Root-->>R: .com 담당은 저쪽이야
R->>TLD: example.com 담당은 누구야?
TLD-->>R: 담당 서버 위치는 여기
R->>Auth: example.com의 IP 주소 줘
Auth-->>R: 93.184.x.x 입니다
R-->>B: 주소는 93.184.x.x!
말로 풀면 이렇습니다.
- 브라우저가 DNS 리졸버(보통 통신사가 운영하는 안내원)에게 "
example.com주소 알아?"라고 묻습니다. - 리졸버는 먼저 기억(캐시)을 뒤집니다. 최근에 찾아봤으면 바로 답합니다.
- 모르면 루트 서버에게 "
.com은 누가 관리해?"라고 묻고, .com서버에게 "example.com담당이 누구야?"를 묻고,- 마지막으로 그 담당 서버에게 진짜 IP 주소를 받아 옵니다.
- 받은 주소를 브라우저에 알려 주고, 다음을 위해 잠시 기억해 둡니다.
복잡해 보이지만, 한 번 찾으면 한동안 캐시(cache, 임시 저장)에 보관되므로 매번 이 릴레이를 다 도는 건 아닙니다. 그래서 두 번째 방문은 더 빠릅니다.
캐시(cache): 자주 쓰는 답을 가까운 곳에 미리 적어 두는 메모. DNS뿐 아니라 웹 곳곳에서 속도를 위해 쓰입니다.
캐시는 여러 층으로 쌓여 있다
사실 브라우저는 리졸버에게 묻기 전에 더 가까운 메모부터 차례로 뒤집니다. 가까운 곳에 답이 있으면 거기서 멈추죠.
flowchart LR
A["① 브라우저<br/>캐시"]:::net --> B["② 운영체제<br/>캐시"]:::net --> C["③ 리졸버<br/>캐시"]:::net --> D["④ 릴레이로<br/>직접 조회"]:::net
A -.->|있으면 여기서 끝| STOP1["✓"]:::good
B -.->|있으면 여기서 끝| STOP2["✓"]:::good
C -.->|있으면 여기서 끝| STOP3["✓"]:::good
classDef net fill:#cfe8ff,stroke:#2b6cb0,color:#000
classDef good fill:#c6f6d5,stroke:#276749,color:#000
각 캐시에는 "이 답을 얼마나 오래 믿어도 되는지"를 정한 TTL(Time To Live, 유효 시간)이 함께 저장됩니다. TTL이 지나면 그 메모는 버리고 다시 물어봅니다. 사이트 주소를 바꾼 뒤 "왜 아직 옛날 화면이 보이지?" 하는 일이 생기는 건, 이 캐시들의 TTL이 아직 안 끝났기 때문입니다(전파 지연).
DNS는 주소 하나만 알려주는 게 아니다
DNS 전화번호부에는 용도가 다른 여러 종류의 기록(레코드, record)이 있습니다. 초보가 다 외울 필요는 없지만, 이름은 종종 보게 됩니다.
| 레코드 | 역할 |
|---|---|
| A | 이름 → IPv4 주소 (가장 기본) |
| AAAA | 이름 → IPv6 주소 (더 긴 새 형식 주소) |
| CNAME | 이름 → 다른 이름 (별명 연결, 예: www → 본 도메인) |
| MX | 그 도메인의 메일 서버는 어디인지 |
| TXT | 임의의 텍스트 메모 (도메인 소유 증명 등에 쓰임) |
즉 한 도메인은 "웹은 이 서버, 메일은 저 서버"처럼 용도별로 다른 곳을 가리킬 수 있습니다. 우리가 다루는 웹 접속에서는 주로 A(또는 AAAA) 레코드가 쓰입니다.
직접 확인해 보기 (선택 실습)
브라우저만으로도 충분하지만, 호기심이 있다면 컴퓨터의 명령 도구로 직접 이름을 주소로 바꿔 볼 수 있습니다. 안 해도 이해에는 지장 없습니다.
# 윈도우: 명령 프롬프트(cmd)에서 nslookup example.com # 맥/리눅스: 터미널에서 nslookup example.com # 또는 dig example.com
예상 출력(숫자는 환경마다 다릅니다):
이름: example.com Address: 93.184.x.x
여기서 보이는 Address가 바로 브라우저가 실제로 연결하러 가는 번호입니다.
흔한 오해와 한계
- DNS는 페이지 내용을 가져오지 않습니다. 오직 "이름 → 주소" 변환만 합니다. 실제 페이지를 받아오는 건 다음 단계(HTTP)의 일입니다.
- DNS가 느리거나 잘못되면 "사이트를 찾을 수 없음" 류의 오류가 납니다. 사이트 자체는 멀쩡한데 전화번호부만 문제일 수 있다는 뜻이죠.
- 캐시 덕에 빠르지만, 그래서 방금 바뀐 주소가 한동안 옛 주소로 보이는 일도 생깁니다(전파 지연).
이 부에서 기억할 것
- 컴퓨터는 이름이 아니라 IP 주소(번호)로 서로를 찾는다.
- DNS는 이름을 번호로 바꿔 주는 인터넷 전화번호부다.
- 변환은 리졸버 → 루트 → TLD → 담당 서버로 이어지는 릴레이이고, 캐시 덕에 보통은 빠르다.
- 캐시는 브라우저 → OS → 리졸버 여러 층으로 쌓여 있고, 각 메모에는 유효 시간(TTL)이 있다.
- DNS에는 용도별 레코드(A·AAAA·CNAME·MX 등)가 있고, 웹 접속엔 주로 A 레코드가 쓰인다.
- DNS는 주소만 알려 줄 뿐, 페이지 내용은 다음 단계에서 가져온다.
이제 주소를 알았으니, 그 서버에게 실제로 "페이지 주세요"라고 말을 거는 방법 — HTTP를 봅니다.