🔎 www.google.com에 접속해보자

개발자라면 브라우저 뒤에서 무슨 일이 일어나고 있고, 어떻게 정보가 인터넷을 통해 우리의 컴퓨터로 전달되는지에 대해 알고있을 필요가 있다. 면접 단골 질문이기도 하다.
www.google.com에 접속하는 과정을 생각해보자.

1. 주소창에 www.google.com을 입력하자.

우리가 젤 먼저 해야할 것은 내가 사용하는 브라우저 주소창에 www.google.com을 입력하는 것이다.

2. 브라우저는 캐시에 DNS 레코드가 있는지 확인한 후, www.google.com의 IP 주소를 찾는다.

DNS(Domain Name System)는 웹 사이트(URL)의 이름과 링크되는 특정 IP 주소를 유지하는 데이터베이스이다. 사람마다 고유한 주민등록번호가 있듯이, 인터넷의 모든 URL에는 고유한 IP 주소가 할당되어 있다. www.google.com의 IP 주소는 209.85.227.104이다.

DNS의 주된 목적은 사용자 친화적인 탐색이다. 13자리나 되는 주민등록번호를 기억하는 것보다 사람의 이름을 기억하는게 더 편한 것처럼, 최소 12자리나 되는 IP 주소를 기억하는 것보다는 영어로된 도메인 네임을 기억하는 것이 더욱 편할 것이다.

아무튼, 브라우저는 DNS 레코드를 찾기 위해 4개의 캐시를 확인한다.

  • 브라우저 캐시
    브라우저는 사용자가 이전에 방문한 웹 사이트에 대해 고정된 기간 동안 DNS 레코드를 저장한다. DNS 쿼리를 실행하는 첫 번째 장소이다.
  • OS 캐시
    브라우저 캐시에 없으면 OS가 DNS 레코드의 캐시를 유지하므로 기본 컴퓨터 OS로 시스템 호출을 해서 레코드를 가져온다.
  • 라우터 캐시
    컴퓨터에도 없는 경우, 브라우저는 DNS 레코드의 자체 캐시를 유지하는 라우터와 통신한다.
  • ISP 캐시
    모든 단계가 실패하면 브라우저가 ISP로 이동한다. ISP는 DNS 레코드의 캐시를 포함하는 자체 DNS 서버를 유지 관리한다. 이 서버는 브라우저가 요청한 URL을 찾을 수 있는 마지막 희망이다.

왜 이렇게 많은 수준에서 캐시가 유지 관리되는걸까?

우리의 정보가 많은 곳에 캐싱 되어있다는 것은 프라이버시 측면에서는 안전하지 않을 수 있다. 하지만 캐시는 네트워크 트래픽을 조절하고 데이터 전송 시간을 개선하는 데 필수적이다.


3. 요청한 URL이 캐시에 없으면 ISP의 DNS 서버는 www.google.com을 호스팅하는 서버의 IP 주소를 찾기 위해 DNS 쿼리를 시작한다.

앞서 언급했듯이, 내 컴퓨터가 www.google.com을 호스팅하는 서버에 연결되기 위해서는 www.google.com의 IP 주소가 필요하다. DNS 쿼리의 목적은 웹 사이트에 대한 올바른 IP 주소를 찾을 때까지 인터넷에서 여러 DNS 서버를 검색하는 것이다.

DNS는 분산 계층 구조를 이루고 있기 때문에 IP 주소를 한 큐에 바로 얻을 수 없다. 상위 계층에서부터 쿼리를 던지고, 여기서 얻은 정보로 또 다른 서버에게 쿼리를 던지고, 여기서 얻은 정보로 또 다른 서버에게 계속해서 쿼리를 던져야 목적지 IP 주소를 얻을 수 있다.
자세한 쿼리 과정은 여기를 참고하자.

이러한 쿼리 요청은 요청 내용 & 요청 대상 IP 주소와 같은 정보가 포함된 작은 데이터 패킷을 사용하여 전송된다. 이 패킷은 클라이언트와 서버 간에 여러 네트워킹 장비를 통과하여 올바른 DNS 서버에 도달하게 된다. 이 장비는 라우팅 테이블을 사용하여 패킷이 목적지에 도달할 수 있는 가장 빠른 방법을 알아낸다. 만약 패킷이 손실되면 요청 실패 오류가 발생하고, 그렇지 않으면 올바른 DNS 서버에 연결하여 올바른 IP 주소를 가져온 다음 브라우저로 돌아간다.

4. 브라우저가 서버와의 TCP 연결을 시작한다.

브라우저가 올바른 IP 주소를 수신하면 정보를 전송하기 위해 IP 주소와 일치하는 서버와의 연결이 설정된다. 브라우저는 이러한 연결을 구축하기 위해 인터넷 프로토콜을 사용한다. 여러 유형의 인터넷 프로토콜이 있지만 HTTP 요청에 사용되는 가장 일반적인 프로토콜은 TCP이다.

클라이언트와 서버 간에 데이터 패킷을 전송하려면 TCP 연결을 설정해야 한다. 이 연결은 TCP/IP 3-way handshake라는 프로세스를 사용하여 설정된다. 클라이언트와 서버가 SYN(동기화) & ACK(승인) 메시지를 교환하여 연결을 설정하는 3단계 프로세스이다. 자세한 과정은 여기를 참고하자.

3-way handshake까지 마쳤다면 이제 데이터 전송을 위한 TCP 연결이 설정되었다.

5. 브라우저가 웹 서버로 HTTP 요청을 보낸다.

TCP 연결이 설정되면 브라우저가 www.google.com 웹 페이지를 요청하는 GET 요청을 보낸다.(자격 증명을 입력하거나 양식을 제출하는 경우 POST 요청일 수 있다.) 이 요청에는 브라우저 식별(User-Agent 헤더), TCP 연결 타입과 같은 추가 정보도 포함된다.

HTTP Request


6. 서버가 요청을 처리한다.

서버에는 브라우저에서 요청을 수신하고 이를 요청 핸들러에 전달하여 응답을 읽고 생성하는 웹 서버(ex. Apache)가 포함된다. 요청 처리기는 요청, 헤더 및 쿠키를 읽고 요청된 내용을 확인해서 특정 형식(JSON, XML, HTML)으로 응답을 조합한다.

7. 서버가 HTTP 응답을 전송한다.

이제 이렇게 만들어진 응답을 전송해야 하는데, 서버 응답에는 사용자가 요청한 웹 페이지뿐만 아니라 상태 코드, 객체 몸체의 타입(Content-Type)과 같은 여러가지 정보가 포함된다.

HTTP Response

위의 응답 메세지를 보면 첫 번째 줄에 상태 코드가 표시된다. 이는 응답 상태를 알려주기 때문에 매우 중요하다. 상태 코드에는 크게 5가지 유형이 있다.

  • 200 OK: 요청이 성공되었고, 정보가 응답으로 보내짐
  • 301 Moved Permanently: 요청 객체가 새로운 URL로 이동됨(Redirection)
  • 400 Bad Request: 서버가 요청을 이해할 수 없음(클라이언트 측 오류)
  • 404 Not Found: 요청 문서가 서버에 존재하지 않음(클라이언트 측 오류)
  • 505 HTTP Version Not Supported: 요청 HTTP 프로토콜 버전을 서버가 지원하지 않음(서버 측 오류)

8. 브라우저는 응답 내용을 표시한다.

HTML 응답인 경우 브라우저는 HTML 내용을 단계적으로 표시한다. 먼저, HTML의 큰 골격을 렌더링한다. 그런 다음 HTML 태그를 확인하고 이미지, CSS 스타일시트, 자바스크립트 파일 등과 같은 웹 페이지의 추가 요소에 대한 GET 요청을 보낸다. 이러한 정적 파일은 브라우저에 의해 캐시되기 때문에 다음에 페이지를 방문할 때 다시 가져올 필요가 없다.

드디어! www.google.com이 브라우저에 나타나게 된다.


끝 🖐


References