SY 개발일지
article thumbnail

DNS란 ?

DNS에 대해서 알기 위해 먼저 전화번호부를 생각해봅시다.

누군가의 전화번호를 저장하기 위해 해당 번호를 저장했다고 생각해봅시다.

전화번호만 알고 있다면 이 전화번호가 누구 껀지, 그리고 해당 번호를 항상 외우고 있어야 합니다.

하지만 이 번호가 무수하다면 ?

이를 다 외우고 있기엔 사실상 불가능할 것입니다.

 

그래서, 우리는 이름을 매핑해줍니다.

그러면, 우리는 해당 이름만을 가지고 그 사람의 전화번호를 얻을 수 있습니다.


도메인 이름 시스템(Domain Name System, DNS)란, 사람이 읽을 수 있는 도메인 이름(예: www.naver.com)을 머신이 읽을 수 있는 IP 주소(예: 192.0.2.44)로 변환해주는 서비스를 말합니다.

https://www.youtube.com/watch?v=sDXcLyrn6gU

DNS은 전세계적으로 약속된 규칙을 공유하는데, 상위 기관에서 인증된 기관에게 도메인을 생성하거나 IP 주소로 변경할 수 있는 권한을 부여합니다. 이처럼 DNS는 상위기관과 하위기관과 같은 계층구조를 가지는 분산 데이터구조를 가집니다.

도메인이름? IP주소?
도메인 이름이란 IP 주소에 매핑되는 텍스트 문자열로, 사용자가 특정 웹 사이트로 도달하기 위해 브라우저창에 입력하는 텍스트입니다.
예를 들어 Google의 도메인 이름은 'google.com'입니다.

IP주소란 네트워크 환경에서 통신에서 인터넷 프로토콜을 사용하여 컴퓨터 네트워크 내에서 상호 연결된 각 장치에 지정된 숫자 레이블을 의미합니다. 예를 들어 192.0.2.44 등이 IP 주소에 해당합니다.
DNS는 왜 계층구조를 가지는 분산 데이터 베이스 구조를 가질까요 ?
우선, 안정성의 이유가 있습니다. DNS 트래픽 중에서 URL(예를 들어 naver.com 등)에 대한 질의 자체는 부하가 크지 않습니다. 하지만 응답이 없다면, 해당 URL에 접속하지 못하는 사태가 발생하게 됩니다. 실제로 KT에서 DNS에 이상이 생겨 KT 사용자의 대부분이 인터넷 접속이 차단되는 사태가 벌어지기도 하였습니다. (뉴스링크)
그러면 여러 서버(네임 서버)를 만들면 되지 않을까라는 생각도 할 수도 있습니다. 하지만, 그렇게 되면 해당 정보(도메인과 IP주소)를 모든 서버에서 공유해야 합니다. 이는 자원의 낭비로 이어질 수도 있습니다.
그래서 도메인을 계층적으로 구분하여 정보를 분산하는 구조를 선택하게 되었습니다.
예를들어, soyeonnnb.tistory.com이 있다면, 닷(dot, '.') 기준으로 계층이 나누어집니다.

 

인터넷 DNS 시스템은 이름과 숫자 간의 매핑을 관리하여 앞에서 예시로 들었던 전화번호부와 같은 기능을 합니다. 마치 이름이 도메인이름이고, 전화번화 IP주소가 되는 것이죠. DNS 서버는 이름을 IP 주소로 변환하여 도메인 이름을 웹 브라우저에 입력할 때 최종 사용자를 어떤 서버에 연결할 것인지 제어합니다. 이 요청을 쿼리라고 합니다.

DNS의 구성 요소

DNS는 크게 3가지로 분류할 수 있습니다.

✅ 도메인 네임 스페이스(Domain Name Space): DNS가 저장 관리하는 계층적 구조. 

✅ 네임 서버(Name Server): 권한 있는 DNS 서버

✅ 리졸버(Resolver): 권한 없는 DNS 서버

 

DNS는 "이 도메인은 이 IP주소이다"라는 텍스트를 저장하는 데이터베이스가 필요합니다.

또한, DNS는 계층적으로 구분하는, 정보(도메인과 IP주소)를 분산하는 구조로 이루어져있기 때문에 분산된 데이터가 어디 저장되어 있는지 찾을 프로그램과 해당 IP로 이동할 프로그램(브라우저 등)이 필요합니다.

 

도메인 네임 스페이스라는 규칙(방법)으로 도메인 이름을 분산합니다.

네임 서버(DNS 서버와 같은 말이지만, 리졸버 서버 등 시스템 안에서 다른 역할을 하는 서버들이 존재하여, 그냥 DNS 서버라고 하는 것보다 의미 전달이 더 잘 됩니다.)가 해당 도메인 이름과 매칭되는 IP주소를 찾습니다.

리졸버가 DNS 클라이언트 요청을 네임 서버로 전달하고 찾은 정보를 클라이언트에게 제공하는 기능을 수행합니다.

 

그렇다면 DNS의 구성 요소를 하나씩 살펴보도록 하겠습니다.

 

도메인 네임 스페이스

https://velog.io/@zinukk/9kpyzbdt

DNS는 최상위에 루트 DNS 서버가 존재하고 그 하위로 연결된 모든 노드가 연속해서 이어진 계층 구조로 되어 있습니다. 폴더 구조와 흡사합니다.

 

계층적 도메인 레벨(Hierarchical Domain Level)

도메인 네임 스페이스는 일반적으로 트리 구조로 되어 있으며, 최상위 레벨부터 순차적으로 계층적 소속 관계를 나타냅니다.

하위 조직의 네임 스페이스를 할당하고 관리하는 방식은 각 하위 기관의 관리 책임자에게 위임됩니다.

 

예를 들어 soyeonnnb.tistory.com 이라는 도메인은 com 도메인을 관리하는 네임 서버에 등록되어 있고, soyeonnnb.tistory.com은 tistory.com 을 관리하는 네임 서버에 등록되어 관리됩니다.

 

Fully Qualified Domain Name(FQDN) 전체 도메인 이름

일반적으로 도메인 이름은 www.naver.com  에서 naver.com을 의미하기 때문에 이러한 용어가 나오게 되었습니다.

✅ 도메인 이름: naver.com

  호스트 이름: www

  FQDN: www.naver.com

 

네임 서버(Name Server = DNS Server)

문자열로 표현된 도메인 이름을 실제 컴퓨터가 통신할 때 사용하는 IP 주소로 변환시키기 위해서는 도메인 네임 스페이스의 트리 구조에 대한 정보가 필요합니다. 이러한 정보를 가지고 있는 서버를 네임 서버라고 합니다.

 

일반적으로 데이터베이스의 역할(저장, 관리)과 도메인을 찾아주는 역할, 요청을 처리하고 응답을 구현하는 역할을 수행합니다.

 

전세계에 13개의 Root DNS 서버가 구축되어 있으며, 이 네임 서버를 복사하여 같은 기능을 담당하는 미러 서버가 존재합니다.

 

네임 서버는 총 4가지로 분류할 수 있습니다.

1️⃣ Root DNS Server

DNS 서버의 최상위 네임서버로 DNS 해석부터 발생한 DNS 요쳥에 대해 적절한 TLD 네임서버 정보를 반환합니다.

 

2️⃣ Top-Level Domain(TLD) DNS Server

도메인 등록 기관이 관리하는 서버로 Authoritative DNS 서버의 주소를 저장하고 안내하는 역할을 합니다.

도메인 판매 업체(가비아 등)의 DNS 설정이 변경되면 도메인 등록 기관으로 전달되기 때문에 어떤 도메인이 어떤 판매업체(가비아 등) 에서 구매했는지 알 수 있습니다.

 

3️⃣ Second-Level Domain(SLD) DNS Server(Authoritative DNS Server)

실제 개인 도메인과 IP주소의 관계가 기록(저장, 변경)되는 서버입니다.(개인 DNS 구축도 이 경우에 해당합니다.)

그래서 권한의 의미인 Authoritative가 붙었으며 일반적으로 도메인/호스팅 업체의 네임서버를 의미합니다.

 

4️⃣ Anauthoritative DNS Server

권한이 없는 DNS 서버로, 리졸버 서버, 리컬시브 서버, 리커서가 있습니다.

 

DNS 서버는 도메인 네임 스페이스를 위한 권한 있는 DNS 서버와 권한이 없는 DNS 서버로 구분됩니다.

위 1,2,3은 권한 있는 DNS 서버(Authoritative DNS Server)입니다. 네임 스페이스를 위한 권한 있는 DNS 서버는 IP 주소와 도메인 이름을 매핑합니다.

하지만 네임 스페이스를 위한 권한 없는 DNS 서버는 질의를 통해 IP 주소를 알아내거나 캐시하게 됩니다(리졸버의 역할).

 

✔ 네임 스페이스를 위한 권한이 있는 DNS 서버: 요청된 IP 주소를 응답

네임 스페이스를 위한 권한이 없는 DNS 서버: 캐시 정보 확인, 전달자 이용, 루트 힌트를 이용

 

DNS Resovler

DNS Resolver는 사용자의 컴퓨터나 네트워크에 위치한 DNS 클라이언트입니다.

사용자가 도메인 이름을 입력하면 해당 도메인 이름을 IP 주소로 변환하기 위해 DNS 서버에 요청하여 질문하는 역할을 합니다.

https://velog.io/@zinukk/9kpyzbdt

DNS 서버에 요청하여 조회한다는 것은 DNS 서버에 요청을 하고 응답을 받았다는 것을 의미합니다.

 

이를 리졸버가 어떤 네임 서버에서 찾아야 하는지, 혹은 이미 캐시가 되어있는지 등을 찾아 클라이언트에게 결과값을 전달하는 역할을 수행하게 됩니다. 여기서 결과값은 찾은 IP 주소일 수도 있고, 혹은 찾지 못했다는 응답일 수도 있습니다.

 

대표적으로 KT, LG 유플러스, SK 브로드밴드 등의 ISP(통신사) DNS가 존재하고, 브라우저 우회 용도로 많이 사용되는 구글 DNS, 클라우드플레어와 같은 Public DNS 서버가 있습니다.

 

따라서 Resolver = Recursive DNS Server = Local Server(of ISP) = Recursor라고 이해하면 될 것 같습니다.

 

DNS 동작 방식

https://velog.io/@ajm0718/DNS%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

1️⃣ 도메인 이름 조회 요청(브라우저 → DNS Resolver)

사용자가 브라우저를 통해 도메인 이름을 입력하면, 컴퓨터는 DNS에게 해당 도메인 이름에 대한 IP 주소를 요청합니다.

 

2️⃣ 로컬 DNS 캐시 검색

컴퓨터의 운영체제 또는 라우터에게 로컬 DNS 캐시라고 불리는 기억 공간이 있습니다. 이 공간에 이전에 접근한 도메인 이름과 해당 도메인의 IP 주소가 저장되어 있습니다. 우선 로컬 DNS 캐시에서 해당 도메인 이름에 대한 IP 주소를 검색합니다.

만약 캐시에 저장된 IP 주소가 있다면 DNS Resolver는 해당 IP주소를 반환합니다.

 

3️⃣ DNS 계층 구조 탐색

로컬 DNS 캐시에 도메인 이름에 대한 IP 주소가 없는 경우, DNS 서버들을 탐색합니다. 이러한 DNS 서버는 계층적으로 구성되어 있으며, 최상위 DNS 서버로부터 순차적으로 탐색합니다.

먼저 DNS Resolver는 Root DNS Server에 요청합니다. Root DNS Server는 전 세계에 13개가 존재하며, 각각의 Root DNS Server는 모든 도메인 이름에 대한 IP 주소를 가지고 있지는 않습니다. 대신 Root DNS Server는 TLD DNS Server에 대한 정보를 가지고 있으며, 해당 TLD DNS Server의 IP 주소를 DNS Resolver에게 전달합니다.

 

4️⃣ DNS 서버 탐색

DNS 서버는 도메인 이름의 일부 또는 전체에 대한 IP 주소 정보를 가지고 있습니다. 로컬 DNS 캐시에 해당 정보가 없는 경우, DNS 서버에 요청을 전달하여 도메인 이름에 대한 IP 주소를 조회합니다.

예를 들어, 사용자가 입력한 도메인 이름이 "example.com"이라면, DNS Resolver는 .com TLD DNS Server에 요청합니다.

TLD DNS Server는 해당 도메인 이름의 Authoritative DNS Server의 IP 주소를 DNS Resolver에게 반환합니다.

 

5️⃣ IP 주소 반환

DNS 서버가 도메인 이름에 대한 IP 주소를 찾으면, 이를 로컬 DNS 캐시에 저장하고 컴퓨터에게 반환합니다. 컴퓨터는 이 IP 주소를 사용하여 도메인에 접근하고 통신을 수행합니다.

 

DNS Query 란 ?

DNS Query란 사용자가 도메인 이름을 입력하고, IP 주소를 얻기 위해 DNS 서버에 보내는 요청을 말합니다.이 요청은 DNS Resolver가 사용자 컴퓨터에서 생성하고 DNS 서버에 전송합니다.

 

DNS Query는 DNS 서버에 보내지며, DNS 서버는 이를 처리하고 응답을 반환합니다. 이 응답에는 사용자가 요청한 정보(IP 주소 등)가 포함되는데, DNS Query와 DNS 응답은 일반적으로 UDP(User Datagram Protocol)를 사용하여 전송됩니다.

DNS Query의 결과는 DNS Resolver에게 반환되는데 이를 통해 DNS Resolver는 사용자에게 도메인 이름에 대한 IP 주소를 반환하거나, 이를 찾을 수 없을 경우 에러를 반환합니다.

 

DNS 쿼리는 Recursive(재귀적) 또는 Iterative(반복적)으로 구분됩니다.

 

 Recursive Query

https://threat.media/definition/what-is-an-iterative-dns-query/

재귀적 질의라고도 하며, 결과물(IP 주소)를 돌려주는 작업입니다. 즉, 결과적으로 Recursive 서버가 Recursive 쿼리를 웹 브라우저 등에게 돌려주는 역할을 합니다.

 

Recursive 쿼리를 받은 Recursive 서버는 반복적으로(Iterative 하게) 권한 있는 네임 서버로 Iterative 쿼리를 보내 결과적으로 IP 주소를 찾게 되고 해당 결과물을 응답합니다.

 

즉, 응답을 돌려주는 쿼리라고 생각하면 될 것 같습니다.

 

Iterative Query

https://threat.media/definition/what-is-an-iterative-dns-query/

반복적 질의라고도 하며, Recursive DNS 서버가 다른 DNS 서버에게 쿼리를 보내어 응답을 요청하는 작업입니다.

Recursive 서버가 권한 있는 네임 서버들에게 반복적으로 쿼리를 보내서 결과물(IP 주소)를 알아냅니다. 만약 Recursive 서버에 이미 IP 주소가 캐시 되어있다면 이 과정은 건너뛰게 됩니다.

 

Recursive Query vs Iterative Query

재귀적 질의와 반복적 질의의 가장 중요한 차이점은 캐싱보안이라고 할 수 있습니다.

 

1️⃣ 캐싱

반복적 질의에서 Local DNS Server는 다른 DNS 서버와 직접적으로 통신을 하므로 여러 항목을 캐싱하여 저장할 수 있습니다.

하지만 재귀적 질의에서는 도메인 이름과 해당 IP 주소만 캐시됩니다.

 

2️⃣ 보안

재귀적 질의는 요청을 다른 DNS 서버로 전달하는 데에 의존하여 서비스 거부(DoS), 중간자(MitM) 및 기타 유사한 공격에 더 취약합니다. 만일 응답을 보내는 데에 사용되는 서버 중 하나가 손상되면 악의적인 응답을 보내는 데에 사용될 수 있습니다.

서비스 거부(DoS) 공격이란 ?
서비스 거부(DoS) 공격은 사이버 공격의 한 유형으로, 악의적인 행위자가 장치의 정상적인 작동을 방해하여 컴퓨터 또는 기타 장치를 사용하려는 사용자가 해당 장치를 사용할 수 없게 만드는 것을 목표로 합니다. DoS 공격은 일반적으로 정상적인 트래픽을 처리할 수 없을 때까지 대상 시스템을 요청으로 압도하거나 폭주시켜 추가 사용자에 대한 서비스 거부를 초래하는 방식으로 작동합니다. DoS 공격은 단일 컴퓨터를 사용하여 공격을 시작하는 것이 특징입니다.
중간자(MitM) 공격이란?
중간자 공격(MitM: Man In The Middle)은 공격자가 사용자의 인터넷 서버와 해당 인터넷 트래픽의 목적지 사이에 끼어들어 데이터 전송을 가로채는 공격입니다. 어떤 경우 2명의 사용자 사이에 끼어들기도 합니다. 특정 사용자가 애플리케이션이나 웹사이트를 사용해 다른 사용자에게 이메일이나 비밀번호 등의 중요 데이터를 전송하면, ‘중간자’가 데이터의 흐름을 조작하고 데이터를 가로채는 것입니다.
예를 들어 사이버 범죄자는 가짜 웹사이트에서 사용자의 로그인 정보를 탈취해 실제 웹사이트에 접속할 수 있으며, 이 경우 사용자의 비밀번호가 변경되거나 중요 금융 정보가 유출되거나 회사 네트워크 공격 등 추가적인 공격이 발생할 수 있습니다.

 

 

참고

profile

SY 개발일지

@SY 키키

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!