Domain Name System

클라이언트가 도메인주소를 통해 서버에 접속하는 과정을 정리한다.

우리는 우리가 이용하는 플랫폼의 모든 IP주소를 외울 수 없기 때문에 도메인주소를 사용한다. 도메인주소를 통해 호스트에 접속하려면 도메인주소와 IP주소를 매핑하여 저장하고 조회하는 장치가 필요할 것이다. 이 장치를 DNS(Domain Name System)이라고 한다.

DNS & 리졸버

브라우저의 URL창에 kde6260.gitbook.io 를 입력하면 어떻게 IP주소를 알 수 있을까?

  1. 브라우저 프로그램은 OS에 내장되어있는 소켓 라이브러리의 함수를 호출한다. (C로 짜여있다.)

  2. 이 함수는 이미 설정되어있는 DNS에 조회 메세지를 보낸다.

  3. DNS는 시스템 내부의 레코드 테이블을 탐색한 결과로 응답한다.

  4. 돌아오는 응답을 받아 브라우저가 사용하는 메모리에 응답메세지 내용, 즉 IP주소를 쓴다.

이렇게 도메인주소를 통해 IP주소를 조사하는 것을 네임 리졸루션(name resolution)이라고 하고, 리졸루션을 담당하는 프로그램을 리졸버(resolver)라고 한다.

DNS서버도 LAN 외부에 존재하는 호스트이므로 IP주소를 가진다. 내 호스트의 리졸버가 바라보는 DNS서버의 IP주소를 확인하려면 /etc/resolve.conf 파일을 확인하면 된다.

$ cat /etc/resolv.conf 
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1 

DNS record

DNS서버의 기본 동작은 클라이언트(브라우저나 네이티브 앱이 아니라 컴퓨터를 뜻한다. 애플리케이션은 DNS에 직접 요청을 할 수 없고 리졸버에게 제어를 넘겨줌으로써 IP주소를 알 수 있다.)로부터 조회 메세지를 받고 응답하는 형태다. 조회메세지는 다음 3가지로 구성된다.

조회메세지에 명시하는 타입의 종류는 아래와 같다.

예를 들어 리졸버가 DNS서버에 아래와 같은 메세지로 질의한다면 DNS는 세 가지 필드가 모두 일치하는 레코드의 IP주소로 응답할 것이다.

kde6260.gitbook.io       IN       A

리눅스 터미널에서 DNS서버에 질의할 때는 dig명령어를 사용한다.

도메인 계층

사내 네트워크처럼 웹 서버나 메일 서버의 수가 제한되어 있으면 레코드를 모두 한 대의 DNS서버에 등록하면 될 것이다. 하지만 인터넷에는 수많은 서버가 산재하므로 DNS 서버 1대에 모든 레코드를 등록하는 것은 불가능하다. 그러면 어떤 DNS서버에 도메인을 질의했을 때 그 서버에는 도메인에 대한 정보가 등록되어있지 않을 수 있다.

그래서 도메인에 계층이 존재한다. 도메인을 분산시켜 다수의 DNS에 등록하고, 이 DNS서버들이 연대하여 어디에 정보가 등록되어 있는지 찾아내기 위함이다.

도메인은 .으로 구분한다. kde6260.gitbook.io에서 io 의 하위도메인으로 gitbook이 있고 그 아래의 하위도메인으로 kde6260이 있는 구조다.

kr, com등을 최상위 도메인으로 간주하지만 이 도메인들 위에 루트도메인이 존재한다. 루트도메인은 도메인 이름이 없으므로 생략해서 쓴다. (루트 도메인을 레코드로 갖는 DNS서버는 전 세계에 13대 있다고 한다.)

DNS에 주소를 질의하여 IP주소를 받는 실제 과정은 아래와 같다.

  1. 호스트에 설정되어있는 DNS(closest DNS)서버로 질의한다.

  2. closest DNS에 해당 도메인의 레코드가 없으면 closest DNS가 루트도메인 DNS에 질의한다. (루트도메인 DNS는 13대밖에 없기 때문에 모든 DNS는 루트도메인 DNS의 주소를 가지고 있다.)

  3. 루트 도메인 DNS가 io을 레코드로 가지는 DNS의 주소로 응답한다. (aaa.aa)

  4. closest DNS가 aaa.aa에 질의한다.

  5. aaa.aa DNS가 gitbook을 레코드로 가지는 주소로 응답한다. (bb.bb)

  6. 반복

  7. DNS로부터 돌아온 메세지의 레코드 타입이 A이고 IP주소가 있으면 closet DNS는 받은 IP주소를 호스트에게 전달한다.

Last updated