
💡 만약 브라우저 주소창에 www.google.com을 입력한다면 어떤 일이 일어날까?
DNS(Domain Name System)은 URL의 이름이고 특정 IP 주소와 연결되어 있다. 모든 URL은 유일한 IP 주소와 매치된다. IP주소는 요청하는 웹사이트의 서버 호스트 컴퓨터에 종속된다.
예) www.google.com -> 20.85.227.104
🗨️ DNS
Amazon Route 53과 같은 DNS 서비스는 전 세계에 배포된 서비스로서, www.example.com과 같이 사람이 읽을 수 있는 이름을 192.0.2.1과 같은 숫자 IP 주소로 변환하여 컴퓨터가 서로 통신할 수 있도록 합니다. 인터넷의 DNS 시스템은 이름과 숫자 간의 매핑을 관리하여 마치 전화번호부와 같은 기능을 합니다. DNS 서버는 이름을 IP 주소로 변환하여 도메인 이름을 웹 브라우저에 입력할 때 최종 사용자를 어떤 서버에 연결할 것인지를 제어합니다. 이 요청을 쿼리라고 부릅니다.
1) 브라우저 캐시를 확인한다.
2) OS 캐시를 확인한다. 브라우저가 gethostname같은 시스템 함수를 호출한다.
3) 라우터 캐시를 확인한다.
4) ISP 캐시를 확인한다. 여기까지 캐시가 존재하지 않는 경우 ISP에서 DNS를 찾는다.
이 순서에서 많은 레벨에 캐시를 저장하는 이유는 캐시는 네트워크 트래픽을 조절하고, 데이터 전송 시간을 개선하는 데 핵심 역할을 하기 때문이다.
DNS 쿼리의 목적은 여러 서버 중에서 유일 상응하는 IP 주소를 찾는 것이다. IP 주소를 찾거나 찾을 수 없다는 에러를 반환할 때까지 재귀적으로 호출된다. 웹 사이트 도에인 이름의 도메인 아키텍처를 기반으로 DNS 서치가 이뤄진다.
도메인 아키텍처는 다음과 같다.

많은 도메인이 third-level 도메인을 사용하고 있다.
이 도메인을 통해 요청을 하게 되면 작은 데이터(요청 내용과 목적 IP 주소) 패킷을 사용하도록 한다. 이 패킷은 올바른 DNS 서버에 도달하기 전에 여러 네트워크를 이동한다. 패킷은 목적지에 도달하는 가장 빠른 방법을 찾아내기 위해 라우팅 테이블을 사용한다. 만약 가는 도중 패킷이 손실되었다면, 요청한 URL의 DNS를 찾지 못했다는 것이다.
브라우저가 올바른 IP 주소를 수신하면 IP 주소와 일치하는 서버와 연결해 정보를 전송한다.
브라우저는 인터넷 프로토콜(IP, Internet Protocol)을 사용하여 이러한 연결을 구축한다. 사용할 수 있는 여러가지 인터넷 프로토콜이 있지만, 일반적으로 HTTP 요청에서는 TCP(Transmission Control Protocol)이라는 전송 제어 프로토콜을 사용한다.
내 컴퓨터(클라이언트)와 서버 간에 데이터 패킷을 전송하려면 TCP 연결을 해야 한다. 이 연결은 TCP/IP 3-way handshake라는 연결 과정을 통해 이뤄진다. 클라이언트와 서버가 SYN(synchronize: 연결 요청) 및 ACK(acknowledgement: 승인) 메세지를 교환하여 연결을 설정하는 3단계 프로세스이다.

1) 클라이언트는 인터넷을 통해 서버에 SYN 패킷을 보내 새 연결이 가능한지 여부를 묻는다.
2) 서버에 새 연결을 수락할 수 있는 열린 포트가 있는 경우, SYN/ACK 패킷을 사용하여 SYN 패킷의 ACK(승인)으로 응답한다.
3) 클라이언트는 서버로부터 SYN/ACK 패킷을 수신하고 ACK 패킷을 전송하여 승인한다.
이 과정을 통해 데이터 전송을 위한 TCP 연결이 설정되었다.
TCP 연결이 설정되면 데이터 전송이 시작된다. 브라우저는 www.google.com 웹 페이지를 요청하는 GET 요청을 보내게 된다.
만약 자격 증명(credentials)을 입력하거나 form을 제출하는 경우 POST 요청을 사용할 수 있다. 이 요청에는 브라우저 식별(User-Agent 헤더), 수락할 요청 유형(Accept 헤더) 및 추가 요청을 위해 TCP 연결을 유지하라는 연결 헤어돠 같은 추가 정보도 포함된다. 또한 브라우저가 이 도메인에 대해 저장한 쿠키가 가져온 정보도 전달한다.
서버에는 웹 서버(예. Apache, IIS)가 포함되어 있는데, 이는 브라우저로부터 요청을 수신하고, 해당 내용을 request handler에 전달하여 응답을 읽고 생성하는 역할을 한다. Request handler는 요청, 요청의 헤더 및 쿠키를 읽고 필요한 경우 서버의 정보를 업데이트하는 프로그램이다(NET, PHP, Ruby, ASP 등으로 작성됨). 그런 다음 response를 특정 포맷으로(JSON, XML, HTML)으로 작성한다.
서버 응답에는 요청한 웹 페이지와 함께 상태 코드(status code), 압축 유형(Content-Encoding), 페이징 캐싱 방법(Cache-Control), 설정할 쿠키, 개인 정보 등이 포함 된다.
status code는 response의 상태를 알려주기 때문에 매우 중요하다. 숫자 코드를 사용해 HTTP 응답 결과를 다섯 가지 상태로 나타낸다.
브라우저는 응답받은 HTML을 화면에 단계별로 표시한다.