개발 지식/웹

웹사이트 접속 시에 무슨 일이 벌어지는가?

트리맨스 2022. 11. 19. 21:15
반응형

 

이미 다른 블로그에서 한번씩 정리한 것 같지만, 직접 정리하는 편이 낫다고 생각해서 따로 정리해본다.

 

용어정리


DNS : 도메인 네임 (시스템) 서버는 URL들의 이름과 IP주소를 저장하고 있는 DB이다. 아이피 주소와 URL을 매핑시켜준다.

TCP/IP : 데이터가 웹을 이동하는 방법을 나타내는 통신 규격이다. 

HTTP : 클라이언트와 서버가 통신할 수 있게 하기 위한 언어를 정의하는 어플리케이션 규약.

 

이제 웹사이트 접속 시에 일어나는 일들을 차례대로 정리해 보자.

 

브라우저가 해당 도메인주소와 대응하는 IP주소를 확인


먼저 해야할 것은 나의 IP주소, DNS서버의 IP주소를 찾아야 한다.

위 작업을 하기 위해서는 LAN 밖으로 나가는 Gateway Router를 찾아야 한다. 이것의 IP를 얻기 위해서는 라우팅 테이블이 필요한데, 이것은 DHCP가 자동으로 관리하거나 수동으로 관리한다. DHCP가 관리할 경우에 라우팅 테이블을 얻기 위해서 DHCP 브로드캐스트를 보내고, DHCP에서 Gateway Router의 IP, 나의 IP, DNS서버의 IP를 얻는다. 이후에는 Gateway Router의 Mac 주소가 필요한데, ARP통신을 이용해서 Gateway Router의 Mac 주소를 얻는다. 이제서야 패킷이 LAN밖으로 나갈 수 있다.

다음으로 할 일은 도메인이 가르키는 IP주소를 얻어야 한다. 이 IP주소를 통해서 해당 웹사이트를 호스팅하고 있는 서버 컴퓨터에 접근이 가능하다. 구글의 IP주소를 알아보고 싶으면 nslookup www.google.com을 입력하면 IP주소가 나오게 된다. 구글 사용자는 매우 많아서 서버 IP주소는 여러개가 있고, nslookup은 내가 접근 가능한 IP주소를 보여준다.

브라우저에 웹사이트 이름을 치면 4개의 캐시에서 IP 주소를 확인한다.

  1. 브라우저 캐시 확인
  2. OS 캐시 확인 (systemcall을 활용)
  3. router 캐시 확인 (DNS 기록을 캐싱하고있는 router와 통신)
  4. ISP 캐시 확인 (ISP는 DNS서버를 구축하고 있으므로 혹시 모르니 확인)

여기서 캐시를 찾으면 다음 단계로 넘어가고, 캐시를 찾지 못하면 DNS query를 날려서 아이피 주소를 찾으려고 한다. 여기서 ISP의 DNS서버를 DNS cursor라고 부르고, 여러 DNS 서버를 오가면서 계속 검색한다. 도메인 이름의 구조에 기반해서 검색하는데, 도메인 구조는 아래의 사진과 같다.

각 레벨별로 name서버가 있으며, 여기서 DNS lookup 프로세스에서 쿼리가 진행된다. 검색 순서는 DNS cursor가 루트 네임 서버에 연락하면, 그림에서 보듯이 위에서 아래로 진행되며 IP주소를 찾게 되면 DNS recursor로 보내게 된다.

 

갑자기 궁금해졌는데, DNS서버에서 IP를 따와야지 사이트 로딩이 시작되는거라 DNS서버는 응답속도가 상당히 중요할 것 같은 생각이 들어서 속도 비교하는 사이트에 가서 비교를 해 보았다.

Asia 지역에서는Cloudflare가 제일 빠르다고 나온다. 그런데 여기는 무료 네임서버에 SSL인증서도 준다. 만약 네임서버의 응답 속도를 빠르게 하고 싶다면, Cloudflare로 네임서버를 옮기는 것도 좋아 보인다. 하지만 난 AWS 사용자라 그냥 Route53 씀. 솔직히 그게 편하다.

 

브라우저와 서버 TCP connection


드디어 IP주소를 받았다. 이제 가상 회선을 수립해야 한다. 일반적으로 HTTP요청의 경우에는 TCP를 사용하므로, TCP connection을 사용해서 연결한다. TCP/TP three-way handshake 프로세스를 통해서 커넥션이 이루어진다. SYN과 ACK 메시지를 이용한다.

  1. 클라이언트에서 SYN(n)패킷을 서버에 보내고 커넥션 요청
  2. 서버가 커넥션 가능한 포트가 있다면 ACK(n+1) + SYN(m)패킷으로 응답
  3. 클라이언트는 SYN/ACK패킷을 받고 서버에세 ACK(m+1)패킷을 보냄

TCP 커넥션이 완료되었다.

 

브라우저가 웹 서버에 HTTP 요청


TCP 연결 이후 데이터를 전송하면 된다. 브라우저는 GET 요청을 통해 웹페이지를 요구한다. 이 때 GET 요청 안의 헤더, 쿠키, 데이터 등을 담아서 요청한다. 이거는 postman이나 axios, fetch 등의 도구를 사용해봤다면 한번쯤 들어봤을 법 하다.

 

서버에서 요청 받은 후 요청 반환


서버에서는 브라우저가 요청한 정보들을 기반으로 그에 맞는 응답값을 보낸다.

서버 애플리케이션은 request handler한테 요청을 전달한 후 response를 생성하게 한다. response는 요청한 웹페이지, status-code, content-encoding, caching-control, 캐시 등의 정보들을 종합해서 반환한다.

 

브라우저에서 HTML 컨텐츠 보여주기


브라우저에서는 웹 사이트의 컨텐츠들을 알맞게 조합해서 사용자가 사용할 수 있는 웹사이트를 보여준다. 여기서는 HTML, CSS, JS 등의 컨텐츠들이 코드에 맞게 보여지게 된다.

 

반응형

'개발 지식 > ' 카테고리의 다른 글

CORS 정리하기  (0) 2022.10.24
로그인 인증 부수기  (0) 2022.10.23