1. 개념
1.1. DNS란?
DNS는 Domain Name System의 줄임말이다.
1.2. Domain Name
Domain Name(도메인 네임)은 서버의 주소를 나타내는 고유한 문자열을 의미한다.
google.com, naver.com, daum.net 같은 문자열이 대표적이다.
브라우저를 통해 google.com에 접속하는 것은 사실 구글 서버에 접속하는 것과 같다.
특정 서버에 접속하기 위해서는 서버의 ip주소를 이용해야 되는데, 단순한 숫자의 나열보다는 문자열을 이용하는 것이 사람 입장에서 기억하기도 쉽고 사용하기도 편리하기 때문에 ip주소를 문자열로 치환하는 과정이 등장하게 되었다.
즉 웹 브라우저에서 142.250.76.142를 굳이 입력하지 않아도, google.com 입력을 통해 google 서버와 통신할 수 있는 것은 DNS 덕분이라 할 수 있겠다.
IP주소 | Domain Name |
142.250.76.142 | google.com |
223.130.195.200 | naver.com |
121.53.105.193 | daum.net |
2. 동작 과정
2.1. DNS 서버 주소를 얻는 법
기기가 맨 처음 네트워크에 연결된 경우 DHCP 요청을 보내게 되며, DHCP 서버는 요청을 보낸 기기에게 (할당한) IP주소, 서브넷 마스크, 기본 게이트웨이 주소, 그리고 DNS 서버 주소(local DNS)를 전달한다.
경우에 따라 다르겠지만, DHCP 서버가 전달해 준 DNS 서버(local DNS) 주소는 보통 통신사가 제공하는 자사의 DNS 서버를 전달하는 경우가 많다.
아래의 표는 통신사별 DNS 서버 주소를 정리한 것이다.
SK | KT | LG | |
기본 DNS 서버 주소 | 219.250.36.130 | 168.126.63.1 | 164.124.107.9 |
보조 DNS 서버 주소 | 210.220.163.82 | 168.126.63.2 | 203.248.242.2 |
기기에 설정된 DNS 서버 주소를 확인하는 법 (mac의 경우)
해당 주소를 열람한 시점에서는 KT 통신사가 제공하는 네트워크에 접속해 있었기 때문에, KT의 DNS 서버 주소가 지정된 것을 볼 수 있었다.
$ vi /etc/resolv.conf
2.2. DNS 질의 과정
예를 들어 국방부 홈페이지에 접속하기 위해 www.mnd.go.kr에 접속한다고 가정해 보자.
국방부 홈페이지의 도메인 주소는 위의 그림과 같은 구조로 되어있다.
(한 가지 특이한 점은 도메인 주소 맨 마지막에 온점(.)이 찍혀있다는 것인데, 사실 완전하게 도메인을 표기하기 위해서는 주소 맨 마지막에 온점을 찍어야 하지만, 실생활에서는 생략하여 표기한다)
1. DNS 캐시 테이블 참조
도메인 네임에 해당하는 ip주소를 찾기 위해서는 가장 먼저 내 기기에 저장된 DNS 캐시 테이블을 참조한다.
해당 도메인 네임이 캐시에 저장되어 있을 경우, 해당 캐시 테이블에 저장된 ip 주소를 이용하여 접속하여 불필요한 DNS 질의 과정을 생략한다.
2. local DNS 서버에게 질의
만약 DNS 캐시 테이블에서 도메인 네임을 찾지 못한 경우, 앞서 알아보았듯, 기기에 설정된 DNS 서버(local DNS)에게 도메인 네임과 일치하는 ip 주소가 무엇인지를 묻는 DNS 질의를 시작한다.
만약 local DNS 서버가 질의에 대한 ip 주소 정보를 가지고 있을 경우 바로 local DNS 서버는 클라이언트에게 해당 정보를 전달한다.
3. 재귀적 질의 과정
local DNS도 ip 주소를 가지고 있지 않다면, local DNS는 요청한 도메인 네임 구조에 기반한 DNS 질의를 시작한다.
우선 local DNS는 우선 Root DNS 서버에게 DNS 질의를 수행한다.
만약 Root DNS 서버가 ip 주소를 가지고 있지 않다면, 하위의 도메인(kr)에 대한 DNS 서버 주소를 전달한다.
이후 local DNS는 kr DNS 서버에게 DNS 질의를 수행한다.
만약 kr DNS 서버가 ip 주소를 가지고 있지 않다면, 하위의 도메인 (go)에 대한 DNS 서버 주소를 전달한다.
그다음 local DNS는 mnd DNS 서버에게 DNS 질의를 수행한다.
mnd DNS 서버는 mnd.go.kr에 대한 ip 주소를 가지고 있기 때문에, 이를 local DNS 서버에 저장한다.
local DNS 서버는 질의에 대한 결과를 캐싱한다. (다음번에도 동일한 요청이 왔을 경우 빠른 응답을 위함)
이후 클라이언트에게 질의 결과를 전달한다.
여기서 눈여겨볼 점은 DNS 서버의 구조는 계층적 구조를 가지고 있다는 점이다.
가장 최상위 Root DNS는 하위에 있는 TLD DNS 서버의 정보를 가지고 있으며, TLD DNS 서버는 그 하위에 있는 DNS 서버의 정보를 알고 있다.
즉 아래 그림과 같은 계층 구조를 가지고 있기 때문에, 위와 같은 DNS 질의 과정이 가능해진다.
3. 웹 배포 과정에서의 DNS
3.1. DNS 서버(네임 서버) 설정 확인
제작한 웹 페이지를 공개적으로 배포하고자 할 때, 외부로부터의 용이한 접근을 위해 도메인 네임을 사용할 수 있다.
도메인 네임을 사용하기 위해서는 사용하고자 하는 이름을 구입해야 한다.
구입을 위한 대표적인 사이트로는 가비아, GoDaddy, AWS의 Route53이 있다.
DNS 질의 과정에서 내가 소유한 도메인 네임 정보가 제대로 전달되기 위해서는, 당연히 도메인 네임 및 이에 대응하는 ip 주소가 특정 DNS 서버에 저장되어 있어야 한다.
이때 도메인 네임을 구입할 수 있는 곳에서는 보통 자체 DNS 서버도 함께 운영한다.
따라서 단순히 도메인 네임만 구입해도, 구입한 도메인 네임에 대한 정보가 자동으로 DNS 서버에 등록이 되기 때문에 매우 간편하다.
위의 그림은 실제로 구입한 도메인(gyro-pong.com)에 대한 정보이다.
가장 우측에 위치해 있는 '이름 서버'(NS라고 표현하기도 함) 항목이 바로 DNS 서버이다.
만약 특정 local DNS 서버가 gyro-pong.com에 대한 ip주소를 얻고자 할 경우, 네 개의 DNS 서버 중 하나에게 DNS 질의를 수행할 것이고, DNS 서버는 gyro-pong.com에 대한 질의 결과를 반환할 것이다.
만약 ip주소를 통한 접속은 문제없이 이루어지나, 도메인 네임을 통해서는 접속 자체가 되지 않을 경우가 발생할 수 있다.
이런 상황에서는 도메인 네임에 올바른 DNS 서버가 할당되었는지 점검할 필요성이 있다.
aws의 route53의 경우를 생각해 보면, 설정을 잘못하는 바람에 실제 호스팅된 DNS 서버 주소와, 도메인 네임에 적용된 DNS 서버 주소가 서로 일치하지 않을 수 있다.
이럴 경우 아무리 도메인 네임을 등록해도 외부에서 온 DNS 질의에 대해, 올바른 응답을 내려주지 못하기 때문에 접속이 되지 않는다.
3.2. DNS 레코드
이것 외에도 DNS 레코드라는 속성이 있다.
구입한 도메인 네임을 등록하는 과정에서 한 번쯤은 본 적이 있을 것이다.
그동안의 경험으로 비추어보았을 때, 많이 사용하는(볼 수 있었던) 속성은 A, CNAME, SOA, NS이다.
이것들이 무엇을 의미하는지 살펴보자.
1. A
IPv4의 IP 주소를 도메인 네임과 매핑할 때 사용하는 속성이다.
예를 들어 223.130.195.200이라는 IPv4의 IP 주소를 naver.com이라는 도메인 네임에 매핑하고 싶을 때 A 속성을 사용한다.
물론 하나의 도메인 네임에는 여러 개의 IP주소를 매핑할 수 있다.
즉 한 개의 도메인 네임은 여러 개의 A 레코드를 지정할 수 있음을 의미한다.
요청을 보내는 이용자의 수가 많아, 여러 개의 IP주소를 두어 요청을 분산시키고자 할 때 사용할 수 있다.
도메인 네임 | 값 |
naver.com | 223.130.195.200 |
naver.com | 223.130.200.104 |
naver.com | 223.130.200.107 |
naver.com | 223.130.195.95 |
2. AAAA
A 레코드의 IPv6 버전이다.
3. CNAME
도메인 네임에 대한 별칭을 지정할 때 사용한다.
대표적으로는 도메인 네임 앞에 www가 붙는 경우를 생각할 수 있다.
예를 들어 브라우저를 통해 네이버에 접속하기 위해서는 naver.com을 통해 접속할 수도 있지만, www.naver.com을 통해서도 접속할 수 있다.
여기서 www.naver.com이라는 주소는 naver.com이라는 주소의 별칭이다.
물론 앞에서 살펴본 것과 같이 www.naver.com 주소도 A 레코드를 통해 IP주소와 직접 매칭시키는 방법을 사용해도 된다.
하지만 만약 IP 주소가 종종 바뀔 가능성이 높은 환경이라면, IP주소가 매번 바뀔 때마다, A 레코드를 찾아가며 모든 값을 일일이 갱신해야 되며, 이런 과정이 매우 번거롭기도 하고 만약 갱신 과정에서 실수가 발생한다면, 유저는 특정 도메인 네임에 접속할 수 없게 된다.
따라서 특정 도메인 네임에 별칭을 두고자 할 경우에는 CNAME 속성을 부여하는 것이 바람직하다.
도메인 네임 | 타입 | 값 |
naver.com | A | 223.130.195.200 |
www.naver.com | CNAME | naver.com |
4. SOA
DNS 정보에 대한 메타 데이터를 담고 있다.
5. NS
앞서 살펴본 DNS 서버를 의미한다.
다른 이름으로 네임 서버라도고 표현하며 AWS에서는 이름 서버라는 용어를 사용하고 있다.
'General' 카테고리의 다른 글
웹 폰트 표시에 대해 (font-display) (0) | 2023.12.15 |
---|---|
Globs (0) | 2023.12.07 |
CRP (Critical Rendering Path) (0) | 2023.11.24 |
husky로 commit lint 사용하기 (0) | 2023.11.03 |
Semantic Version (SemVer) (1) | 2023.10.05 |