Web

브라우저에 URL을 입력하면 일어나는 일 (1/2)

superbono 2021. 7. 31. 18:20

브라우저에 URL(예: https://google.com)을 을 입력했을 때 일어나는 일에 대해서 2개의 포스트에 나누어 정리해보겠다.

 

* 간단 개요

인터넷은 Internet Protocol Suite 위에서 동작한다. Internet Protocol Suite는 TCP/IP로 알고 있는 그것이다. 많은 연결 프로토콜이 존재하나, TCP/IP는 웹 서버와 브라우저 사이에서 웹사이트에 대한 정보를 옮기는데 중요한 역할을 한다. 실질적인 데이터는 HTTP 프로토콜에 의해서 다뤄지지만, TCP와 HTTP는 다른 용도로 사용되며 OSI 모델 중 계층도 다르다. HTTP는 7계층 Application Layer이며, TCP는 4계층 Transport Layer이다.

 

1. 브라우저 주소 창에 URL을 입력하고 엔터키를 치면 브라우저는 입력한 내용을 기반으로 통신하려는 서버를 찾아야 한다. 

2. 브라우저에서 요청하는 웹사이트를 호스팅하는 웹 서버와 통신하려면 인터넷을 통해 연결을 설정할 수 있는 IP 주소를 찾아야 한다. 웹사이트 이름이나 도메인 이름은 우리 인간의 약칭이므로 IP 주소(예: 123.456.789.101)를 기억할 필요가 없지만 그건 인간의 사정이라서 서버는 IP 주소를 알아야 한다. IP 주소를 얻기 위해 도메인 이름 테이블과 관련 콘텐츠를 호스팅하는 서버의 실제 IP 주소를 유지 관리하는 DNS(Domain Name Server)라는 특정 서버가 있다. 그렇게 하면 브라우저가 먼저 실제 IP 주소(예: www.holbertonschool.com)에 대해 DNS 서버를 확인한 다음 올바른 IP 주소로 직접 두 번째 요청을 할 수 있다. -> (DNS Look Up)

3. 올바른 IP 주소가 있으면 브라우저는 GET HTTP를 사용하여 웹 서버에 요청하고 응답을 기다리며 궁극적으로 브라우저를 실행하는 컴퓨터와 웹 서버를 실행하는 컴퓨터 간에 양방향 연결을 설정한다. HTTP 프로토콜 설계 상 클라이언트가 요청을 보내면 반드시 응답을 받아야 한다. 보안 통신이 필요한 경우 중요한 데이터가 전송되기 전에 서버와 클라이언트 간에 협상한다.

4. 서버 측에서는 순전히 정적 HTML 콘텐츠를 제공하지 않는 한 사용자 또는 일부 외부 정보(예: 시간)의 요청에 따라 일종의 애플리케이션 서버를 쿼리하거나 일부 스크립트를 실행해야 한다. 이것은 클라이언트에 반환되기 전에 사용자 정의 HTML 콘텐츠를 생성하는 데 사용된다.

5. 웹 페이지를 렌더링하는 데 필요한 모든 데이터가 전송된 후 브라우저 렌더링 엔진이 HTML 및 스타일시트 콘텐츠를 구문 분석하고 Javascript 코드를 실행한다. 지속적인 연결이 가능하고 서버와 브라우저 간의 지속적인 통신이 계속된다. 특히 웹 애플리케이션의 경우 애플리케이션 서버와의 지속적인 통신을 통해 업데이트한다.

 

* DNS 요청 

브라우저의 주소창에 https://naver.com 이라고 입력하든, https://naver.com/사실/이건/없는/주소/지롱 이라고  입력하든 브라우저는 이것이 유효한 도메인 이름인지 혹은 유효한 도메인인 경우 해당 콘텐츠를 호스팅하는 서버를 찾아가지 못한다. 도메인 이름은 사실 인간이 만든거고 브라우저는 이게 어떤 서버에 연결된 것인지 알 수 없다. 따라서 브라우저가 웹서버를 찾아가려면 연결을 요청하기 전에 https://www.naver.com 의 ip 주소를 찾아야 한다. 

DNS Look up은 브라우저가 웹사이트의 ip 주소를 확인하는 방법이다. DNS는 https://naver.com 과 같은 도메인 이름과 호스팅 하는 서버를 직접 식별하는 IP 주소를 알 수 있다. Application 계층의 프로토콜이다. 

 ⁙ DNS Look Up은 어떻게 이루어지는가?

브라우저는 이전에 요청한 도메인의 캐시를 확인하고 일치하는 항목을 찾는다. 일치하는 항목을 찾으면 해당 IP 주소를 직접 사용하고 그렇지 않으면 브라우저가 별도의 캐시를 유지하는 OS를 확인하여 다른 응용 프로그램이 최근에 이 도메인을 요청했는지 확인하는 재귀 프로세스를 시작한다. 거기에도 없으면 게이트웨이(종종 모뎀이나 라우터)를 확인하여 IP가 거기에 저장되어 있는지 확인한다. 모뎀에는 일반적으로 자체 캐시를 체크인하는 ISP(Internet Service Provider)가 호스팅하는 기본 DNS 서버가 있다. 여기서도 못찾으면 더 큰 지역을 캐싱하는 다른 DNS 서버에 DNS 요청을 발행하고, 어디에도 캐싱되지 않은 경우(또는 TTL이 모든 곳에서 초과된 경우) 마지막으로 root name server를 쿼리한다. 그러면 루트 이름 서버가 .com TLD 이름 서버에 위임하고 whois출력에 표시된 AWS name 서버 중 하나에 위임한다. 레코드가 발견되면 네임 서버는 IP 주소 및 TTL 값과 같은 필요한 정보와 브라우저로 돌아가는 길에 있는 각 노드로 응답한다. 이 응답을 캐시하므로 TTL 내의 다른 쿼리가 IP를 얻기 위해 이름 서버로 다시 돌아갈 필요가 없다. 

요약 : OS, 게이트웨이, 더 큰 지역 캐싱하는 다른 DNS 서버, root name server 순으로 더 큰 지역을 탐색하는 순으로 탐색한다.

 

어쨋든 DNS Look Up을 통해서 도메인 이름으로 아이피 주소를 알아냈다고 하자. 그럼 HTTP 요청을 보낸다. 

 

* HTTP 요청과 TCP/IP

버와 통신하기 위해 사용하는 방법은 TCP (Transmission Control Protocol)로, 두 컴퓨터 간에 데이터를 교환하기 위한 프로토콜이다. TCP에 대한 설명은 여기 자세히 따로 포스팅 하였다. 

 

TCP/IP를 통한 연결 요청

HTTP 요청이 www.google.com (또는 구글 서버의 아이피) 으로 나가기 전에 브라우저는 연결을 설정해야 한다. 연결 수립은 3 way handshake라고 알려진 것을 통해 수립된다. 3 way handshake에 대해서는 여기 자세히 따로 포스팅하였다.