본문 바로가기

웹 개발

DNS(Domain Name System)

DNS

DNS란

Domain Name System의 약자로 도메인 이름을 기계가 읽을 수 있는 IP 주소로 변환하여 최종적으로 해당 IP 주소의 서버에 접근할 수 있게하는 시스템을 말한다.

사용자가 웹 사이트 서버에 이르기위해 인터넷상의 모든 컴퓨터는 인터넷 프로토콜(IP) 주소를 통해 서로를 찾고 통신한다. DNS로 사용자는 웹 사이트로 이동할 때 그러한 IP주소를 입력할 필요는 없고 google.com과 같은 도메인 이름을 입력하여 이동할 수가 있다.

DNS는 이름과 숫자간의 매핑을 관리하여 마치 전화번호부와 같은 기능을 한다. DNS 서버는 도메인 이름에 대한 요청을 IP주소로 변환하여 최종 사용자가 도메인 이름을 웹 브라우저에 입력할 때 해당 사용자를 어떤 서버에 연결할 것인지 제어한다. 이를 쿼리라고한다.

DNS 서버 유형

권한있는 DNS 서버(Authoritative DNS Server)

실제로 DNS 리소스 레코드를 보유하고 있는 서버를 말한다. 이 서버는 DNS 조회 체인의 마지막에 있는 서버로 최종적으로 웹 브라우저가 웹사이트에 액세스하는데 필요한 IP 주소에 도달하도록 요청할 수 있게한다.

재귀적 DNS 서버(Recursive DNS Server)

클라이언트는 신뢰할 수 있는 DNS에 직접 쿼리를 수행하지 않는다. 해석기(Resolver) 또는 재귀적 DNS 라고 알려진 다른 유형의 DNS 에 연결하는 경우가 일반적이다. DNS 레코드를 소유하고 있지 않지만 사용자를 대신해서 DNS 정보를 가져오는 중간자의 역할을 한다. 재귀적 DNS가 일정기간 동안 캐시되거나 저장된 DNS 레퍼런스를 가지고있을 경우 소스 또는 IP 정보를 반환한다. 그렇지 않으면 해당 정보를 찾기 위해 쿼리를 하나 이상의 신뢰할 수 있는 DNS 서버에 전달한다.

DNS 루트 네임서버(Root DNS Server)

재귀 확인자가 DNS 레코드를 요청하는 첫단계이다. 루트 서버는 도메인 이름을 포함한 재귀 확인자의 쿼리를 수용하고 루트 네임 서버는 해당 도메인의 확장자에 따라 재귀 확인자(.com .net)를 TLD 네임 서버로 보내 응답한다. 루트 네임서버는 ICANN(Internet Corporation for Assigned Names and Numbers)이 관리한다.

루트 네임서버는 13개가 있는데, 13가지 유형의 루트 네임서버가 있지만 전 세계에 각각의 사본이 다수 있고 Anycast 라우팅을 사용하여 빠른 응답을 제공한다.

TLD 네임서버(TLD Dns Server)

.com, .net 또는 URL 마지막 점 뒤에 오는 것 같은 일반적인 도메인 확장자를 공유하는 모든 도메인 이름의 정보를 유지한다. 예를 들어 TLD 네임서버가 '.com'으로 끝나는 모든 웹사이트 정보를 가지고 있는 것이다. TLD 네임서버는 ICANN의 지사인 IANA(Internet Assigned Numbers Authority)가 관리한다.

IANA는 TLD 서버를 두가지로 구분한다.

  • 일반 최상위 도메인: .com, .org, .net, .edu, .gov등 국가별로 고유하지 않은 도메인
  • 국가 코드 최상위 도메인: 여기에는 국가 또는 주와 관련된 모든 도메인이 포함된다. .uk. us .ru .jp가 포함된다.

DNS 쿼리 유형

재귀 쿼리

확인자가 레코드를 찾을 수 없는 경우, DNS 클라이언트는 DNS 서버(DNS 재귀 확인자)가 요청한 자원 레코드 또는 오류 메시지를 사용하여 클라이언트에 응답하도록 요구한다.

반복 쿼리

DNS 클라이언트는 DNS 서버가 가능한 최상의 응답을 반환하도록한다. DNS 서버가 쿼리 이름과 일치하는 이름을 가지고 있지 않은 경우, 하위 수준의 도메인 네임스페이스에 대해 권한 있는 DNS 서버에 대한 참조를 반환한다. 그러면 DNS 클라이언트가 참조 주소를 쿼리한다. 이 프로세스는 오류 또는 제한 시간 초과가 발생할 때까지 추가 DNS 서버가 쿼리 체인을 중단한 상태로 계속된다.

비재귀 쿼리

DNS 확인자 클라이언트의 쿼리를 받은 DNS 서버가 해당 레코드에 대한 권한이 있거나 캐시 내부에 해당 레코드를 갖고 있어, DNS 서버가 액세스 권한을 갖고 있는 레코드를 쿼리할 때 발생한다. DNS 서버는 추가 대역폭 소비 및 업스트림 서버의 부하를 방지하기 위해 DNS 레코드를 캐시한다.

DNS 캐싱

캐싱은 데이터를 임시 저장하여 데이터 요청에 대해 성능과 신뢰성을 높인다. DNS 쿼리를 조기에 확인할 수 있고 DNS 조회 체인의 추가 쿼리를 피할 수 있어서 로드 시간이 향상되고 대역폭/CPU 소비가 줄어든다.

브라우저 DNS 캐싱

웹 브라우저가 정해진 시간 동안 DNS 레코드를 캐시하도록 되어있다.

OS 수준 DNS 캐싱

DNS 쿼리가 컴퓨터를 떠나기 전의 두번째 중단점이고, 로컬에 있는 마지막 중단점이다. 이 쿼리를 처리하도록 설계된 운영 체제 내부의 프로세스를 "스텁 확인자"또는 DNS 클라이언트라고 한다. 스텁 확인자는 애플리케이션에서 요청을 받으면 먼저 자체 캐시를 검사하여 레코드가 있는지 확인한다. 레코드가 없으면 로컬 네트워크 외부의 DNS 쿼리를 인터넷 서비스 공급자(ISP) 내부의 DNS 재귀 확인자로 보낸다.

ISP 내부의 재귀 확인자가 모든 이전 단계와 같이 DNS 쿼리를 수신하면, 요청한 호스트-IP-주소변환이 로컬 지속성 계층 내에 이미 저장되어 있는지 확인한다.

레코드 유형에 따른 추가 기능

  1. 확인자가 A레코드(A는 주소를 말한다, 레코드에는 IPv4 주소만 보유한다.)는 갖고 있지 않지만, 신뢰할 수 있는 서버에 대한 NS(네임서버, 어던 DNS가 해당 도메인의 신뢰할 수 있는 네임서버인지를 지시) 레코드를 갖고 있는 경우, DNS 쿼리의 여러 단계를 거치지 않고 해당 이름 서버를 직접 쿼리한다.
  2. 확인자에 NS 레코드가 없는 경우, 루트 서버를 건너뛰고 TLD 서버로 쿼리를 보낸다.
  3. 확인자에 TLD 서버를 가리키는 레코드가 없는 경우, 루트 서버를 쿼리한다.

DNS 라우팅 과정

![DNS](https://user-images.githubusercontent.com/37204770/135119048-20fdbccb-b08e-45d1-bf5a-209007a54fc5.jpg)

  1. 사용자가 브라우저 주소 표시줄에 www.example.com을 입력한다
  2. 도메인 이름의 요청은 케이블 인터넷 업체, DSL 광대역 공급 업체 등 인터넷 서비스 제공업체(ISP)가 관리하는 DNS 해석기로 라우팅된다.
  3. ISP의 DNS 해석기는 www.example.com에 대한 요청을 DNS 루트 이름 서버에 전달한다.
  4. ISP의 DNS 해석기는 www.example.com에 대한 요청을 .com 도메인의 TLD 이름 서버 중 하나로 이동하라고 전달한다
  5. TLD 서버로 example.com 을 요청한다.
  6. 해당 도메인의 주소를 가지고있는 적절한 Authorative DNS 서버를 알려준다. (AWS 등, 호스팅 서버가 대표적)
  7. ISP의 DNS 해석기가 사용자에게 필요한 IP 주소를 확보하게 된다. DNS 해석기는 다음에 누군가가 example.com을 탐색할 때 더 빠르게 응답할 수 있도록 사용자가 지정하는 일정 기간 동안 example.com의 IP 주소를 캐싱한다.(Time To Live, TTL 참고)
  8. 웹브라우저가 IP 주소를 얻는다
  9. 웹 브라우저는 DNS 해석기로부터 얻은 IP 주소로 www.example.com에 대한 요청을 전송한다.
  10. 123.123.123.123에 있는 웹 서버 또는 그 밖의 리소스는 www.example.com의 웹 페이지를 웹 브라우저로 반환하고 웹 브라우저가 이 페이지를 표시한다.

출처

[DNS란 무엇입니까? – DNS 소개 - AWS (amazon.com)](https://aws.amazon.com/ko/route53/what-is-dns/)

[DNS란 무엇입니까? \| DNS 작동 방식 \| Cloudflare](https://www.cloudflare.com/ko-kr/learning/dns/what-is-dns/)

[DNS란 뭐고, 네임서버란 뭔지 개념정리 \| 살살살림 (gentlysallim.com)](https://gentlysallim.com/dns%EB%9E%80-%EB%AD%90%EA%B3%A0-%EB%84%A4%EC%9E%84%EC%84%9C%EB%B2%84%EB%9E%80-%EB%AD%94%EC%A7%80-%EA%B0%9C%EB%85%90%EC%A0%95%EB%A6%AC/)

'웹 개발' 카테고리의 다른 글

자바 디자인 패턴 - 싱글턴 패턴  (0) 2021.10.05
Post와 Put의 차이  (0) 2021.10.05
객체지향 SOLID 원칙  (0) 2021.08.27
객체지향 원리  (0) 2021.08.26
자바 가상 머신(Java Virtual Machine, JVM)  (0) 2021.07.25