모든 웹 페이지를 IP 주소 (예> 192.0.0.1) 로만 접속해야 한다면, 일반 사람들은 해당 서비스로의 접근이 쉽지 않을 것입니다. 이에 많은 사람들이 좀 더 쉽게 서비스에 접속할 수 있도록 DNS (Domain Name Server 또는 Domain Name System) 를 사용하게 됩니다.
DNS (Domain Name Server) 란, 전화번호부와 같은 역할을 하는 서버 또는 시스템을 의미합니다. 예를 들어, ‘www.stevenjlee.net’ 처럼 사람이 쉽게 기억하고 읽을 수 있는 주소 (또는 이름) 를 컴퓨터가 이해할 수 있는 IP 주소 (예> 192.0.0.1) 로 변환하여 사용자의 컴퓨터가 서버로 접근할 수 있도록 하는 서비스를 제공합니다.
1. DNS 의 구조
인터넷상의 모든 도메인은 ‘.(dot)’ 또는 루트 (Root) 라고 하는 도메인 아래에 그림과 같이 나무를 거꾸로 뒤집은것과 같은 역트리 (Inverted tree) 의 계층 구조로 구성되어 있습니다. 예를 들어, ‘www.stevenjlee.co.kr’ 이라는 주소는 뒤에 있는 ‘.kr’ 부터 앞에 있는 도메인들을 순차적으로 각 단계별 서버들을 통해 확인합니다.
(1) 루트 도메인 바로 아래의 단계를 1단계 도메인 또는 최상위도메인 (TLD : Top Level Doamin) 이라고 부릅니다. 최상위 도메인은 다시 국가최상위도메인 (ccTLD : Country Code Top Level Domain) 과 일반최상위도메인 (gTLD : Generic Top Level Domain) 으로 구분할 수 있습니다. ‘www.stevenjlee.co.kr’ 이라는 주소에서는 ‘.kr’ 부분이 여기에 해당 됩니다.
(2) 최상위도메인 다음 단계를 2단계 도메인 (SLD, Second Level Domailn) 이라고 합니다. ‘www.stevenjlee.co.kr’ 이라는 주소에서는 ‘.co’ 부분이 여기에 해당 됩니다.
(3) 2단계 도메인 아래는 3단계 도메인으로 주로 도메인명이 위치합니다. ‘www.stevenjlee.co.kr’ 이라는 주소에서는 ‘example’ 부분이 해당 됩니다.
(4) ‘www.stevenjlee.co.kr’ 에서 ‘www’ 는 호스트명으로 부릅니다. 또한 주소의 체계와 구조에 따라 추가 하위 도메인 계층 이 있을 수 있습니다. (예> mail.stevenjlee.co.kr 등) 이 단계를 4단계 도메인 또는 서브도메인 이라고 합니다.
위와 같은 수평/수직적인 계층적 구조를 통해서는 체계적인 주소 관리가 가능해집니다. 또한 계층적 구조를 바탕으로 각 서버들이 트래픽을 나누어 처리할 수 있기 때문에 분산 처리가 가능해집니다.
2. 처리 과정
클라이언트가 DNS 서버에 도메인 주소의 IP 주소를 물어보고 이에 대한 답을 받는 과정을 쿼리 (Query) 라고 합니다. 특히 위에서 설명한 것과 같이, 계층 구조로 이루어진 여러 DNS 서버들 간 몇 차례의 요청과 응답을 받게 되는데, 이 쿼리 과정을 재귀적 쿼리 (Recursive Query) 라고 합니다.
‘www.stevenjlee.net ‘의 DNS 의 처리 상세 과정을 살펴보면 다음과 같습니다.
(1) 사용자가 클라이언트 호스트의 웹 브라우저에 ‘www.stevenjlee.net’ 을 입력합니다.
(2) 클라이언트의 호스트에 설정된 기본 DNS 서버로 ‘www.stevenjlee.net’ 의 IP 주소를 물어봅니다. (기본 DNS 주소는 특정 네트워크 회선 사업자가 제공하는 DNS 주소로 자동 설정되어 있을 수 있습니다.)
** 대부분의 경우에 클라이언트는 DNS 서비스에 직접 쿼리를 수행하지 않습니다. 이에 DNS 의 계층 구조에 따라 기본 DNS 주소로 연결되는 DNS Resolver 는 중간자 역할을 하여 재귀적 쿼리를 수행합니다. 아울러 DNS Resolver 는 자주 요청되는 질의에 대해 일정 시간 동안 해당 정보를 저장해두었다가 같은 요청이 들어올 경우 바로 답변을 해주는 캐싱 (Cache) 기능도 제공합니다. (TTL : Time To Live 을 이용)
(3) DNS Resolver 에 ‘www.stevenjlee.net’ 의 IP 주소 값이 있다면, 클라이언트로 바로 해당 IP 주소 값을 반환합니다. IP 주소 값이 없다면 루트 DNS 서버에 다시 IP 주소 확인 요청을 보냅니다.
(4) 루트 DNS 서버는 ‘.net’ 을 관리하는 1단계의 DNS 서버 IP 주소로 응답합니다.
(5) ‘.net’ 을 관리하는 1단계의 DNS 서버는 ‘stevenjlee.net’ 을 관리하는 2단계 DNS 서버 IP 주소를 반환합니다.
(6) ‘www.stevenjlee.net’ 의 도메인을 관리하는 서버는 ‘stevenjlee.net’ 호스팅 영역에서 ‘www.stevenjlee.net’ 의 레코드를 찾아 웹 서버의 IP 주소 192.0.0.1 등 해당 도메인 주소와 관련된 값을 받고 이 IP 주소를 다시 DNS Resolver 로 보냅니다.
** 도메인을 판매하거나 무료로 할당해주는 서비스들은 많습니다. Amazon Route 53 혹은 구글 도메인 (https://domains.google/) 등에서 해당 서비스들을 제공합니다.
(7) DNS Resolver 가 클라이언트가 필요한 IP 주소를 확보하게 됩니다. (위에서 언급한 캐싱을 위한 해당 도메인과 IP 주소를 임시로 저장해둡니다.) 해당 DNS Resolver 는 이 값을 클라이언트의 웹 브라우저로 반환합니다.
(8) 웹 브라우저는 IP 주소로 해당 서비스에 접속하여 서비스를 웹 브라우저에 표시합니다.
3. 유형
서비스 제공자가 구매한 도메인 주소는 ‘이름’ 과 ‘값’이 매칭된 바인딩 형태로 DNS 서버에 DNS 레코드로 데이터베이스에 저장됩니다. DNS 쿼리에 대해서는 하나 이상의 DNS 레코드 값을 채운 DNS 메세지로 응답하게 됩니다. DNS 메세지의 뒷부분에 붙게되는 레코드의 공통 형식은 다음과 같습니다. (데이터베이스의 튜플 형태)
Name, Value, Type, TTL
– Name : 도메인 주소
– Value : 도메인 주소 관련 값
– Type : DNS 레코드 유형 값
– TTL : DNS 캐싱 정보 최대 유지시간 (위에서 설명한 DNS Resolver 가 이 레코드에 관한 정보를 캐싱할 시간(초) 정보)
DNS 레코드는 다음과 같이 여러 종류로 지정될 수 있습니다.
(1) A / 유형 값 : 1
도메인 주소에 대한 IPv4 주소를 맵핑하는 역할을 합니다. 하나의 도메인에는 여러개의 IP 주소가 할당될 수 있으며, 반대로 하나의 IP 주소에 여러개의 도메인 주소가 할당될 수도 있습니다.
(Name -> 도메인주소, Value -> IPv4 주소, type -> 1)
(2) NS (Name Server) / 유형 값 : 2
도메인에 대한 특정 네임서버를 지정하는 역할을 합니다. 만약 자체적인 DNS 를 구축하여 이용하는 경우 이 레코드를 등록해야만 해당 DNS 서버를 이용할 수 있습니다.
(Name -> 도메인명, Value -> DNS 서버의 호스트 명, type -> 2)
(3) CNAME (Canonical NAME) / 유형 값 : 5
도메인의 별칭 (Alias) 을 지정 해주는 역할을 합니다. 따라서, CNAME 은 도메인의 별칭에 대해 맵핑되어 있는 공식 도메인의 IP 주소를 받아오도록 해줍니다.
(Name -> 도메인 주소 별칭, Value -> 공식 도메인 주소, type -> 5)
(4) SOA (Start Of Authority) / 유형 값 : 6
도메인의 영역을 표시하는 역할을 담당합니다. 또한 DNS 서버에게 어떤 기준으로 도메인을 관리해야 하는지 알려주는 역할을 합니다. 예를 들어, stevenjlee.net 주소 이하의 도메인 영역 (Zone) 은 (예> blog.stevenjlee.net) 독자적인 도메인 관리 주체에 의해 관리되는 영역으로 구분할 수 있습니다. 따라서 모든 도메인의 영역은 하나의 SOA 레코드만을 갖습니다.
(5) PTR (PoinTeR) / 유형 값 : 12
A 레코드와 상반된 개념으로, IP 주소에 대해 도메인명을 맵핑하는 역할을 합니다. (역방향 질의) 즉, IP 주소에 대해 도메인 주소를 확인하기 위한 레코드 입니다. 예를 들어, 동작 중인 서비스의 IP 주소가 사용중인 도메인이 있는지 확인하는 등의 목적으로 사용될 수 있습니다.
(6) MX (Mail eXchanger) / 유형 값 : 15
특정 도메인의 메일 서버를 지정해주는 역할을 합니다. 예를 들어, stevenjlee.net 의 메일 서버 주소를 쿼리할 때 mail.stevenjlee.net 값으로 반환하고 이 후 다시 A 유형 값으로 메일 서버의 IP 주소를 알아낼 수 있습니다.
(Name -> 메일 서버 별칭, Value -> 도메인 주소, type -> 15)
(7) AAAA / 유형 값 : 28
도메인 주소에 대한 IPv6 주소를 맵핑하는 역할을 합니다.
(Name -> 도메인 주소, Value -> IPv6 주소, type -> 28)
(8) SRV (SeRVice) / 유형 값 : 33
특정 프로토콜이나 서비스에 대해 특정 도메인을 연결해주는 역할을 담당합니다. 즉, 도메인 주소를 조금 더 확장하여 하나의 동일한 도메인 주소에 있는 여러 서비스들을 참조하여 사용할 수 있습니다. SRV 는 레코드 앞에 서비스와 프로토콜을 밑줄 (_) 과 함께 명시 해놓습니다. 이를 통한 특정 서비스의 경우 지정된 레코드의 값으로 보내게 됩니다.
# _service._proto.name. TTL class SRV priority weight port target.
_sip._tcp.stevenjlee.net. 86400 IN SRV 10 60 5060 mainrepository.stevenjlee.net.
_sip._tcp.stevenjlee.net. 86400 IN SRV 10 20 5060 subrepository1.stevenjlee.net.
_sip._tcp.stevenjlee.net. 86400 IN SRV 10 20 5060 subrepository2.stevenjlee.net.
_sip._tcp.stevenjlee.net. 86400 IN SRV 20 0 5060 backuprepository.stevenjlee.net.
4. DNS 헤더 구성
12바이트 크기의 DNS 메세지의 헤더 영역 상세 내용은 다음과 같습니다.
위 헤더 내용 중, 플래그 상세 (16비트) 내용은 다음과 같습니다.
– QR (Query/Response)
DNS 메세지가 쿼리 (0) 인지 응답 (1) 인지를 구분
– Op code (Operation code) : 4 비트
0 : 표준 질의 (또는 표준 질의에 대한 응답)
1 : 역 질의 (Inverse Query)
2 : 서버의 상태 요구
4 : 통지
5 : 갱신
– AA (Authoritative Answer, 책임 플래그)
DNS 응답 메세지에 만 사용됨
1 : 네임서버 권한이 인정된 서버일 때
– TC (Truncated)
512 바이트 초과 여부
1 : 응답메세지가 512 바이트 이상이라서 512 로 잘려짐 (이 경우에 클라이언트는 TCP 포트를 통해 질의를 재전송하게 됨)
– RD (Recursion Desired, 재귀 요구 플래그)
1 : 클라이언트가 재귀 질의를 원함 (질의메세지에서 지정되며, 응답메세지에서 이를 반복함. 재귀질의가 요청되지 않으면, 반복질의로 간주하게됨)
– RA (Recursion Available, 재귀 유효 플래그)
네임서버가 재귀 질의가 이용 가능한지를 나타냄
– 예약 (Reserved)
통상 000 으로 셋팅
– rCode (response code, 응답/오류 코드)
0 => No Error
1 => Format Error (질의를 이해할 수 없음)
2 => ServFail (Server Failure)
3 => 도메인주소가 존재 하지 않음 등
– 참조
RFC 1035 (DOMAIN NAMES) : https://tools.ietf.org/html/rfc1035#section-3.3.13
IANA, Domain Name System (DNS) Parameters : http://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml
#Steven