기술의 발달로 일반인들은 인터넷 웹페이지를 별다른 수고 없이 사용하고 있다. 하지만 그 내부에서는 수많은 일들이 처리되고 있다. 오늘은 웹상에 구글 페이지를 띄우기까지 어떤 일이 내부적으로 일어나고 있는지 알아보자.
관련해서 잘 쓰여진 블로그가 있어서 번역해 옮겨본다.
What happens when you type a URL in the browser and press enter?
If you are in any technical profession, I am sure someone at some point has asked you this question. Whether you are an engineer…
medium.com
What happens when you type a URL in the browser and press enter?
만약 당신이 기술 전문가라면, 누군가로부터 이런 질문을 받아봤을 것이다. 엔지니어, 개발자, 마케터, 혹은 세일즈맨이든 관계없이 우리의 웹사이트의 이면에 어떤 일들이 일어나고 정보가 어떻게 인터넷을 통해 전달되는지 아는 것은 아주 좋은 일이다.
당신이 maps.google.com에 접근해서 회사에서 저녁 예약을 한 레스토랑까지 얼마나 걸리는지 정보를 얻는다고 가정해보자.
1. maps.google.com을 주소창에 적는다.
2. 웹브라우저는 map.google.com의 IP 주소 기록이 있는지 DNS 기록 캐시를 탐색한다
DNS는 웹사이트의 이름(URL)과 해당 이름과 연결된 IP주소를 가지고 있는 데이터베이스다. 인터넷 상의 모든 URL은 각각이 연결된 IP주소가 있다. IP주소는 우리가 접근하려는 웹사이트의 서버를 호스트 하는 컴퓨터의 주소를 뜻한다. 예를 들어 www.google.com의 IP주소는 209.85.227.104이다. 따라서 만약에 구글 페이지로 이동하고 있다면 www.google.com 대신에 http://209.85.227.104를 브라우저에 검색해도 된다. DNS는 마치 전화번호부와 같이 이름과 전화번호가 적힌 즉 URL들과 각 URL의 IP 주소 리스트이다.
DNS의 주된 목적은 사용자 친화적 내비게이션이다. IP주소를 브라우저에 넣음으로써 웹사이트에 쉽게 접속할 수 있지만, 자주 접속하는 웹사이트들의 IP주소 번호를 모두 외운다고 생각해보라. 따라서 번호 대신 웹사이트의 이름을 외우는 것이 훨씬 쉽고 대신에 DNS가 올바른 IP주소와 매핑하도록 하는 것이다.
DNS 기록을 찾기 위해 브라우저는 네 가지 캐시를 확인한다.
- 첫 번째, 브라우저 캐시를 확인한다. 브라우저는 이전에 방문했던 웹사이트의 DNS 기록을 일정 기간 동안 저장하는 저장소를 가지고 있다. 따라서 해당 저장소에서 제일 먼저 DNS 쿼리가 이루어진다.
- 두 번째, 브라우저는 OS 캐시를 확인한다. 만약에 브라우저에 캐시가 없다면, 브라우저는 시스템 콜을 통해 컴퓨터 OS의 기록을 탐색한다. 컴퓨터 OS도 마찬가지로 DNS 캐시를 기록한다.
- 세 번째, 브라우저는 라우터 캐시를 확인한다. 컴퓨터에도 없다면 브라우저는 DNS 레코드를 가지고 있는 라우터와 통신한다.
- 네 번째, 브라우저는 ISP 캐시를 확인한다. 만약 모든 과정이 실패한다면, 브라우저는 ISP로 이동한다. ISP는 요청한 URL을 찾기를 희망할 수 있는 마지막 기회인데, ISP는 DNS 기록을 가지고 있다.
아마 왜 이렇게 많은 단계에 이렇게 많은 캐시가 있는지 궁금할 것이다. 개인정보 차원에서 자신의 정보가 어딘가에 기록되는 게 좋지는 않다. 하지만 캐시는 네트워크 트래픽 유지와 데이터 탐색 시간을 줄일 수 있는 필수적인 요소다.
3. 만약 요청한 URL이 캐시에 없다면 ISP의 DNS 서버는 maps.goolge.com 서버의 IP주소를 찾기 위해 쿼리를 진행한다.
앞서 언급했듯이, maps.google.com의 호스트 서버에 접속하기 위해서는 maps.google.com의 IP주소가 필요하다. DNS 쿼리의 목적은 올바른 웹사이트의 IP 주소를 찾기 위해 인터넷상에서 다수의 DNS 서버를 탐색하는 것이다. 이러한 방식의 탐색을 회기적 탐색이라고 부른다. 왜냐하면 IP 주소를 찾거나 찾을 수 없었다는 에러를 반환하기 이전까지 DNS 서버에서 다른 DNS 서버로 탐색이 지속되기 때문이다.
이때, 다른 DNS 서버에 쿼리를 해 올바른 IP를 찾아내는 DNS recursor를 ISP의 DNS 서버로부터 호출할 수 있다. 이러한 다른 DNS 서버는 네임 서버라고 불리는데, 도메인 이름의 도메인 아키텍처에 기반한 DNS 검색을 실행하기 때문이다.
오늘날 많은 웹사이트 URL은 3단계 도메인, 2단계 도메인, 그리고 탑 레벨 도메인을 가지고 있다. 각각의 레벨은 자신의 네임서버를 가지고 있고 여기서 DNS 탐색 프로세스가 진행된다.
maps.google.com의 경우 우선 DNS recursor가 root 네임 서버와 교신한다. root 네임 서버는 우선. com 도메인 네임서버에 리다이렉트 하고. com 네임서버는 google.com 네임서버로 리다이렉트 한다. google.com 네임서버는 maps.google.com과 매칭 되는 IP 주소를 DNS 기록에서 찾고 사용자의 DNS recursor에 반환하면 사용자의 브라우저로 IP 주소를 알려주게 된다.
4. 브라우저는 서버와 TCP 연결을 시작한다.
브라우저가 올바른 IP 주소를 받으면, 정보 교환을 위해 해당 IP 주소의 서버와 연결을 시도한다. 브라우저는 연결을 위해 인터넷 프로토콜을 이용한다. 사용할 수 있는 인터넷 프로토콜은 여러 가지가 있는데, TCP는 HTTP 요청의 다양한 타입에 사용되는 가장 흔한 프로토콜이다.
클라이언트와 서버 사이에 패킷 전송을 위해 TCP 연결이 구축되는 것이 중요하다. 해당 연결은 TCP/IP three-way handshake라는 과정을 통해 이루어진다. 이 과정은 클라이언트와 서버가 SYN(synchronize)와 ACK(acknowledge) 메시지를 교환하면서 이루어진다.
1. 클라이언트는 서버에게 새로운 연결이 가능한지 알기 위해 SYN 패킷을 인터넷을 통해 서버에게 보낸다.
2. 만약 서버의 포트가 열려있고 새로운 연결이 가능할 때, ACK를 회신하기 위해 SYN/ACK 패킷을 클라이언트에게 보낸다.
3. 클라이언트는 SYN/ACK 패킷을 서버로부터 전달받고 ACK 패킷을 보냄으로써 수신을 확인한다.
위와 같은 방식으로 데이터 교신을 위한 TCP 연결이 완료된다!
5. 브라우저는 HTTP 요청을 웹서버에 보낸다.
TCP 연결이 완료되면, 데이터를 교환할 차례다. 브라우저는 maps.google.com의 웹페이지를 얻기 위해 GET 요청을 보내게 된다. 만약 유저가 credntial을 입력한다면 요청이 POST 요청이 될 수도 있다. 요청에는 브라우저에 관한 정보, 받아들일 요청의 종류, 그리고 추가 요청을 위해 TCP 연결 지속을 요청하는 연결 헤더 등의 정보가 포함될 수 있다. 그리고 해당 도메인을 위한 브라우저의 쿠키 정보를 보내줄 수도 있다.
6. 서버는 요청을 받고 응답을 전달한다.
서버는 브라우저로부터 요청을 받고 요청을 핸들러에게 전달해 요청을 읽고 응답을 만드는 웹서버(아파치, IIS 등)를 가지고 있다. 요청 핸들러는 요청과 요청의 헤더 그리고 쿠키를 읽고 필요하다면 서버의 정보를 업데이트하는 프로그램이다(ASP.NET, PHP, Ruby 등으로 작성된). 그리고 요청 핸들러는 응답을 특정한 형식(JSON, XML, HTML)으로 조합한다.
7. 서버는 HTTP 응답을 보낸다.
서버의 응답에는 요청한 웹페이지와 함께 상태 코드, 압축 타입, 캐시 컨트롤, 쿠키, 개인정보 등을 포함하고 있다.
- 1XX은 정보전달용 메시지임을 뜻한다.
- 2XX은 성공을 뜻한다.
- 3XX은 다른 URL로의 리디렉션을 뜻한다.
- 4XX은 클라이언트의 에러를 뜻한다.
- 5XX은 서버의 에러를 뜻한다.
따라서, 만약 에러가 발생한다면 HTTP 응답을 통해서 어떤 종류의 에러인지 파악할 수 있다.
8. 브라우저는 HTML 콘텐츠를 화면에 표시한다.
브라우저는 HTML 컨텐츠를 화면에 표시한다. 우선 HTML 골격을 렌더링 한다. 그리고 HTML 태그를 확인하고 image나 CSS, 자바스크립트를 위한 추가적인 GET 요청을 보낸다. 이러한 정적 파일들은 브라우저에 캐시 되고 다음에 방문할 때는 따로 요청하지 않아도 된다. 마지막으로 maps.google.com을 화면에서 보게 된다.
이러면 모든 과정이 끝난다!
굉장히 지루하고 긴 과정처럼 보이지만, 실제로는 키보드에 엔터를 치고 수 초 안에 모든 과정이 이루어진다. 사용자가 알아차릴 수 없을 정도로 밀리세컨드의 속도로 이루어지기 때문이다.
'HTTP' 카테고리의 다른 글
[Cookie] 브라우저가 쿠키 저장에 실패한다면 (0) | 2023.12.13 |
---|---|
[HTTP] HTTPS는 무엇이고 어떻게 작동하는 걸까? (0) | 2022.03.23 |
[Socket.io] socket.io 룸 생성과 메세지 전달 프로세스 (0) | 2022.03.11 |
[Socket.io] Socket.io란 무엇인가? (0) | 2022.03.05 |
HTTP MIME (0) | 2021.11.18 |