DNS(1)

이리·2025년 1월 6일
0
post-thumbnail

각 조직을 구분해주는 도메인 이름을 관리하는 DNS 서버들이 모여서 만들어 낸 가상 이름 공간 - TCP/IP 네트워크 서비스

네트워크 프로토콜

  • 데이터 프로토콜
  • 컨트롤 프로토콜: 처음 통신 관계를 맺거나 유지하는데 큰 역할(ARP, ICMP, DNS)

DNS → 도메인 주소를 IP 주소로 변환하는 역할

인프라 변경 증가, MSA 기반의 설계로 다수의 API 사용 증가

7.2.1 DNS 소개

IP 주소로 접근하거나 도메인 주소를 접근하거나 둘다 동일한 IP 주소를 이용한다.

12자리의 IP 주소를 외우는 것은 너무 불편하다 → 의미있는 문자열로 구성된 도메인 주소 사용

도메인 주소의 장점

  • 하나의 IP 주소를 이용해 여러 개의 웹 서비스를 운영할 수 있다.
    • IP → 203.0.113.1 가정
    • 하나의 IP 주소에 여러 도메인 이름을 연결할 수 있다.
    • 모든 서비스는 같은 IP 주소에 호스팅되지만, 도메인 이름을 통해 각 서비스를 구분할 수 있다.
    • 하나의 서버에서 여러 웹 서비스를 제공할 수 있기 때문에 리소스 낭비를 줄일 수 있다. (=가상 호스팅)
  • 서비스 중인 IP 주소가 변경되더라도 도메인 주소 그대로 유지해 접속 방법 변경이 없다.
  • 지리적으로 여러 위치에서 서비스 할 수 있다.
    • www.shop.com의 서버가 미국, 유럽, 아시아에서 동시에 운영될 경우(가정)
    • DNS는 사용자의 위치에 따라 가장 가까운 서버의 IP 주소로 유도할 수 있다.(GeoDNS, Anycast)
    • 서버의 위치가 사용자와 가까운 지역에 있을수록 응답 속도가 빨라지며 전세계 어디서나 안정적이고 빠른 서비스를 제공할 수 있다. → 지리적 분산을 통해 서비스의 가용성과 성능을 높일 수 있다.

DNS 작동 순서

  1. 사용자가 도메인 주소를 사용해서 서비스를 요청
  2. 네트워크 설정에 입력한 DNS로 해당 도메인에 대한 IP 주소 질의를 보냄
  3. 결과값으로 해당 도메인의 IP 주소를 받게됨.

사용자가 서비스를 찾아갈 때뿐만 아니라 내부 시스템의 서비스 간 연결에도 DNS를 사용한다. → 서비스 간 연결에 도메인 주소를 사용하면 DNS 서버에서 간단한 설정 변경만으로 복잡한 서비스 간 연결을 쉽게 변경할 수 있다.

7.2.2 DNS 구조와 명명 규칙

도메인은 계층 구조여서 수많은 인터넷 주소 중 원하는 주소를 효율적으로 찾아갈 수 있다. 하위 레벨로 원하는 주소를 단계적으로 찾아간다. (역트리 구조)

도메인의 주소를 사용할 때는 각 계층의 경계를 “.”으로 표시하고 뒤에서 앞으로 해석한다.

Third.second.com(.) → 맨 뒤의 루트는 생략

→ .를 시작으로 com → second → third로 뒤에서 앞으로 해석된다.

→ 도메인 계층은 최대 128계층까지 구성할 수 있다.

→ 계층별 길이는 최대 63 바이트까지 사용할 수 있다.

→ 구분자를 포함한 최대 길이는 255바이트이다.

→ 문자는 숫자, 알파벳, ‘-’만 사용할 수 있고, 대소문자 구분이 없다.

7.2.2.1 루트 도메인

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 서버에 쿼리를 보낸다.

7.2.2.2 Top-Level Domain(TLD)

최상위 도메인 TLD는 IANA(Internet Assigned Numbers Authority)에서 구분한 6가지 유형으로 구분할 수 있다.

  • Generic(gTLD)
    • 특별 제한 없이 사용되는 최상위 도메인(세글자 이상으로 구성)
    • 초기 gTLD
      • com: 일반 기업체
      • edu: 4년제 이상 교육기관
      • gov: 미국 연방 정부기관
      • int: 국제기구, 기관
      • mil: 미국 연방군사기관
      • net: 네트워크 관련 기관
      • org: 비영리기관
  • country-code(ccTLD)
    • 국가 최상위 도메인, ISO 3166 표준에 규정된 구 글자의 국가 코드 사용
      • 한국 → ‘kr’
      • gTLD와 함께 사용될 경우 gTLD는 second-level로 사용
        • ‘co.kr’, ‘go.kr’ → gTLD는 일반적으로 2개로 줄여 사용
  • sponsored(sTLD)
    • 특정 목적을 위한 스폰서를 두고 있는 최상위 도메인
    • 민족 공동체, 전문가 집단, 지리적 위치 등등
    • .aero, .aisa, .edu 등등
  • infrastructure
    • 운용상 중요한 인프라 식별자 공간을 지원하기위해 전용으로 사용되는 최상위 도메인
    • .arpa → 인터넷 안정성을 유지하기위해 새로운 모든 인프라 하위 도멩니이 배치될 도메인 공간 역할
  • generic-restricted(grTLD)
    • 특정 기준을 충족하는 사람이나 단체가 사용할 수 있는 최상위 도메인
    • .biz, .pro, .name
  • test(tTLD)
    • IDN(Internationalized Domain Names) 개발 프로세스에서 테스트 목적으로 사용되는 최상위 도메인
    • .test

7.2.3 DNS 동작 방식

DNS를 사용하려면 DNS 서버에 쿼리해야하지만 로컬에서 도메인 IP 주소를 관리하는 hosts 파일에 도메인과 IP 주소를 설정해두면 해당 도메인 리스트는 항상 DNS 캐시에 저장된다.

  1. 사용자의 요청

  2. DNS 캐시 정보를 먼저 확인( 동적 DNS 캐시 + hosts 파일 저장 정보)

  3. 캐시에 없다면 DNS 서버에 쿼리

  4. 응답을 받으면 결과를 캐시에 먼저 저장

    👉🏻
    왜 사용자 응답보다 캐시에 먼저 저장하는가?

    • 성능 최적화: DNS 서버는 도메인에 대한 정보를 재사용할 수 있게끔 캐시에 저장하여 반복된 요청에 대해 빠르게 처리할 수 있다. 캐시를 통해 응답 시간을 단축하고 네트워크 부하를 줄인다.
    • TTL: DNS 응답에는 TTL 값이 포함되어 있으며 이 TTL 값은 해당 정보가 캐시에서 유효한 시간을 정의한다.
  • hosts 파일은 각각의 컴퓨터에 수동으로 관리 → DNS 체계를 통해 중앙 집중식 시스템 구축
  • 폭증한 단말을 수용하기위해 플랫한 hosts 방식 → 계층 구조 채택
      

[DNS 시스템 관점에서 도메인에 대한 결괏값을 클라이언트에게 보내주는 과정]

DNS는 분산된 데이터베이스로 서로 도와주도록 설계되었다.

→ 자신이 가진 도메인 정보가 아니면 다른 DNS에 질의해 결과를 받을 수 있다.

DNS 기능을 서버에 올리면 DNS 서버는 기본적으로 루트 DNS 관련 정보를 가진다. → 클라이언트 쿼리가 자신에게 없는 정보라면 루트 DNS에 쿼리한다.

→ 루트 DNS에서는 쿼리한 도메인의 TLD 값을 확인해 해당 TLD 값을 관리하는 DNS가 어디인지 응답한다.

⇒ 클라이언트에서 처음 질의를 받은 DNS가 중심이 되어 책임지고 루트 DNS부터 상위 DNS에 차근차근 쿼리를 보내 결과값을 알아낸 후 최종 결과값만 클라이언트에 응답한다.

재귀적 쿼리와 반복적 쿼리

  • 재귀적 쿼리: 쿼리를 보낸 클라이언트에 서버가 최종 결과값을 반환하는 서버 중심 쿼리 → 클라이언트 - 로컬 DNS 간 연결
  • 반복적 쿼리: 최종값을 받을 때까지 클라이언트에서 쿼리를 계속 진행하는 방식 → 로컬 DNS 서버(클라이언트) - 상위 DNS 구간

0개의 댓글