2023-02-21

브라우저 렌더링 과정

브라우저의 구성 요소와 렌더링 과정을 자세히 알아보자!

브라우저

브라우저의 본질은 서버에서 전달받은 자원(HTML, CSS, JS)를 사용해, 웹 페이지를 렌더링하는 것이다.

구성 요소

HTML 파싱 및 DOM 생성 과정

  1. 서버로부터 HTML 문서를 이진수 형태로 응답받고, 인코딩 형식에 따라 문자열로 변환한다.
  2. 변환된 문자열을 토큰화를 통해 최소 단위인 토큰으로 분해한다.
    토큰은 태그, 텍스트, 주석 등과 같은 HTML 문법의 작은 조각을 의미한다.
    토큰은 아래와 같이 생겼다.
{
startTag: 'html',
content: {...},
endTag: 'html',
}
  1. 토큰을 사용해 DOM 노드(객체)로 변환하는 토큰 파싱 과정을 거친다.
    이 과정에서 각 노드는 부모 자식 관계를 형성한다.
  2. 파싱된 DOM 노드들을 연결하여 DOM 트리를 구성한다.

CSS 파싱 및 CSSOM 생성 과정 또한 위와 같이 비슷하게 동작한다.

자바스크립트 파싱 과정

브라우저는 DOM을 생성하다 스크립트를 만나면 제어권을 자바스크립트 엔진에 넘기고,
엔진은 해당 스크립트 코드를 파싱하여 AST(Abstract Syntax Tree)를 생성한다.
AST는 인터프리터나 JIT 컴파일러에 의해 실행된다.
브라우저는 스크립트를 만나면 제어권을 넘겨 DOM 형성이 지연될 수 있기 때문에,
바디 요소 아래에 위치하는 방법을 사용하거나 스크립트 태그에 async, defer 속성을 사용한다.

리플로우와 리페인트

리플로우는 노드 추가 삭제, 요소 크기 위치 변경 등 레이아웃 계산을 다시 하는 것을 말한다.
리페인트는 리플로우로 재결합된 렌더 트리를 기반으로 다시 렌더링하는 것을 말한다.
레이아웃에 변경이 없는 경우 리페인트만 실행된다.

큰 틀에서 보는 브라우저 동작 과정

우리가 어떤 웹 서버에 접속해 자원을 얻으려면 서버에 접속하기 위한 IP가 필요하다.
이를 얻기 위해 해당 도메인 주소로 매핑된 주소가 있는지,
로컬 hosts 파일과 DNS Cache를 확인하는 과정을 먼저 밟는다.
이 과정에서 캐싱이 미스되면 DNS에 요청하게 되는데,
보통 ISP에서 제공한 로컬 DNS로 하며 설정으로 공유기를 통한 DNS 요청도 가능하다.
만약 해당 도메인에 대해 기업이 CDN 또는 GSLB에 위임한 경우, DNS에서 해당 IP를 제공한다.
이렇게 해당 서버 IP를 얻은 후 TCP 통신을 요청하고 3-way-handshake 과정을 통해,
혼잡정책윈도우 사이즈 등의 정보를 공유한다.
연결이 성공적으로 이루어지면 서버에 HTTPRequest를 요청하고,
서버는 HTML, CSS, JS, 이미지 등의 자원을 응답한다.
브라우저의 렌더링 엔진은 HTML, CSS를 파싱해 DOM과 CSSOM을 형성하고 이를 조합해 렌더 트리를 생성한다.
이때 스크립트를 만나면 JS 엔진에 제어권을 넘겨 JS 파싱과 실행을 동작하게 한다.

참조

모던 자바스크립트 Deep Dive - 위키북스
널널한 개발자 - 초창기 웹 서비스 구조
널널한 개발자 - 웹 서비스 3대 요소
널널한 개발자 - 웹 브라우저에 URL 입력하면 일어나는 일 - 인프라 위주