osul_world 2021. 11. 26. 20:20
728x90

DNS(Domain Name System)

IP Address를 그대로 사용하여 웹통신을 하는건 너무 힘들다.

DNS라는 개념은 마치 친구에게 전화를 걸때 전화번호부에서 친구 전화번호가 아니라 친구이름을 이용해 편리하게 전화를 거는것과 같다.

 

HOSTs 파일

OS는 Hosts라는 파일에 이 전화번호부를 저장한다.

우리는 여기에 DN를 추가하거나 수정할수있다.

img

OS내 디렉토리에 존재한다. 자세한 디렉토리는 구글링을 해보자.

HOSTS 파일을 열어보면 다음과 같이 나올것이다.

image

하단에 52.231.11.152 web1.com을 적어보자, 이제 해당 IP Address는 web1.com라는 도메인 네임과 매핑되어 url에 web1.com를 입력하면 해당 IP로 접근할수있다.

web1.com이라는 DN은 이미 사용중일 것이다. 로컬내에서는 나에게 우선순위가 주어지니 테스트는 해볼수있다.

추가로 스프링 프로젝트 테스트시 localhost:8080으로 접속한다. 127.0.0.1 ip주소가 localhost로 되어있음을 확인할수있다.

127.0.0.1 은 자기가 자기 자신에게 접속할때 쓰는 IP이다.

따라서 로컬에서 웹 어플리케이션을 테스크할때 localhost라는 DNS를 사용했단것을 알수있다.

 

HOSTs 보안

해커가 HOSTS파일을 악의적으로 변경했다고 해보자.

web1.com 에 매핑된 IP Address를 해커가 만든 악의적인 사이트로 변경하면 사용자가 web1.com를 사용했을때 해당 악성 페이지로 이동하게 된다.

만약 은행 사이트를 모방한 사이트라면 개인정보를 피싱할수있다.

이런 해킹을 피싱이라고 한다.

hosts 파일은 백신을 통해 수시로 변조되지는 않는지 검사 되도록 하는 걸 권장한다.

 

DNS 서버의 탄생

앞서 설명한 hosts 파일의 내용은 당연하게도 내 컴퓨터에서만 유효하다. 따라서 도메인 이름과 IP 주소의 맵핑 정보들을 모든 호스트들이 공유하려면 모든 호스트가 동일한 hosts 파일을 가지고 있어야 한다.

초창기에는 Standard Research Institute(이하 SRI)라는 기구에서 하나의 hosts 파일을 관리하고, 이를 모든 호스트들이 직접 다운로드하여서 사용하곤 하였다.

이게 원활하게 운영될리가 없다..호스트마다 동기화의 격차를 어떻게 해결할것인가..ㅠㅠ

도메인 이름과 IP 주소들의 맵핑 정보들을 모두 가지고있는 하나의 상위 서버가 필요할것같지 않은가?

이 서버가 바로 DNS 서버이다.

DNS 서버는 도메인 이름과 IP 주소들의 맵핑 정보들을 내부적으로 레코드(Record)의 형태로 기록하고있으며 각각의 호스트들은 인터넷에 연결되는 순간에 자동으로 (로컬) DNS 서버의 IP 주소가 세팅된다.

브라우저에 도메인 이름을 입력하여 접속을 시도하면, 우선 파일 시스템에 존재하는 hosts 파일의 내용을 확인한다. 만약 그곳에서 해당 도메인 이름의 IP 주소를 알아내지 못하면, 미리 세팅되어 있는 DNS 서버에게 찾아가서 해당 도메인 이름의 IP 주소를 물어본다

DNS는 도메인 등록 행정 절차가 간소화 및 자동화되었을 뿐만 아니라, DNS 서버 내부에서 도메인 이름과 IP 주소의 맵핑 정보가 수정/추가되는 즉시 해당 DNS 서버를 사용하는 모든 호스트들은 그 사실을 알게 된다는 장점이 있다.

 

추가

Public DNS 서버

앞서 간단히 말했지만, 모든 호스트들은 인터넷에 연결되는 즉시 가입한 통신사(Internet Provider, ISP)에 따라 사용할 (로컬) DNS 서버의 IP 주소가 자동으로 세팅된다. 그런데 자동으로 세팅된 DNS 서버가 아닌 다른 DNS 서버를 사용하고 싶을 수도 있다. 예를 들어, 기본적으로 DNS 서버는 우리가 무슨 도메인 이름으로 접속하려 하는지 모두 알 수 있기 때문에 자동으로 연결된 DNS 서버를 신뢰하지 않을 수도 있다. 이러한 경우에 사용할 수 있도록 무료로 제공되는 DNS 서버들이 바로 Public DNS 서버이다. 실제로 구글에 검색해 보면 여러 종류의 Public DNS 서버가 존재함을 알 수 있다. DNS 서버를 수동으로 설정해주는 법은 운영체제별로 다르니, 검색을 통해 직접 알아보도록 하자.

 

 

도메인 이름의 구조

 

DNS 서버는 1개만 존재하는 것이 아니라 여러개의 계층구조로 분할되어있다.

blog.example.com이라는 도메인 이름을 예로 들면, 도메인 이름의 구조는 다음과 같다. 참고로 맨 뒤의 .은 생략되어 있는 것이다. 실제로 맨 뒤에 .을 붙여서 입력해도 동일하게 인식된다는 것을 알 수 있을 것이다.

img.

. 은 Root 도메인, com은 Top-level 도메인(이하 TLD), example은 Second-level 도메인(이하 SLD), blog는 서브 도메인을 의미한다..

각 부분별로 이를 담당하는 DNS 서버들이 존재한다.

DNS 서버를 네임 서버라고도 부른다.

각 계층의 네임 서버는 자신이 담당하는 도메인의 하위 도메인을 담당하는 네임 서버의 위치 정보(도메인 이름)를 알고 있다.

즉, Root 네임 서버들은 TLD 네임 서버들의 위치 정보를 알고 있고, TLD 네임 서버들은 SLD 네임 서버들의 위치 정보를 알고 있다.

image.

상위 네임 서버는 하위 네임서버의 위치를 알기때문에 Root부터 sub까지 순차적으로 다음 DNS 서버에 대한 위치 정보를 주고받으며 최종적으로 DNS를 찾아간다.

아래 상세 동작을 보자

 

DNS 상세 동작

image

  1. 파일 시스템에 존재하는 hosts 파일의 내용 확인
  2. 로컬 네임 서버가 Root 네임 서버에게 질의 : com 담당 네임 서버의 위치 정보를 대신 알려준다.
  3. 로컬 네임 서버가 com 담당 네임 서버에게 질의 : example.com 담당 네임 서버의 위치 정보를 대신 알려준다.
  4. 로컬 네임 서버가 example.com 담당 네임 서버에게 질의 : blog.example.com 담당 네임 서버의 위치 정보를 대신 알려준다.
  5. 로컬 네임 서버가 blog.example.com 담당 네임 서버에게 질의 : 요청된 도메인에 맵핑된 위치 정보를 알려준다.
  6. 로컬 네임 서버가 응답받은 IP 주소를 가지고 브라우저가 해당 IP 주소에 접속을 시도한다.

 

 

기타

  1. 도메인을 등록하는 과정과 관련 기관들의 역할

https://www.opentutorials.org/course/3276/20307

 

  1. nslookup이라는 도구를 사용하면 특정 도메인 이름에 맵핑된 IP 주소를 쉽게 알아볼 수 있다.

https://www.opentutorials.org/course/3276/20308

 

아래는 캐시를 무시하고 DN에 맵핑된 IP 주소를 알아보는 코드이다.

이전에 요청했던 DN이면 캐시가 유효하다면 캐시서버가 대신 이전 응답을 돌려준다.

그사이 데이터가 변경되었을수있으니 캐시 무시하고 IP 주소를 알아볼수있다.

img

3. DNS record & CNAME

앞에서 살펴본 것처럼 각각의 DNS 서버에는 특정 도메인 이름에 대한 정보들을 레코드(Record)의 형태로 저장한다. 그리고 각각의 레코드는 타입이 존재한다. 우리가 살펴본 두 가지 타입은 바로 A 타입과 NS 타입이다. A 타입의 레코드는 도메인 이름에 IP 주소를 맵핑하는 정보를 의미하며, NS 타입의 레코드는 가리키는 네임 서버의 위치 정보를 의미한다.

이밖에도 유용한 레코드 타입으로 CNAME(= Canonical Name)이라는 것이 존재한다. CNAME 타입의 레코드는 이미 존재하는 도메인 이름에 또 다른 도메인 이름을 맵핑하는 정보를 의미한다.

이름타입의미
A52.231.13.22eldorado.com에 52.231.13.22 IP 주소를 맵핑
etcA52.231.13.22etc.eldorado.com에 52.231.13.22 IP 주소를 맵핑
api.eldorado.comCNAMEeldorado.comapi.eldorado.com에 52.231.13.22 IP 주소를 맵핑

만약 여러 도메인 이름이 하나의 도메인 이름을 가리키는 상황이라면, 여러 개의 A 타입 레코드를 정의하는 것보다 하나의 A 타입 레코드를 정의하고 나머지 레코드들을 CNAME 타입으로 정의하는 것이 훨씬 효율적이다.

 

 

Reference

https://it-eldorado.tistory.com/55?category=749665

[IP 주소와 hosts - 생활코딩 (opentutorials.org)

728x90