DNS
1. 개요
- 인터넷 상의 모든 서버는 IP 주소를 통해 인터넷에 연결돼 있으므로 어떤 서버에 데이터를 요청하려면 그 서버의 IP 주소를 입력해 이를 요청해야겠지만, 실제 일반 사용자 입장에서 자신이 데이터를 요청하고자 하는 서버의 12자리 숫자로 된 IP 주소를 일일이 입력해 데이터를 요청하는 건 현실적으로 난이도가 너무 높다. 이 점을 고려하여 실제 인터넷 서비스는 알파벳과 숫자로 이루어진 식별자인 도메인 네임(domain name)을 입력하는 것만으로 각 서버에 접속할 수 있게 하며, 이처럼 도메인 네임을 이용해 각 서버에 접속할 수 있게 하는 인터넷 서비스 내 체계를 DNS(domain name system)라 한다.
- 구체적으로, 일반 사용자가 브라우저 창 등을 통해 인터넷 서버의 도메인 주소를 입력하면, 먼저 일반 사용자의 OS에 현재 저장돼 있는 DNS 서버로 그 도메인 주소에 해당하는 IP 주소를 알려달라는 DNS 쿼리가 전송된다. 이를 수신한 DNS 서버는 그 IP 주소를 얻기 위한 일련의 절차를 개시하며, 절차를 마친 후 얻은 IP 주소를 DNS 응답으로서 사용자에게 반환한다. 이렇게 얻은 IP 주소를 통해 사용자의 PC가 해당 인터넷 서버와 연결된다. (이러한 서비스를 지원하기 위해, ISP는 사용자의 PC가 처음으로 ISP에 연결될 때 거기서 가장 가까운 DNS 서버의 IP 주소를 사용자의 PC에 보내준다.)
- DNS 쿼리와 응답은 대개 UDP 프로토콜로 구현되므로(DNS 통신은 통신할 때 전달하는 메시지의 크기가 워낙 작고 TCP 프로토콜이 사용하는 3-way handshaking의 overhead가 크기 때문에 웬만해선 UDP 프로토콜로 통신을 수행한다) 도메인 네임의 IP 주소 매핑은 transport 계층에서 일어나는 작업이라 볼 수 있다.
* 도메인 네임
- 알파벳과 숫자로 이루어져 있으며, 여러 구성요소를 갖고 있어 여러 도메인 네임들을 계층구조로 분류할 수 있다. (이렇게 분류한 계층구조를 도메인 네임 스페이스라 한다.) 각 구성요소는 다음과 같다.
-
FQDN(fully qualified domain name): 하나의 도메인 네임의 전체적 형태(예를 들면,
klee313.github.io)를 FQDN이라 하며, FQDN은 마침표를 기준으로 여러 구성요소를 갖는다. -
TDL: FQDN에서 가장 마지막 마침표 뒤에 있는 구성요소를 TLD라 하며(
klee313.github.io에서는io), 이 값은 인터넷 서버측이 임의로 결정하는데 대개 그 인터넷 서버가 제공하는 서비스의 성격에 따라 결정된다.com,org,net같은 경우가 흔하며,kr,jp,io같이 표준으로 지정된 국가코드가 배치되는 경우도 있다. -
2단계 도메인(second-level domain, SLD): FQDN에서 뒤에서 두 번째 구성요소(만약 마지막 구성요소가 국가코드고 뒤에서 두 번째 구성요소가 국가코드 2단계 도메인이라면, 뒤에서 세 번째 구성요소)를 일컫는 표현으로(
klee313.github.io에서는github), 이 역시 인터넷 서버측이 임의로 결정하며 인터넷 서버를 식별하는 주된 도메인 네임이라 할 수 있다. -
서브도메인(subdomain): FQDN의 첫 번째 구성요소(
klee313.github.io에서는klee313). 특정 SLD에 대응되는 DNS 서버는 여러 호스트들을 관리하고 있으며, 이때 서브도메인은 그 DNS 서버로 전달된 요청 중 어떤 호스트로 요청을 전달할지를 지정하는 역할을 한다. HTTP/HTTPS 프로토콜을 통해 웹페이지를 요청하고 그에 따라 웹페이지를 반환하는 서브도메인으로서www가 가장 대중적으로 쓰이지만(WWW가 바로 HTTP 프로토콜을 통한 웹페이지 송수신 체계이므로 거기서 따온 것) 이는 의무 사항은 아니며 각 인터넷 서버가 얼마든지 임의로 결정할 수 있다.
2. DNS의 구성요소
- 기능만 생각하면 DNS 서버는 인터넷 내에 단 하나만 있어도 될 것 같지만, 실제로 인터넷 망에 연결돼 있어 DNS 서버로 IP 주소를 요청하는 호스트는 수십억 대가 있고 이러한 요청을 컴퓨터 한 대로 처리하는 것은 물리적으로 불가능하다. 설사 가능하다 하더라도, 그 컴퓨터가 고장나면 그 순간 전세계의 인터넷 망이 동시에 다운되는 거나 다름없어 안정성 측면에서 바람직하지 못하다. 이 때문에 DNS 서버는 전세계 곳곳에 수만 대 이상 배치돼 있으며, DNS 서버끼리도 서로 계층 구조를 이루고 있어 세계 곳곳에서 들어오는 IP 주소 요청을 보다 효율적으로 처리하고 있다.
- DNS를 구성하는 구성요소로서는 다음이 있다.
-
도메인 네임 스페이스: 도메인 네임을 여러 구성요소로 쪼개, 각 구성요소 간 계층구조를 구성한 것.
-
네임서버: DNS 쿼리로 전달받은 도메인 네임을 분석해 그에 관한 정보를 갖고 있는 네임서버의 IP 주소 정보를 반환하는 기능을 하는 DNS 서버. 도메인 네임 스페이스에 따라 계층구조를 이루고 있다.
-
리졸버: 여러 네임서버에 DNS 쿼리를 전송해 IP 주소를 얻어와 이를 요청한 호스트에 반환하는 일련의 작업을 수행하는 서버 또는 프로세스로, 사용자 PC에 구현될 수도 있으나 일반적으로는 ISP가 독립된 DNS 서버에 구현해 운영한다.
3. DNS 서버
1) 로컬 DNS 서버
- 각 인터넷 사용자에게 인터넷 서비스를 제공하는 ISP는 사용자의 PC가 ISP에 연결됐을 때 거기서 가장 가까운 DNS 서버의 IP 주소를 사용자의 PC로 전송하며, 이를 로컬 DNS 서버라 한다.
- 로컬 DNS 서버는 DNS 시스템의 리졸버 역할을 수행한다. 즉, DNS 쿼리로서 요청이 들어온 인터넷 서버의 도메인 네임을 전달받았을 때 그에 대응되는 IP 주소가 서버에 있으면 이를 반환하고(DNS caching), 없으면 이를 얻어오기 위한 DNS 쿼리를 먼저 루트 DNS 서버에 보냄으로써 일련의 절차를 개시한다. 절차가 종료되면 얻어온 IP 주소를 이를 요청한 사용자에게 반환한다.
2) 루트 DNS 서버
- 도메인 주소에 대응되는 IP 주소를 찾는 일종의 기점이 되는 DNS 서버로, 로컬 DNS 서버로부터 전달받은 도메인 네임에서 TLD를 분석해 그에 대응되는 TLD DNS 서버의 IP 주소를 로컬 DNS 서버에 반환한다.
- 루트 DNS 서버의 IP 주소는 전세계에 단 13개밖에 없는데, 이는 DNS 프로토콜이 과거 UDP 프로토콜로만 통신을 수행했다는 점과 관련이 있다. UDP 프로토콜의 경우 패킷 하나의 크기를 512 바이트로 제한하는데(패킷의 크기가 클수록 데이터 손실 위험이 커지기 때문), 루트 DNS 서버의 IP 주소 목록을 512 바이트 이내로 담았을 때 담을 수 있는 IP 주소의 최대 개수가 13개이기 때문에 처음부터 루트 DNS 서버의 IP 개수가 총 13개로 고정된 것이다. 다만 각 IP 주소에 대응되는 실제 물리적 루트 DNS 서버 수는 그것보다 많기 때문에 전세계에 있는 물리적 루트 DNS 서버는 1천개 이상 존재한다.
3) TLD DNS 서버
- 로컬 DNS 서버는 사용자가 요청한 도메인 네임의 TLD(klee313.github.io에서는 io)에 대응되는 TLD DNS 서버의 IP 주소를 루트 DNS 서버로부터 반환받은 후, 이번에는 다시 그 도메인 네임이 담긴 DNS 쿼리를 그 TLD DNS 서버로 보낸다.
- TLD DNS 서버에는 각 SLD 값에 따라 그에 대응되는 인터넷 서버가 속한 책임 DNS 서버(또는 이를 알고 있는 중간 DNS 서버)의 IP 주소가 저장돼 있다. 따라서 DNS 쿼리를 받으면 그 쿼리 내 도메인 네임으로부터 SLD를 분석하여, 그 SLD에 대응되는 책임 DNS 서버(또는 이를 알고 있는 중간 DNS 서버)의 IP 주소를 로컬 DNS 서버로 반환한다.
4) 책임 DNS 서버(authoritative DNS server)
- TLD DNS 서버에 IP 주소가 등록돼 있어, 각 SLD(klee313.github.io에서는 github)에 대응되는 IP 주소 정보가 기록된 DNS 레코드를 가지고 있는 DNS 서버를 책임 DNS 서버라 한다. 책임 DNS 서버는 특정 SLD에 관한 호스트만을 관리하는 인터넷 서버일 수도 있고, 여러 SLD를 관리하는 서비스 업체의 DNS 서버일 수도 있다.
- 특정 SLD를 관리하는 책임 DNS 서버의 IP 주소를 TLD DNS 서버로부터 받은 로컬 DNS 서버는 그 책임 DNS 서버에 DNS 쿼리를 전송하여 사용자가 요청하는 도메인 네임에 대응되는 IP 주소를 요청하며, 이 요청을 받은 책임 DNS 서버는 자신이 가진 DNS 레코드를 조회하여 이를 요청한 로컬 DNS 서버에게 해당 IP 주소를 반환한다.