DNS(Domain Name System) 이해하기

2020. 11. 11. 19:55풀스택을 향하여 - 백엔드/기타

이 글은 아래의 영상을 바탕으로 작성되었습니다.

 

https://www.youtube.com/watch?v=zrqivQVj3JM&list=PLuHgQVnccGMCI75J-rC8yZSVGZq3gYsFp

 

우리는 흔히 DNS(Domain Name System) 을 IP 를 대신해서 입력할 수 있는 주소 정도로만 알고 있는 경우가 많습니다. 하지만, 실제로 웹앱을 배포하고 그것에 커스텀 도메인을 연결해야 할 때, 이 지식만으로는 많은 어려움에 부닥쳐야 할 것입니다. 제가 그랬으니까요...

 

저처럼 부족한 지식을 가지고 도메인을 만지작 거리다 곤란을 겪으신 분들을 위해 DNS 에 대해 제가 이해한 내용을 이 글을 통해 알려드리도록 하겠습니다.

 

 

 

IP 주소와 hosts

 

인터넷에 연결된 모든 컴퓨터 각각을 host 라고 칭합니다. host 들이 서로 통신하기 위해서는 서로에 대한 주소가 필요하고, 이것이 바로 IP Address(아이피 주소)입니다. 여기서 IP 는 Internet Protocol의 약자입니다. 하지만 IP 주소로 호스트간의 연결을 수행하는데에는 많은 불편이 따랐고, 이를 해결하기 위해 탄생한 것이 DNS(Domain Name System)입니다.

 

 

 

DNS 서버를 통한 통신

 

DNS의 핵심은 DNS 서버입니다. DNS 서버는 간단히 말해 IP 주소와 그 IP 주소와 한쌍으로 묶인 우리가 잘 알고 있는 'www.example.com' 형식의 문자를 지니고 있는 서버로, 접속을 요청하는 호스트는 바로 다른 호스트에 접속하는 것이 아니라 도메인 이름을 가지고 DNS Server 에 먼저 그 이름에 맞는 IP 주소를 요청하게 됩니다. DNS 서버가 이 요청에 응해서 IP 주소를 전해주는데 성공하면, 접속을 시도하는 호스트는 비로소 이 IP 주소를 바탕으로 다른 호스트에 접속할 수 있는 것입니다.

 

 

 

DNS서버를 이용하지 않는 통신

 

굳이 DNS 서버를 통하지 않더라도, DNS 서버를 통할 때와 똑같이 도메인 이름을 통해 다른 호스트와 통신할 수 있습니다. 모든 OS 는 hosts 라는 이름의 파일을 가지고 있고, 여기엔 DNS 서버와 마찬가지로 도메인 이름과 IP 주소의 쌍을 저장할 수 있습니다. 여기 알맞은 쌍을 저장했다면, 이제부터 도메인 이름을 통해 다른 호스트에 접속을 시도할 때, 컴퓨터는 자동으로 이 파일을 참조해서 접속을 시도할 것입니다. 왜냐하면 컴퓨터는 접속을 시도하기 전에 제일 먼저 이 호스트 파일을 참조해보기 때문입니다.

 

윈도우의 경우, 호스트 파일은 루트 경로의 System32\drivers\etc\hosts 에 위치해 있습니다.

 

 

 

Public DNS

 

DNS 서버도 결국에는 호스트이기 때문에, DNS 서버에 IP 정보를 요청하기 위해서는 DNS 서버들의 IP 를 접속을 시도하는 호스트가 알고 있어야 합니다. 하지만 이 IP 정보를 컴퓨터가 로컬로 저장하고 있지는 않고, ISP(Internet Service Provider) 라는 중개자를 통하게 됩니다. 이 ISP 는 저희가 흔히 알고 있는 SK 텔레콤, KT 등등의 통신사들을 말합니다. 이들이 제공하는 랜선, 혹은 와이파이 기계를 사용하면 그 ISP 가 설정해놓은 DNS 서버를 호스트가 쓰게 되는 것입니다. 하지만 이런 기본적인 방법에는 어떻게 보면 치명적인 문제가 있습니다. 바로 구조상 그 ISP 에게 나의 모든 접속 기록을 보여줄 수밖에 없다는 것입니다. 그래서 가끔은 ISP(통신사)가 제공하는 DNS 서버 주소를 이용하지 않고, 구글이나 클라우드 페어 등의 기업, 기관이 무료로 제공하는 Public DNS 를 사용하기도 합니다. 이를 위해서는 컴퓨터가 자동으로 ISP 가 지정한 주소로 접속하지 않고 바로 Public DNS 서버의 IP 주소로 접속하도록 내부적인 설정이 필요합니다.

 

 

 

도메인 이름의 구조

 

DNS 는 어떻게 보면 당연하지만, 단 한개의 DNS 서버로 이루어지지 않습니다. 하지만 단순히 DNS 서버가 여러대일 뿐만 아니라, 계층적으로 이루어져 있다는 사실은 잘 모르기 쉽습니다. DNS 서버들은 root → top-level → second-level → sub 도메인 서버의 순서로 호스트가 요청한 DNS 이름의 IP 가 뭔지를 추적해나갑니다. 각각의 DNS 서버는 다음 계층의 DNS 서버들에 대한 IP 주소만을 가지고 있기 때문입니다. 결국 호스트가 가장 처음 접속하게 되는 DNS 서버의 IP 주소는 모두 root DNS 서버의 주소인 것입니다. 도메인 이름의 '.' 을 통한 구분은 사실 이러한 구조를 드러냅니다.

참고로, 전 세계의 root DNS 서버는 총 13대 입니다.

 

 

(잘 모르기 쉬운 사실입니다만, 모든 도메인 뒤에는 사실 '.'이 생략되어 있습니다. 이는 'root' 경로를 의미합니다)

 

 

 

도메인 등록

 

 

모든 전 세계의 루트 DNS 서버를 관리하는 기관은 'ICANN; 이라고 부르는 국제적인 비영리단체입니다. 이 ICANN 이 운영하는 등록소의 DNS 서버가 .com 과 같은 Top-level 도메인을 관리합니다. 그리고 도메인의 등록은 개인이 직접하는 것이 아니라 등록대행자를 통해서 할 수 있습니다. 등록대행자는 등록자로부터 수수료를 받고 등록소에 등록자가 원하는 도메인 이름을 해당 등록자가 소유하고 있다는 것을 명시합니다. 명시할 수 있는 기간에는 한계가 있으며, 이 계약이 끝날 때까지는 다른 사람은 해당 도메인 이름을 사용할 수 없습니다.

 

ICANN 이 관리하는 루트 네임서버(도메인 서버)들은 전 세계 Top-level 도메인 서버들의 주소를 가지고 있습니다. 이때, 중요한 것은 Top-level 도메인 서버에 바로 IP 주소를 등록할 수 없고, 개인이 직접 네임 서버(도메인 서버)를 마련해서 그곳에 IP 주소를 등록해야 합니다. 이러한 네임서버는 직접 구축하기 보다는 등록 대행자가 제공하는 네임서버를 이용하거나 public 네임 서버를 이용할 수도 있습니다. Top-level 도메인 서버에는 이 네임 서버의 주소를 담는 것입니다.

 

 

이를 위해서 등록자는 등록대행자에게 본인이 사용하는 네임서버의 IP 를 보내서 등록대행자가 등록소의 top-level 도메인 서버에 해당 IP 를 저장하게 만듭니다.

 

등록자는 본인의 네임서버에 도메인 이름과 본인 IP 의 쌍을 저장합니다. 이때 이 IP 를 'A' (Address) 라고 칭하여 저장합니다. 그리고 top-level 도메인 서버에는 등록자의 네임서버 주소를 'NS(Name Server)' 라고 칭하여 저장합니다. root 도메인 서버도 top-level 서버의 주소를 'NS'라고 칭합니다. 이런 식의 'A', 'NS' 를, 레코드 타입이라고 부릅니다.

 

 

 

도메인을 통한 접속 과정 개괄

 

 

저번에도 말했듯 ISP 가 제공하는 랜선이나 와이파이를 사용하게 되면 호스트의 컴퓨터에는 자동으로 바로 접근할 수 있는 네임서버의 IP 가 저장됩니다. 모든 네임 서버들은 루트 네임 서버의 주소를 알고 있으므로, 호스트가 해당 네임서버로 접근하면 그 네임서버는 바로 루트 네임 서버에 도메인 이름과 매칭되는 IP 주소를 물어봅니다.

루트 네임서버는 당연히 정확한 주소는 모르지만, 도메인 이름 중 .com 과 같은 부분을 통해 어떤 top-level 도메인 서버가 그 정보를 알고 있을만한지를 알아내서 요청을 한 네임서버에 보내줍니다. top-level 네임 서버 또한 유사한 일을 수행하고, A 레코드에 적힌 IP 주소를 요청을 보낸 네임서버에 보내줍니다. 이제 네임서버는 우리 컴퓨터에 그 IP 주소를 그대로 전해주고, 호스트는 이 IP 를 통해서 해당 호스트에 접근할 수 있습니다.

 

 

 

DNS record 와 CNAME

A 레코드는 이전에 말했듯, 호스트 컴퓨터의 IP 주소를 담는 레코드이며 이를 통해 DNS 이름과 해당 IP 가 연결됩니다. 하지만 해당 도메인과 연결된 IP 주소가 너무 자주 바뀐다거나 그 IP 주소와 연결된 도메인 이름이 너무 많을 경우, IP 를 하나하나 다 바꿔주기엔 너무 귀찮은 일이 될 것이기에, 지정한 DNS 와 연결되어 동작하는 Alias DNS 이름으로서 CNAME 을 등록해서 사용할 수 있습니다. 이러면 A 레코드의 IP 가 변경되어도 그를 가리키는 다른 도메인 이름들의 IP 도 같이 변경된 것과 같을 것입니다.

 

 

 

외부 호스팅 서비스에서 나의 도메인을 사용하기

외부 호스팅 서비스를 이용하는 경우, 해당 업체가 제공하는 접속용 URL을 받을 수 있지만 이는 실제 서비스 배포에 사용하기엔 간결하지 못하고, 비전문적인 인상을 줄 수 있다는 문제점이 있습니다. 때문에 이 경우를 위해 도메인 대여 대행업체에 이용자가 구매한 도메인으로 접속을 수행하면 호스팅 서비스로부터 제공받은 URL 로 다시 연결되도록 '포워딩'을 수행할 수 있습니다.

 

하지만 가장 좋은 방법은 역시 외부 호스팅 서버에 이용자가 구매한 커스텀 도메인의 이름을 알려주는 것입니다. 이렇게 하면 해당 호스팅 업체의 컴퓨터는 자신이 모르는 도메인을 통해서 접속이 이루어졌다는 것을 알고 접근을 막는 것이 아니라 접속을 허용해줍니다.