각 조직을 구분해주는 도메인 이름을 관리하는 DNS 서버들이 모여서 만들어 낸 가상 이름 공간 - TCP/IP 네트워크 서비스
네트워크 프로토콜
DNS → 도메인 주소를 IP 주소로 변환하는 역할
인프라 변경 증가, MSA 기반의 설계로 다수의 API 사용 증가
IP 주소로 접근하거나 도메인 주소를 접근하거나 둘다 동일한 IP 주소를 이용한다.
12자리의 IP 주소를 외우는 것은 너무 불편하다 → 의미있는 문자열로 구성된 도메인 주소 사용
도메인 주소의 장점
사용자가 서비스를 찾아갈 때뿐만 아니라 내부 시스템의 서비스 간 연결에도 DNS를 사용한다. → 서비스 간 연결에 도메인 주소를 사용하면 DNS 서버에서 간단한 설정 변경만으로 복잡한 서비스 간 연결을 쉽게 변경할 수 있다.
도메인은 계층 구조여서 수많은 인터넷 주소 중 원하는 주소를 효율적으로 찾아갈 수 있다. 하위 레벨로 원하는 주소를 단계적으로 찾아간다. (역트리 구조)
도메인의 주소를 사용할 때는 각 계층의 경계를 “.”으로 표시하고 뒤에서 앞으로 해석한다.
Third.second.com(.) → 맨 뒤의 루트는 생략
→ .를 시작으로 com → second → third로 뒤에서 앞으로 해석된다.
→ 도메인 계층은 최대 128계층까지 구성할 수 있다.
→ 계층별 길이는 최대 63 바이트까지 사용할 수 있다.
→ 구분자를 포함한 최대 길이는 255바이트이다.
→ 문자는 숫자, 알파벳, ‘-’만 사용할 수 있고, 대소문자 구분이 없다.
DNS 서버는 사용자가 쿼리한 도메인에 대한 값을 직접 갖고 있거나 캐시에 저장된 정보를 이용해 응답한다.
만약 DNS 서버에 해당 도메인의 정보가 없으면 루트 도메인을 관리하는 루트 DNS에 쿼리하게 된다.
루트 DNS는 전세계 13개가 있고 DNS 서버를 설치하면 루트 DNS IP 주소를 기록한 파일을 가지고 있어 루트 DNS 관련 별도 설정 필요가 없다.
👉 DNS 쿼리 흐름
1. 기본적으로 설정된 DNS 서버가 있다. (= 로컬 DNS 서버)
2. DNS 서버에 도메인 정보 요청 (도메인 주소 → IP 주소 변환)
- 로컬 DNS 서버에 도메인 정보가 있을 때 → 해당 정보를 바로 응답(빠름)
- 로컬 DNS 서버에 도메인 정보가 없을 때 → 상위 DNS 서버(주로 권한이 있는 DNS 서버 or TLD DNS 서버) 에 쿼리를 보낸다.
- TLD(Top-Level-Domain) DNS 서버도 해당 정보를 모른다면 루트 DNS 서버에 쿼리를 보낸다.
최상위 도메인 TLD는 IANA(Internet Assigned Numbers Authority)에서 구분한 6가지 유형으로 구분할 수 있다.
DNS를 사용하려면 DNS 서버에 쿼리해야하지만 로컬에서 도메인 IP 주소를 관리하는 hosts 파일에 도메인과 IP 주소를 설정해두면 해당 도메인 리스트는 항상 DNS 캐시에 저장된다.
사용자의 요청
DNS 캐시 정보를 먼저 확인( 동적 DNS 캐시 + hosts 파일 저장 정보)
캐시에 없다면 DNS 서버에 쿼리
응답을 받으면 결과를 캐시에 먼저 저장
👉🏻
왜 사용자 응답보다 캐시에 먼저 저장하는가?
- 성능 최적화: DNS 서버는 도메인에 대한 정보를 재사용할 수 있게끔 캐시에 저장하여 반복된 요청에 대해 빠르게 처리할 수 있다. 캐시를 통해 응답 시간을 단축하고 네트워크 부하를 줄인다.
- TTL: DNS 응답에는 TTL 값이 포함되어 있으며 이 TTL 값은 해당 정보가 캐시에서 유효한 시간을 정의한다.
[DNS 시스템 관점에서 도메인에 대한 결괏값을 클라이언트에게 보내주는 과정]
DNS는 분산된 데이터베이스로 서로 도와주도록 설계되었다.
→ 자신이 가진 도메인 정보가 아니면 다른 DNS에 질의해 결과를 받을 수 있다.
DNS 기능을 서버에 올리면 DNS 서버는 기본적으로 루트 DNS 관련 정보를 가진다. → 클라이언트 쿼리가 자신에게 없는 정보라면 루트 DNS에 쿼리한다.
→ 루트 DNS에서는 쿼리한 도메인의 TLD 값을 확인해 해당 TLD 값을 관리하는 DNS가 어디인지 응답한다.
⇒ 클라이언트에서 처음 질의를 받은 DNS가 중심이 되어 책임지고 루트 DNS부터 상위 DNS에 차근차근 쿼리를 보내 결과값을 알아낸 후 최종 결과값만 클라이언트에 응답한다.