본문 바로가기
네트워크

[브라우저에 URL 입력 후 일어나는 일들] 2_DNS 서버 검색

by 이농이능 2019. 1. 7.

지난번 URL을 입력 후 엔터를 쳤을 때 키를 인식하고 URL에서 필요한 정보를 해석하는 과정까지 이야기했는데요!

오늘은 목적지 IP주소를 알아오는 과정을 알아보고자 합니다.



1. HTTP와 HTTPS


먼저 지난번 URL 주소에서 http 프로토콜에 대해서 설명을 했었는데

이때 http 와 https 를 간단하게 설명했었습니다.


http 는 HTML 같은 문서를 웹 브라우저가 웹 서버에 요청하는 프로토콜인데 

https 는 통신 내용을 암호화 한다는 것에서 차이점이 있었죠.


그런데 https 프로토콜을 사용하여 접근해야하는 주소에 http 로 접근하는 경우( HTTPS 를 강제하게 될 때 ) 서버측에서 302 Redirect 를 이용하여 전환시킬 수 있습니다.
하지만 HTTP 연결을 거쳐가는 것이기 때문에 쿠키 정보 탈취 등 보안에 취약할 수 있습니다. 


이때 클라이언트에게 HTTPS 를 강제 하도록 하는 것이 권장되는데 이것이 

"HSTS" 입니다.



2. HSTS(Http Strict Transport Security)



HSTS (HTTP Strict Transport Security) 란?

  • 웹 브라우저가 HTTPS 프로토콜만을 사용해서 서버와 통신하도록 하는 기능
  • 일정시간 (max-age) 동안 HSTS 응답을 받은 웹사이트에 대해서 https 접속을 강제화
  • HTTPS 접속이 실패하는 경우 사이트 접근에 실패하게 됨


HTTP 를 이용한 연결 자체가 최초부터 시도되지 않으며 클라이언트 측에서 차단되는 장점이 있습니다.



브라우져는 이 HSTS에서 리스트를 점검합니다. 리스트에는 HTTPS로만 연결되도록 요청한 웹사이트의 목록이 존재합니다.

웹사이트가 목록에 있다면 브라우저는 요청을 HTTP 대신 HTTPS로 보내게 됩니다. 

그렇지 않다면 첫 요청은 HTTP로 보내집니다.




3. DNS 서버에서 IP 주소 받아오기.


http://wangin9.tistory.com → 211.231.99.250


사람이 읽을 수 있는 도메인 이름을  컴퓨터가 읽을 수 있는 IP 주소로 변환해주어야 합니다.


* IP : 인터넷 상에서 컴퓨터 간 통신할 수 있도록 하는 주소.


숫자로 이루어진 IP 주소를 기억하는 것은 어렵기 때문에 

DNS(Domain Name System)이 나왔습니다.


* DNS Server : IP 주소와 도메인이 저장되어 있는 서버.


브라우저는 도메인이 캐시에 들어있는지 확인합니다.

(크롬에서 DNS 캐시를 보려면 chrome://net-internals/#dns 확인 가능)


찾지 못하면 브라우저는 검색을 하기 위해 gethostbyname 라이브러리 함수를 호출합니다. 

gethostbyname 은 DNS 통한 호스트명 확인을 시도하기 전 호스트명이 로컬의 hosts 파일에서 참조될 수 있는지 확인합니다.

gethostbyname 이 캐시와 hosts 파일 모두에서 호스트명을 찾지 못하면 네트워크 스택에 정의된 DNS 서버에 요청을 보냅니다. 

일반적으로 로컬 라우터나 인터넷 공급자의 캐시 DNS 서버로 보내집니다.


****

DNS 서버에서 IP 를 받아오는 과정에 대한자세한 내용은 

https://aws.amazon.com/ko/route53/what-is-dns/ 참고해주세요~!



만약 DNS 서버가 같은 서브넷에 존재한다면 이 네트워크 라이브러리는 DNS 서버에 대해 APR 프로세스를 거칩니다.

만약 DNS 서버가 다른 서브넷에 존재한다면 네트워크 라이브러리는 기본 게이트웨이 IP 에 대해 ARP 프로세스를 거칩니다.



* 서브넷 : 

IP 주소가 부족하기 때문에 나온 개념으로, 대규모 네트워크를 구성하는 개별 네트워크를 뜻합니다. 

IP 주소를 잘게 쪼개서 사용하기 위한 것입니다.

일반적으로 하나의 서브넷은 하나의 지역, 한 빌딩 또는 같은 근거리통신망 내에 있는 모든 컴퓨터들을 나타낼 수 있는데 IP 를 나눠 쓰는 것입니다.

그래서 여러 개의 서브넷으로 나뉘어진 어떤 조직의 네트웍은 인터넷에 하나의 공유된 네트웍 주소로 접속할 수 있게 되는 것이죠.


서브넷을 나누는 이유는 브로드캐스트 영역을 나눠야 하기 때문입니다.

브로드캐스트 도메인이 커지면 트래픽이 올라가 부하가 걸릴 수 있기 때문에 적절히 나눠주는 것이 필요합니다.


서브넷을 나누기 위해 서브넷 마스크를 이용합니다. 

패킷이 도착하면, 그 패킷은 서브넷 번호를 이용하여 조직 내부의 게이트웨이에서 다시 라우팅 될 수 있습니다. 이때 그 라우터는 서브넷 마스크를 봄으로써 어떤 비트를 참조해야하는지 또는 참조할 필요가 없는지를 알게됩니다. 마스크는 단순히 라우터가 참조해야할 비트가 어느 것인지를 말해주는 일종의 필터입니다. 




URL 입력 후 IP 주소를 가져오는 과정을 알아보았습니다.

다음에는 ARP 프로세스를 통해 컴퓨터의 물리주소인 MAC 주소를 확인하는 과정에 대해서 설명하겠습니다. :)



참고 :

https://github.com/SantonyChoi/what-happens-when-KR

https://rsec.kr/?p=315

http://wiki.gurubee.net/display/SWDEV/HSTS+%28HTTP+Strict+Transport+Security%29

https://aws.amazon.com/ko/route53/what-is-dns/