면접관 : naver.com.com을 주소창에 쳤을 때 화면에 나오기까지 아는대로 다 말해주세요.
나 : (이건 내가 ㄹㅇ 달달 외웠다)
브라우저 주소창에 ‘naver.com’을 입력하고 엔터 키를 누르면, 브라우저는 URL에서 ‘naver.com’이라는 호스트 이름을 추출합니다.
브라우저는 처음 방문하는 도메인에 대해 로컬 캐시를 확인한 후 DNS(Domain Name System)서버에 ‘naver.com’호스트 이름에 대한 IP주소를 요청합니다. DNS서버는 이 요청에 대해 ‘naver.com’도메인 이름에 대한 IP주소를 포함하는 DNS 레코드를 반환합니다.
브라우저는 IP주소를 사용하여 HTTP요청을 해당 서버에 보냅니다. 이 요청은 TCP/IP 프로토콜을 사용하여 전송됩니다.
서버는 요청을 받고, 요청에 대한 응답으로 HTML, CSS, JavaScript및 기타 웹 페이지 자산을 포함하는 HTTP응답을 생성합니다.
서버가 생성한 HTTP응답은 TCP/IP 프로토콜을 사용하여 브라우저로 전송됩니다.
브라우저는 HTTP 응답을 받고, 이를 해석하여 웹 페이지를 렌더링 합니다. 이 과정에는 HTML문서파싱, CSS스타일 적용, Javascript 코드 실행, 이미지 및 기타 자산 로딩 등이 포함됩니다.
(이전까진 브라우저 동작 관련 여기서부턴 랜더링 과정)
Resource Donwnloading : 브라우저는 서버로부터 HTML, CSS, JavaScript와 같은 웹사이트에 필요한 리소스를 다운 받습니다.
HTML DOM Tree 구축 : 렌더링 엔진은 전달받은 HTML 문서를 파싱(parsing)해서 DOM(Document Object Model, 문서 객체 모델) 트리 형성합니다.
CSSOM Tree 구축 : 이어서 다운 받은 외부 CSS 파일과 함께 포함된 스타일 요소를 파싱(parsing)해 CSSOM Tree 형성합니다.
Render Tree 구축 : DOM트리와 CSSOM 트리를 병합하여 렌더트리를 생성합니다. 렌더트리는 시각적 요소를 포함하는 트리 구조입니다. 렌더트리에서 시각적으로 표현되지 않는 요소(display: none)는 제거됩니다.
Rayout : 브라우저는 렌더 트리의 각 노드에 대해 레이아웃을 계산합니다. 이 단계에서 각 요소의 위치와 크기가 결정됩니다.
Paint : 레이아웃 과정이 끝나면 요소에 스타일을 적용하는 paint과정을 거칩니다. 계산된 스타일 정보를 바탕으로 각 요소의 스타일이 적용되고 브라우저는 렌더트리의 노드를 순회하며 각 요소를 그립니다.
마지막으로 브라우저는 다양한 레이어를 합성하여 최종적인 페이지를 생성하고 생성된 페이지를 사용자에게 표시합니다.
면접관 : 그럼 google.com에서 새로고침하면 1번 과정부터 다시 진행하나요?
나 : (...) 서버에서 캐시.. 하지 않을까요..? (속으로 내 자신에게 백번 천번 욕했다고 한다..)
최초 조회 후 얻은 DNS 응답(IP 주소)은 캐시(cache)에 저장되어 일정 시간 유지됩니다.
DNS 레코드에는 TTL(Time to Live) 값이 있어 얼마나 오래 캐시할지를 지정하는데, 브라우저나 OS는 이 TTL 기간 동안 해당 도메인 이름에 대해 재조회 없이 캐시된 IP를 재사용합니다.
예를 들어 naver.com의 DNS TTL이 5분이라면, 최근에 조회한 지 5분 이내에 사용자가 새로고침을 하면 DNS 재질의 없이 기존에 알아둔 IP로 바로 접속합니다.
1. 애플리케이션 캐시 (chrome, firefox등은 내부 DNS 캐시를 운영함)
: 웹 브라우저가 자체적으로 DNS캐시를 유지합니다. 브라우저 자체가 캐시를 가지고 있는 경우 우선 참고하고, 캐시가 없거나 만료되었으면 OS레벨 캐시를 조회합니다.
2. 운영체제 캐시 (예: Windows의 DNS Client 서비스, macOS의 mDNSResponder 등)
: 로컬 시스템의 DNS 해석기가 DNS조회 결과를 캐싱합니다. 해당 도메인/IP 기록이 남아있다면 즉시 반환하고, OS캐시에도 없으면 최종적으로 네트워크상의 DNS재귀 서버까지 질의가 진행됩니다.
3. 네트워크상의 DNS 재귀 서버(예: 사용자 ISP의 DNS 혹은 8.8.8.8과 같은 공용 DNS)
: DNS 서버로부터 받은 응답을 TTL 동안 저장하고 있기 때문에, 자주 조회되는 도메인의 경우 재귀 서버 캐시에 이미 존재하여 권한 서버까지 가지 않아도 되는 경우가 많습니다.
즉, 사용자가 새로고침을 눌렀을 때 반드시 매번 DNS 루트부터 조회하는 것이 아니라, 대부분의 경우는 브라우저/OS/재귀서버 어딘가의 캐시에 히트하여 응답 시간이 매우 짧습니다. (참고로 TTL이 만료되어 캐시에서 제거되면, 다음 새로고침 시에는 다시 DNS 요청이 발생하여 최신 IP를 가져오게 됩니다.)
콘텐츠 전송 네트워크로, 웹사이트나 애플리케이션의 콘텐츠(HTML, CSS, 이미지, 비디오 등)를 사용자가 있는 지역 가까운 서버에서 빠르게 제공하기 위한 분산 네트워크입니다.
CDN의 주요 목적은 콘텐츠를 전 세계에 분산된 서버(엣지 서버)를 통해 제공하여, 로드 시간을 단축하고 서버 부하를 줄이며 네트워크 지연을 최소화합니다.
Cloudflare나 Akamai와 같은 CDN을 쓰는 경우, 전세계 사용자들에게 짧은 TTL로 NS레코드를 전파하더라도, 각 지역의 재귀 DNS서버들이 캐시하여 일정 기간 유지하므로 권한 DNS에 부담을 줄입니다.
또한 사용자 단에서도, 한번 연결된 CDN 엣지 서버의 IP는 TTL 동안 유지되므로 같은 엣지를 통해 통신이 계속 이루어져 양쪽 모두 효율적입니다.
naver, google과 같은 대형 웹사이트는 일반적으로 자체 CDN또는 전용 로드밸런싱 DNS를 사용해 다수의 서버로 트래픽을 분산합니다. 예를 들어 전세계/전국에 분산된 서버 풀 중 최적의 서버 IP를 반환하도록 DNS를 구성하고, TTL을 비교적 짧게 설정하는 전략을 취할 수 있습니다.
브라우저 새로고침시 DNS동작은 캐시의 영향으로 결정됩니다.
OS 및 브라우저 레벨의 DNS 캐시에 유효한 기록이 있다면 즉시 사용하고, 없다면 재귀 DNS 서버에 질의가 발생합니다.
이 모든 계층에서 TTL이 중요하게 활용되며, 적절한 TTL 설정은 사용자가 연속적으로 페이지를 요청할 때 매번 DNS 조회 지연이 발생하지 않도록 하는 핵심입니다.
네트워크 측면에서 캐싱 덕분에 naver.com을 자주 새로고침해도 매번 DNS 서버에 부하를 주지는 않으며, CDN 구조 하에서 사용자들은 대부분 가장 가까운 캐시/엣지로 연결되어 빠르게 콘텐츠를 전달받게 됩니다.
전 개똥벌레 감자라서요, 추가적인 지식이나 틀린 부분 있으면 댓글로 지적해주시면 감사하겠습니다요들