"www.google.com을 주소창에 입력하고 엔터를 눌렀을 때 무슨 일이 일어날까요?"
프론트엔드 면접에서 정말 자주 나오는 질문 중 하나다. 단순해 보이지만 웹의 전체적인 동작 원리를 이해하고 있는지 확인할 수 있는 좋은 질문이기도 하다.
이번 글에서는 주소창에 URL을 입력했을 때부터 웹페이지가 화면에 표시되기까지의 전체 과정을 차근차근 알아보자!
주소창에서 웹페이지가 렌더링되기까지는 크게 다음과 같은 단계를 거친다.
이 과정은 마치 편지를 보내는 것과 유사하다.
받는 사람의 주소를 확인하고, 우체국을 거쳐 편지를 전달하고, 답장을 받는 과정과 같다고 생각하면 이해하기 쉽다.
사용자가 https://www.google.com/search?q=frontend를 입력했다고 가정하자.
브라우저는 이 URL을 다음과 같이 분해한다.
https:// (보안 HTTP 통신)www.google.com (서버 주소)/search (요청할 페이지)?q=frontend (검색어)만약 프로토콜이 생략되었다면 브라우저가 자동으로 https://를 붙여준다. 요즘은 보안을 위해 HTTPS가 기본이 되었기 때문!
우리는 www.google.com이라는 친숙한 이름을 사용하지만, 실제 컴퓨터들은 172.217.175.4와 같은 IP 주소로 통신한다. 아무래도 당연하다. 알파벳은 인간끼리 대화하기 위해 만들어졌으니 컴퓨터는 인간의 언어를 자신들만의 언어로 번역하는 과정이 필요할 것이다 !
DNS(Domain Name System) 조회 과정은 다음과 같다.
이 과정은 마치 전화번호부에서 이름으로 전화번호를 찾는 것과 같다.
IP 주소를 알았으니 이제 서버와 연결해야 한다. 이때 TCP 3-Way Handshake라는 과정을 거친다.
클라이언트 → 서버 : SYN (연결 요청)
서버 → 클라이언트 : SYN-ACK (연결 승인 + 역방향 연결 요청)
클라이언트 → 서버 : ACK (최종 연결 확인)
이는 두 사람이 전화통화를 시작할 때 "여보세요?" → "네 여보세요?" → "네 안녕하세요"라고 확인하는 과정과 비슷하다.
HTTPS의 경우 여기에 TLS Handshake가 추가로 필요하다. 보안 통신을 위한 암호화 키를 교환하는 과정이다.
연결이 완료되면 브라우저는 서버에 HTTP 요청을 보낸다.
GET / search?q=frontend HTTP/1.1
Host: www.google.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/118.0.0.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-LanguageL ko-KR,ko;q=0.8,en-US;q=0.5,en;q=0.3
Connection: keep-alive
/search?q=frontend서버는 이 요청을 처리하고 응답을 보낸다.
HTTP/1.1 200 OK
Content-type: text/html; charset=UTF-8
Content-Length: 12345
Cache-Control: max-age=3600
<!DOCTYPE html>
<html>
<head>
<title>검색 결과</title>
<link rel="stylesheet" href="stye.css">
</head>
<body>
<!-- HTML 콘텐츠 -->
<script src="app.js"></script>
</body>
</html>
이제 브라우저는 HTML을 파싱하면서 추가로 필요한 리소스들(CSS, JS, 이미지 등)을 발견하면 추가 요청을 보낸다.
드디어 화면에 그릴 차례다. 이 과정은 이전 글에서 다뤘던 렌더링 파이프라인과 연결된다.
JavaScript가 있다면 파싱 중간에 실행되어 DOM을 조작할 수도 있다.
각 단계에서 성능을 개선할 수 있는 방법은 어떤 것들이 있을까?
주소창에 URL을 입력하는 순간부터 웹페이지가 화면에 나타나기까지는 생각보다 많은 과정을 거친다.
DNS 조회부터 TCP 연결, HTTP 통신, 브라우저 렌더링까지... 이 모든 과정이 몇 초 만에 완료된다는 것이 신기하면서도 웹 기술의 발전을 실감하게 된다.
이런 기본 원리를 이해하면
개발자로서 겉으로 보이는 결과물뿐만 아니라 그 이면의 동작 원리를 아는 것이 얼마나 중요한지 새삼 느끼게 되는 주제였다 🤔