## DNS란 무엇인가 DNS란 사람이 기억하기 쉬운 도메인 이름을 실제 네트워크에서 사용되는 IP 주소와 매핑하기 위한 분산형 데이터베이스 시스템이다. DNS가 없다면... 사람들이 웹 사이트에 접속할 때 IP 주소를 직접 입력해서 들어가야 하는데 굉장히 비효율적이고 비현실적이다. ## 도메인 이름을 입력했을 때 무슨 일이 일어나는가 1. **브라우저의 캐시를 확인한다.** 최근에 접속했던 페이지인 경우에는 브라우저에 해당 도메인에 대한 IP 주소가 캐싱되어있을 수 있다. 2. **OS의 캐시를 확인한다.** OS도 DNS 정보를 일정 시간 동안 캐싱한다. 3. **브라우저가 로컬 DNS 서버에 질의한다 (보통 ISP가 제공하는 DNS)** DNS 서버에 해당 도메인에 해당하는 IP가 무엇인지 질의한다. 재귀적 쿼리 방식을 이용한다. (한번만 물어본다.) 4. **로컬 DNS 서버가 IP 주소를 찾는다.** 로컬 DNS 서버는 IP 주소를 찾기 위해서 여러 번 질의하는 반복적 쿼리 방식을 이용한다. 1. Root 네임서버에 요청 2. TLD 네임서버에 요청 (.com, .net, .kr) 3. 권한 있는 네임서버에 요청 (도메인을 실제로 소유한 서버) 5. **IP 주소를 응답 받고 캐싱** IP 주소를 응답받은 브라우저는 해당 주소로 HTTP 요청을 보낸다. 동시에 이 IP 주소는 브라우저와 OS에 캐싱된다. ## DNS의 계층 구조 ``` [ . ] ← 루트 도메인 (Root) | -------------------------- | | | [com] [org] [net] ← 최상위 도메인(TLD) | | [google] [wikipedia] ← 2차 도메인 | [www] ← 서브도메인 ``` 1. 루트 도메인 마침표로 표시. 사용자가 사용할 때에는 일반적으로 생략되지만 DNS에서는 사용된다. DNS lookup의 시작점. 2. 최상위 도메인 (Top-Level Domain, TLD) 도메인의 최상위 계층이다. .com, .org, .kr 등 TLD마다 운영 주체 (Registry) 가 다르다. 일반적으로 2가지로 나뉜다. - gTLD (Generic TLD) : .com, .org 같이 전 세계적으로 사용 가능한 것들 - ccTLD (Country Code TLD): .kr, .jp, uk 같이 국가별로 정책이 다른 것들 3. 2차 도메인 (Second-Level DomainSLD) 도메인 구조에서 TLD 바로 왼쪽에 위치한 부분 예) google.com에서 google이 바로 SLD 일반적을 gTLD 체계에서는 사용자가 직접 등록하는 도메인을 의미 ccTLD에서는 구조가 좀 다를 수 있다. (.co.kr을 사용하는 경우 사용자가 등록하는 도메인은 example.co.kr) 4. 서브 도메인 도메인 가장 왼쪽에 선택적으로 들어가는 도메인 www.example.com 에서 www가 서브 도메인이 된다. 도메인 소유주가 자체적으로 정의하고, 보통 서비스 구분 용도로 사용한다. ## DNS 질의 방식 브라우저와 OS에서 모두 캐시를 찾지 못하고... DNS 서버를 통해 질의하는 과정 ![[295a9c30-680c-44b2-a601-c41f0a4ca105.png]] ### 재귀적 쿼리 (재귀적 질의) 클라이언트는 로컬 DNS 서버에 도메인에 대한 IP 주소를 딱 한번만 묻는다. 물어본 이후의 IP 주소를 찾는 과정은 로컬 DNS 서버가 알아서 루트 네임서버 -> TLD 서버 -> 권한 있는 네임서버를 찾는 하위 작업들을 진행한다. 내부적으로 모든 것을 처리하는 구조 => 재귀적 클라이언트 측면에서는 한번만 질의하면 되기 때문에 간단하지만 DNS 서버 측면에서 보면 모든 책임을 다해야 하기 때문에 부하가 높다. ### 반복적 쿼리 (반복적 질의) 로컬 DNS 서버는 IP 주소를 찾기 위해서 여러 번 반복적으로 다른 DNS 서버에 질의한다. ``` [클라이언트] │ (재귀적 쿼리) ▼ [로컬 DNS 서버] │ (반복적 쿼리) ├─▶ [루트 네임서버] → .com NS ├─▶ [TLD 서버] → google.com NS ├─▶ [권한 네임서버] → www.google.com A 레코드 ▼ [응답 반환] ``` 1. 먼저 루트 네임서버에 IP주소를 요청한다. 루트 네임 서버는 해당 IP를 직접 알지는 못하지만 **.com TLD 네임 서버들의 주소**를 알려준다. 2. TLD 네임서버에 다시 IP 주소를 요청한다. TLD 서버는 해당 IP를 직접 알지는 못하지만 **google.com에 권한을 가진 네임서버의 주소**를 알려준다. 3. 권한 있는 네임서버에 다시 IP 주소를 요청한다. 이 서버는 google.com의 실제 IP 주소를 알고 있으므로 응답한다. <!--todo: www 서브도메인의 의미 --> <!--todo: DNS를 알아야 하는 이유 (프론트엔드 관점에서) --> ## 참고 문서 - [[DNS 레코드 종류]] - [[DNS 캐시와 TTL]]