HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
🌳
말하면서 배워요 스터디
/
📒
브라우저 렌더링
📒

브라우저 렌더링

생성일
Sep 7, 2022 06:48 AM
태그
태그 위치
대주제
상태
In progress(필수)
소주제
브라우저렌더링
유형
FE
수경
인수
인수
준혁
준혁
창민
창민

인수

1. 브라우저란

1.1 정의

  • 브라우저란 사용자가 선택한 자원을 서버에 요청하고, 화면에 표시하는 소프트웨어 이다.
    • 자원은 HTML 문서, PDF, 이미지 등의 형태를 가지며, 자원의 주소는 URI에 의해 정해진다.
  • 브라우저는 HTML과 CSS 명세에 따라서 파일을 해석하고 표시한다.
    • 이 명세는 웹 표준화 기구 W3C에서 정한다.
    • +@ 브라우저의 UI는 표준을 정하지 않았지만, 서로의 장점을 모방하며 유사한 기능을 가지고 있다.

1.1 브라우저 구성 요소

notion image
 
1) 사용자 인터페이스
2) 브라우저 엔진
3) 렌더링 엔진
 
4) 통신
5) UI 백엔드
6) 자바스크립트 해석기
7) 자료 저장소
 
  • 2) 브라우저 엔진은 1)사용자 인터페이스와 3)렌더링 엔진 사이의 동작을 제어 한다.
  • 3) 렌더링 엔진은 요청한 컨텐츠를 표시한다.
    • HTML을 요청하면, HTML과 CSS를 파싱하여 화면에 표시하는 일
    • 모질라에서 만들어 파이어폭스에서 사용 중인 개코(Gecko)엔진과 크롬과 사파리가 사용하는 웹킷(Webkit)엔진이 존재
  • +@ 크롬 브라우저는 다른 브라우저와 달리, 각 탭 마다 별도의 렌더링 엔진 인스턴스를 유지하여 독립된 프로세스로 처리된다.
 

2. 렌더링 엔진의 동작과정

2.1 기본 동작 과정

  • 요청한 문서를 획득 > 1) DOM트리 구축 > 2)렌더트리 구축 > 3) 렌더트리 배치 > 4) 렌더트리 그리기
    • 일련의 과정은 점진적으로 진행된다.
    • 모든 HTML 파싱되기를 기다리지 않고, 먼저 배치와 그리기 과정을 시작한다.
    • 네트워크로 부터 파일을 기다리는 동시에, 일부를 화면에 먼저 표시할 수 있다.
 
  • HTML 문서를 파싱하여, HTML의 태그를 1)DOM 노드로 변환한다.
    • 이 때 CSS 파일과 같은 스타일 요소도 파싱한다.
  • DOM 트리와 CSSOM은 화면을 그리기 위한 “2)렌더트리”를 생성한다.
    • 렌더트리는 색상 또는 면적과 같은 Box모델을 포함하고 있다.
    • 이 Box모델은 정해진 순서에 따라 화면에 표시된다.
  • 렌더트리 생성 이후 3)렌더트리 배치가 시작된다.
    • 배치는 렌더트리의 각 노드(box모델)들이 화면에 표시될 위치를 지정하는 일이다.
  • 배치가 완료되면 UI 백엔드에서 렌더트리의 노드들을 4)실제 화면에 그려낸다.
 
 

2.2 DOM 트리 구축

[2.1 파싱이란]
  • 브라우저가 코드를 이해하고 사용할 수 있는 구조로 변환하는 것
  • 주로 트리 형태로 표현
  • ‘어휘분석 + 구문분석’ 의 반복
[2.2 HTML 파싱]
  • HTML 파서는 HTML 마크업 문서를 파싱 트리(parse tree)로 변환
  • HTML은 너그러운 규칙이 적용되기 때문에 정규 파서로 파싱할 수 없다.
  • 파싱알고리즘
    • ‘토큰화와 트리 구축’의 반복
      • 1)토큰화는 ‘어휘 분석’으로 입력 값을 토큰으로 파싱
      • 2)트리 구축은 토큰화 단계에서 만들어진 토큰 값을 입력으로 받아, 알고리즘에 따라 일련의 과정을 거치며 DOM 트리를 수정(추가)한다.
    • 3) 파싱이 종료되면 브라우저는 문서와 상호작용할 수 있게 된다.
      • 따라서 문서 파싱 이후 실행되어야 하는 ‘지연 모드 스크립트’를 파싱하기 시작한다.
      • 문서 상태는 ‘완료’가 되고, ‘로드’ 이벤트가 발생
[2.3 CSS 파싱]
  • CSS는 문맥 자유 문법이다.
  • 파싱 결과 CSS 파일은 ‘스타일 시트 객체’로 파싱 된다.
    • 스타일 시트의 객체는 각각 자신의 CSS 규칙을 포함한다.
      • CSS 규칙은 1) 선택자, 2) 선언 객체, 3)CSS 문법이 일치하는 다른 객체를 포함한다.
      • notion image
[2.4 스크립트 파일과 스타일 시트진행 순서]
  • 중요 웹은 파싱과 실행이 동시에 수행되는 동기화 모델(synchronous)이다.
  • 스크립트 파일의 파싱 순서
    • 문서파싱 중 <script> 태그 를 만날 경우 1) 진행되던 문서 파싱을 중단하고 2) <script>의 파싱, 다운로드, 실행이 진행된다.
      • 이것은 파싱시간의 증가 및 예상치 못한 오류의 발생 가능성을 높인다.
      • 해결 1) HTML5에서 <script defer> 속성을 통해, 문서 파싱 완료 이후 스크립트를 실행되도록 할 수 있다.
        • 문서의 다운로드는 비동기적으로 바로 진행되고, 문서 파싱 이후에 스크립트가 실행된다.
  • 스타일 시트의 파싱 순서
    • 기본적으로 스타일 시트는 DOM 트리에 영향을 주지 않기 때문에, ’문서파싱’과 ‘CSS 파싱’은 병렬적으로 이루어질 수 있다.
    • 단, 스크립트가 실행 중 문서의 스타일 정보를 요청하는 경우가 존재한다.
      • 로드되지 않은 스타일 시트 중 문제가 될만한 속성이 있다면 스크립트를 중단 (웹킷)
      • 로드 중이거나 파싱 중인 스타일 시트가 있는 경우, 모든 스크립트를 중단 (파이어폭스)

2.3 렌더트리 구축

  • 렌더트리는 화면에 요소들을 올바른 순서로 그려내기 위한 목적을 가진다.
  • 렌더트리의 요소는 1) 표시 순서 및 2) 문서의 시각적인 구성 요소 를 가지고 있다.
    • 2) 문서의 시각적 구성 요소를 렌더러/렌더객체(웹킷) 혹은 형상(파이어폭스) 이라고 부른다.
 
[3.1 렌더객체(Render Object)]
  • 렌더 객체는 자신과 자식요소를 어떻게 배치하고, 그려내야 하는지에 대한 정보를 가진다.
    • DOM node, RenderStyle, RenderLayer, layout() , paint() , repaintRect()
      • 어떤 돔 노드에, 어떤 스타일을 가지고, 몇 번째 layer에 그려질 요소인가
      • 배치(layout), 그리기(paint), 다시 그리기(repaint)의 동작
  • 렌더트리에 존재하는 렌더 객체는 이후 기하학적 정보(너비, 높이 위치등)을 포함한 ‘box-model’ 로 변환되어 그려진다.
    • 이 때, 실제로 보여질 수 있는 렌더 객체만이 렌더트리에 추가되어, box-model로 변환된다.
      • display:none 은 렌더트리에 담기지 않고, box-model로 변환되지 않음
      • visibility:hidden 은 렌더트리에 담기며, box-model로 변환됨
[DOM트리와 렌더트리의 관계]
  • 렌더러는 DOM 요소에 부합하지만 1:1로 대응하는 관계는 아니다.
    • display: none & visibility: hidden
    • select 요소는 3개의 렌더객체를 가짐 (표시영역, 드롭다운목록, 버튼)
[트리의 구축과정]
  • 렌더트리의 최상단 요소(root)는 뷰포트(RenderView)이다.
  • 스타일을 계산하여 결정하고, 렌더러를 만드는 과정을 어태치먼트(attachment)라고 한다. 웹킷
 
  • html태그 및 body태그가 처리되면서 렌더 트리의 최상단 요소가 생성된다.
  • 나머지 렌더트리 요소는, DOM노드가 추가되며 생성된다.
 
🤨
해당 내용은 아직 온전히 이해하지 못하여, 포스팅에서 제외함
스타일 계산
[스타일 계산]
  • problem 스타일 계산은 ‘CSS파일이 파싱된 스타일시트, 인라인스타일 요소, HTML의 시각적 속성등’을 모두 고려해야하고, 이에 따라 복잡한 처리 및 성능/메모리 문제를 발생시킨다.
  • solution
    • 1) 스타일 정보의 공유
      • 노드가 형제/사촌일 경우 공유
      • 공유 조건
    • 2) 자식으로의 속성 상속 (구조체 분리)
      • 특정 구조안에서의 속성은 상속 받는다.
      • reset 속성을 통한 사용여부 관리
      • 선, 색상 , 글자크기 등
    • 3) 규칙트리 사용
      • 스타일 객체는 전체 또는 일부를 공유
    • 4) 선택자 규칙 적용
      • 클래스맵 & 아이디맵 & 태그 맵 활용

2.4 렌더트리 배치

  • 배치란 렌더러가 생성되어 트리에 추가될 때, 크기와 위치 정보는 없는데 이런 값을 계산하는 것을 배치 또는 리플로라고 부른다.
  • 즉 리플로(reflow)단계는 렌더 객체의 기하학적인 정보(크기,위치)를 계산하는 단계
 
[ HTML 은 흐름 기반의 배치모델 ]
  • 단일 경로를 통해 크기와 위치정보를 계산한다는 것
  • 나중에 등장한 요소가, 앞서 등장한 요소의 위치와 크기에 영향을 미치지 않는다는 것을 의미
    • 배치는 왼쪽에서 오른쪽, 위쪽에서 아래로 흐름
    • 표와 같이 예외도 존재 (자식요소가 상위요소의 크기에 영향을 미침)
  • 모든 렌더객체는 layout() 메서드를 가지고, 메서드 실행 시 자식의 layout 메소드를 실행한다.
 
[더티 비트체계]
  • 소소한 변경을 위해 전체를 다시 배치하지 않기 위해 사용하는 체제
  • 다시 배치할 필요가 있는 변경요소 및 추가된 요소와 자식들을 ‘더티’라고 표시한다
    • 자신의 배치가 필요할 경우 ‘더티’ 플래그
    • 자식 중 하나라도 다시 배치가 필요할 경우 ‘자식 더티’ 플래그
 
[전역배치와 점증배치]
  • 전역배치는 1) 전역스타일 변경과 2) 화면 크기 변경 에서 발생
    • 전역스타일 변경은 글꼴 크기 변경과 같이 모든 렌더러에 영향을 미치는 속성의 변경
  • 점증배치는 오직 더티 렌더객체와 그 자식 객체들이 배치되는 것을 의미
    • 렌더러가 ‘더티’상태 일 때 비동기적으로 발생
    • 네트워크 요청으로 부터 받은 추가 내용으로 DOM 트리의 변화가 발생할 경우, 새로운 렌더러가 렌더트리에 붙으면서 발생하는 경우
 
  • 전역배치는 보통 동기적으로 실행
  • 점증배치는 비동기적으로 실행된다.
    • 점증배치를 위해 리플로(reflow)명령을 쌓아놓고, 타이머에 따라 한 번에 실행
    • 혹은 네트워크로 부터 자원을 받은 이후, DOM 트리 추가 직후 배치
 
[최적화]
  • 배치가 “크기 변경” 혹은 “렌더러 위치 변화” 로 실행되는 경우 렌더러의 크기는 다시 계산하지 않고 캐시로 부터 가져옴
    • input태그의 텍스트를 입력하는 경우
      • 변화 범위가 한정적이고, 주변에 영향을 미치지 않기 때문에, 하위트리만 배치가 발생
[배치과정]
  • 1) 부모 렌더러가 자신의 너비를 결정 (width)
  • 2) 부모가 자식을 검토
    • 자식 렌더러의 배치(x,y 좌표 결정)
    • 더티 상태, 전역 배치 상태인 경우, 자식의 배치를 호출하여 높이를 계산
  • 3) 자식의 누적된 높이,여백, 패딩을 계산하여 자신의 높이를 설정 (height)
  • 4) 더티 비트 플래그를 제거
 

2.5 렌더트리 그리기

  • 그리기 단계에서는 1) 화면에 내용을 표시하기 위한 렌더 트리가 탐색되고 2) 렌더러의 "paint" 메서드가 호출된다.
 
[그리기 순서 ]
  • 쌓임맥락 (stacking contexts)라고도 함
  • block 속성을 가진 렌더객체는 다음과 같이 그려진다.
    • 아웃라인 > 자식> 테두리 > 배경 이미지 > 배경 색,
[ 리페인트(repaint) ]
  • 웹킷의 경우, 리페인팅 전의 사각형들을 비트맵으로 저장한다.
    • 리페인팅이 발생했을 때, 새로운 사각형과 비교하여 차이가 있는 부분만을 다시 그린다.
  • 파이어폭스는 사각형을 위한 적적할 렌더러를 포함하여 한 번에 그려낸다.
    • 여러번 리페인팅 하지 않고, 한 번의 탐색을 거쳐 배경색, 배경이미지, 테두리 등을 그린다.
    •  
[동적변경 - 리플로우와 리페인팅]
  • 리페인트 발생 조건
    • 특정 요소의 색깔만 바뀔 경우, 해당 요소만 리페인팅 발생
  • 리플로우 발생 조건
    • 요소의 위치만 변경될 경우, 1) 해당 요소와 2) 자식, 3)형제 렌더 객체에서 리플로우 및 리페인팅이 발생
 

2.6 위치 결정 방법

🤨
해당 내용은 아직 온전히 이해하지 못하여, 포스팅에서 제외함 - 위치 결정은 언제 되는건지? 페인트단계에 고려되며 그려지는 것인가?
[위치 결정 방법]
  • 위치는 3가지 방법에 따라 결정된다.
    • Normal : DOM트리와 자리가 같아, 박스유형과 크기에 따라 배치됨
      • position: static(기본값), position : relative
    • Float : Normal로 배치 후, 왼쪽/오른쪽으로 흐르며 배치
      • float: right | left
    • Absolute : 기존 DOM 트리의 렌더트리와는 다른 별도의 렌더트리에 놓임
      • position: absolute | fixed , top, bottom, left, right

참고

  • Main 참조 (브라우저는 어떻게 동작하는가)
    • NAVER D2
      NAVER D2
      https://d2.naver.com/helloworld/59361
       
  • CSS 그리기 순서
    • [CSS] Stacking context
      3개의 div 에 span 으로 각각 bg color 를 적용하였고, position 은 absolute 입니다. red 는 z-index가 1입니다. 나머지는 없습니다. 여기서 아래 조건을 지키면서 red를 green 과 blue 뒤로 보내보세요. z-index 는 아주 간단해 보입니다. 높은 z-index를 가지고 있는 element 는 낮은 것보다...
      [CSS] Stacking context
      https://dongmin-jang.medium.com/css-stacking-context-172f9bd1af8b
      [CSS] Stacking context

창민

HTML 파싱 중단 시점에 대한 의문점

렌더링 엔진은 DOM을 생성해 나가다가 CSS를 로드하는 link 태그나 style 태그를 만나면 DOM 생성을 일시 중단한다. - 모던 자바스크립트 Deep Dive
How the browser renders a web page? - DOM, CSSOM and Rendering
In this article, we will deep dive into DOM and CSSOM to understand how the browser renders a webpage. The browser blocks some rendering of a webpage until certain resources are loaded first while other resources are loaded asynchronously.
How the browser renders a web page? - DOM, CSSOM and Rendering
https://medium.com/jspoint/how-the-browser-renders-a-web-page-dom-cssom-and-rendering-df10531c9969
How the browser renders a web page? - DOM, CSSOM and Rendering
위 글에서 이해한 바로는 “HTML 파싱을 직접적으로 멈추지는 않는다”라고 합니다
조금 더 설명하자면,
  • 외부 스타일시트를 불러오는 과정에서는 파싱을 멈추지 않는다
  • 내부 style 태그를 만나는 경우에는 CSSOM 트리를 생성을 마치고 다시 HTML 파싱을 이어간다
대부분의 글에서도 CSS는 렌더링을 차단하는 것이지 HTML 파싱을 차단하지는 않는다고 합니다
“CRP가 차단된다”와 “파싱이 중단된다”를 구분할 필요가 있을 것 같아요
❓
“CSS 파일이 로드되는 과정에서 HTML 파싱을 멈춘다” 에 대한 여러분의 생각이 궁금해요 아래에 각자의 지식? 생각? 을 적어주시면 감사합니다
[ 수경 ]
[ 인수 ]
  • 말 그대로 HTML 파싱 과정 중 CSS Link 혹은 script 태그(async, defer가 없는) 를 만나면, HTML 파싱과정이 블로킹된다.
    • HTML 파싱과정이 블로킹된다는 것은 ‘파싱’과 ‘렌더링’ 과정 모두를 차단(block)하는 것을 의미
    • CSS 파일 로딩 및 처리 이후, HTML 파서는 CSS Link 다음 문서들을 ‘파싱’하기 시작하고 렌더링 역시 진행된다.
  • 수정
    • 요거 찬찬히 읽어보고, 다시 생각해볼게요.
    • 이 글에서
      • Now the Render Tree nodes generated with older CSSOM will be repainted with new styles and it could also lead to Flash of Unstyled Content (FOUC) which is is very bad for UX. Hence browsers will wait until the stylesheet is loaded and parsed.
      • 이 부분이 제일 헷갈리네요..
      How the browser renders a web page? - DOM, CSSOM and Rendering
      In this article, we will deep dive into DOM and CSSOM to understand how the browser renders a webpage. The browser blocks some rendering of a webpage until certain resources are loaded first while other resources are loaded asynchronously.
      How the browser renders a web page? - DOM, CSSOM and Rendering
      https://medium.com/jspoint/how-the-browser-renders-a-web-page-dom-cssom-and-rendering-df10531c9969
      How the browser renders a web page? - DOM, CSSOM and Rendering
  • But 최신 브라우저는 '프리로드 스캐너'를 가지고 있어 !
  • 참고
    • 브라우저의 프리로드 스캐너(pre-load scanner)와 파싱 동작의 이해
      웹 개발자가 웹 페이지 속도를 개선하기 위해서 가장 먼저 알아야할 것은, 웹 페이지 로딩 속도 개선을 위한 테크닉이나 팁이 아닌 바로 브라우저의 동작 원리다. 우리가 최적화 하려고 노력하는 것 만큼, 브라우저도 웹페이지를 로딩할 때 최적화 하려고 더 노력한다. 하지만 우리의 이런 최적화 노력이 의도치 않게 브라우저의 최적화 노력을 방해할 수도 있다.
      브라우저의 프리로드 스캐너(pre-load scanner)와 파싱 동작의 이해
      https://yceffort.kr/2022/06/preload-scanner
      브라우저의 프리로드 스캐너(pre-load scanner)와 파싱 동작의 이해
      NAVER D2
      NAVER D2
      https://d2.naver.com/helloworld/5237120
      How the browser renders a web page? - DOM, CSSOM and Rendering
      In this article, we will deep dive into DOM and CSSOM to understand how the browser renders a webpage. The browser blocks some rendering of a webpage until certain resources are loaded first while other resources are loaded asynchronously.
      How the browser renders a web page? - DOM, CSSOM and Rendering
      https://medium.com/jspoint/how-the-browser-renders-a-web-page-dom-cssom-and-rendering-df10531c9969
      How the browser renders a web page? - DOM, CSSOM and Rendering
[ 준혁 ]

참고 자료

NAVER D2
NAVER D2
https://d2.naver.com/helloworld/59361
브라우저하면 가장 유명한 네이버의 그 글
개인적인 소감으로 아직도 이해하기 어려워요..
브라우저 렌더링 과정 이해하기.
최근에 백엔드 팀원들과 CS공부를 하면서, 주소창에 google.com 을 입력했을 때 일어나는 일에 대해 공부하였다. 이때 백엔드 팀원이 받아온 HTML 파일은 어떻게 브라우저에 그려지는지 물어보았는데, 명확하게 답을 하지못해서 내가 아직 브라우저 렌더링 과정을 정확하게 이해하지 못하고 있다는 걸 알게 되었다. 그래서 이번 시간에는 브라우저 렌더링 과정에 대해서 공부하고 정리해보려고 한다.
브라우저 렌더링 과정 이해하기.
https://tecoble.techcourse.co.kr/post/2021-10-24-browser-rendering/
브라우저 렌더링 과정 이해하기.
누군가가 브라우저 렌더링을 물어본다면? 위 글이 딱 적당한 것 같아요
[10분 테코톡] ☕️ 체프의 브라우저 렌더링
🙋‍♀️ 우아한테크코스의 크루들이 진행하는 10분 테크토크입니다. 🙋‍♂️ '10분 테코톡'이란 우아한테크코스 과정을 진행하며 크루(수강생)들이 동료들과 학습한 내용을 공유하고 이야기하는 시간입니다. 서로가 성장하기 위해 지식을 나누고 대화하며 생각해보는 시간으로 자기 주도적인 성장을 지향하는 우아한테크코스의 문화 중 하나입니다. 🌕우아한테크코스란 🌕 우아한테크코스는 일반 사용자용 서비스를 개발하는 회사가 필요로 하는 역량을 가진 프로그래머를 양성하기 위한 교육입니다.
[10분 테코톡] ☕️ 체프의 브라우저 렌더링
https://www.youtube.com/watch?v=sJ14cWjrNis
[10분 테코톡] ☕️ 체프의 브라우저 렌더링
브라우저 렌더링 발표 영상인데 이 분도 핵심과 함께 최적화까지 직접 보여주시면서 좋은 영상이라고 생각합니다
성능 최적화
애플리케이션 성능 최적화는 앱과 웹에서 모두 중요하다. 최근 웹 애플리케이션은 Ajax 통신, 복잡한 UI 등 많은 기능을 담으면서 크고 무거워졌다. 무거워진 웹은 긴 로딩 시간 함께 사용자 경험에 안 좋은 영향을 끼친다. Pinterest는 긴 로딩 시간으로 인해 사용자가 페이지를 나가는 비율이 높았는데, 최적화를 통해 사용자 이탈률을 줄이고 매출은 40%로 증가시켰다.
성능 최적화
https://ui.toast.com/fe-guide/ko_PERFORMANCE
성능 최적화
이 글도 👍
HTML
← 13 The HTML syntax - Table of Contents - 13.5 Named character references → 13.2 Parsing HTML documents 13.2.1 Overview of the parsing model 13.2.2 Parse errors 13.2.3 The input byte stream 13.2.3.1 Parsing with a known character encoding 13.2.3.2 Determining the character encoding 13.2.3.3 Character encodings 13.2.3.4 Changing
https://html.spec.whatwg.org/multipage/parsing.html

준혁

velog 트렌드에 해당 주제에 관련하여 글들을 보게 되었다. 이 글들을 보면서 이전의 글이 너무 빈약했던 것도 있고, 정리는 했는데 제대로 이해하지 못한 것 같아 다시 한번 흐름에 맞게 정리를 해 보려고 한다.
브라우저 검색창에 URL을 검색하면 어떤 과정을 통해 우리에게 보여주는 것일까?

TL;DR

브라우저의 검색창에 검색을 하게 되면, 크게 다음의 세 과정을 통해 우리에게 전달된다.
  1. URL 검증 및 네임 서버 탐색
  1. 네트워크 요청
  1. 렌더링
 

URL 검증 및 네임 서버 탐색

우선 브라우저 검색 창에 검색을 한 문자열이 URL인지, 아니면 단순 검색어인지 확인하는 작업을 거쳐야 한다. (최신 브라우저들은 검색 바와 검색엔진이 연결되어 있기 때문이다.)
  • 만약 문자열이 URL의 형태를 띄고 있지 않다면, 연결된 검색 엔진의 결과를 보여준다.
  • 만약 문자열이 URL이라면, 네임(DNS)서버에서 해당 도메인과 연결된 IP를 검색한다.
 
URL일 경우
만약 이전에 캐싱된 DNS 기록이 있다면, DNS 서버에 해당 도메인에 연결된 IP를 요청하지 않고 캐싱된 IP를 반환한다.
네트워크를 호출한다.
 
  • DNS: 도메인 이름 시스템을 의미하며, 기본적으로 웹에서 도메인을 정리하고 확인하는 전화번호부와 같은 역할을 한다.
 

네트워크 호출

네트워크 호출은 크게 세 단계로 이루어진다.
  1. TCP/IP 연결 시도
  1. 데이터 전송
  1. TCP/IP 세션 종료
 
TCP(transmission control protocol)은 데이터의 전송을 제어하고, 어떻게 보낼 지, 어떻게 맞출 지 정하게 된다.
IP Protocol만으로 통신을 할 수 없는 이유는, IP 프로토콜은 비신뢰성, 비연결성의 특징을 갖고 있기 때문에 데이터를 전달하기에는 부적합하다. 그렇기 때문에 신뢰성과 연결성의 특징을 갖는 TCP 프로토콜을 이용하여 통신을 진행한다.
 

TCP/IP 연결 시도

클라이언트와 서버간 3 way handshake 과정을 통해 연결을 초기화한다.
  1. 클라이언트가 서버에 접속을 요청하는 SYN(synchronize sequence number) 패킷을 보낸다.
  1. 서버가 패킷을 받으면, 다시 클라이언트로 접속을 수락하는 패킷인 ACK(Acknowlegement) 패킷을 보낸다. 이때 SYN flag와 함께 클라이언트로 발송한다.
  1. 클라이언트가 서버에 ACK 패킷을 발송하고, 연결이 이루어진다. 이 시점부터 데이터 교환이 이루어진다.
 

데이터 전송

현재 글에서 데이터 전송이란, 브라우저에 웹 사이트를 띄우기 위한 html, css javascript 등의 데이터를 의미한다.
 

TCP/IP 세션 종료

모든 데이터 송신이 끝났으면, 세션을 종료한다.
세션 종료는 4 way handshake로 이루어진다.
  1. 클라이언트가 연결을 종료하겠다는 FIN 패킷을 전송한다. (
  1. 서버는 확인 메시지를 보내고(ACK), 자신의 통신이 끝날 때까지 기다린다(CLOSE_WAIT). 클라이언트는 서버로부터 FIN 패킷을 받을 때 까지 기다리는 (FIN_WAIT)상태가 된다.
  1. 서버가 통신이 끝났으면 FIN 플래그를 클라이언트에 전송한다.
  1. 클라이언트는 확인했다고 ACK 플래그를 서버에 보낸다.
 
  • 패킷: 정보 기술에서 패킷 방식의 컴퓨터 네트워크가 전달하는 데이터의 형식화된 블록

렌더링

이제 브라우저가 웹 페이지를 띄우기 위한 데이터는 클라이언트에게 전달된 상태다. 그러나 데이터를 전달받았다고 해서, 바로 브라우저가 웹 페이지를 사용자에게 보여줄 수 있는 것은 아니다. 렌더링과정을 거쳐야만 비로소 사용자가 볼 수 있는 웹 페이지가 만들어진다.
렌더링 과정은 브라우저 엔진에서 진행하는 것이 아닌, 브라우저의 렌더링 엔진에서 모든 과정을 수행하며, 모든 과정을 수행한 뒤 페이지를 띄워주면 모든 과정이 완료되었다는 신호를 브라우저 엔진에게 보낸다. 이 이벤트가 ‘load’ 이벤트이다.

파싱

서버로부터 전송된 데이터는 바이트코드로 이루어진 텍스트 형식이다. 그러나 브라우저는 이를 읽을 수 없으므로, 파싱이라는 과정을 통해 브라우저가 읽을 수 있는 형식으로 변환하여야 한다.
파싱은 두 단계로 나눌 수 있다.
  1. 어휘 분석: 문자열을 의미 있는 작은 단위인 토큰으로 분해하는 작업
  1. 구문 분석: 분해한 토큰을 바탕으로 파싱 트리를 만드는 작업
html, css, JavaScript 모두 파싱이 진행된다.
 
html 파싱
렌더링 엔진이 html 문서를 전달 받으면, html 파서는 위에서부터 읽어들여 파싱을 진행하고, 최종적으로 DOM Tree를 구성하게 된다.
  1. 서버로부터 바이트 형식의 html 문서를 전달받는다.
  1. 지정된 인코딩 방식에 따라 이를 문자열로 변환한다.
  1. 변환한 문자열을 토큰으로 분해한다.
  1. 토큰을 바탕으로 노드(객체)를 생성한다.
  1. 객체를 트리 구조로 구성하여 DOM Tree를 만든다.
 
이 때, 렌더링 엔진은 html이 전부 파싱이 끝날 때까지 기다리지 않고, 파싱이 완료된 순서대로 파싱 이후의 과정인 배치 과정과 그리기 과정을 미리 진행한다.
 
css 파싱
html을 파싱하면서 <link> 태그를 만나게 되면, 브라우저는 DOM 생성을 중지하고 css 파싱을 진행한다.
최종 결과물은 CSSOM Tree를 구성하게 되며, 그 과정은 html 파싱 과정과 동일하다. (물론 어휘를 분석하고 구문을 분석하는 방식은 html과 는 약간 다르다.)
CSSOM Tree 노드는 DOM 요소의 선택자에 맞춰 적용될 CSS 스타일 정보가 포함된다.
 
JavaScript 파싱
html을 파싱하면서 <script> 태그를 만나게 되면, 브라우저는 DOM 생성을 중지하고 자바스크립트 서버에서 해당 JavaScript 리소스를 브라우저 엔진으로부터 받아온다. 그리고 JavaScript 엔진에 제어권을 넘겨준다.
JavaScript 엔진은 JS 리소스를 파싱하여 추상 구문 트리를 만들고, 이를 바이트 코드로 변환하여 실행된다.
JavaScript가 실행되는 동안은 DOM 생성이 중지되므로, <body> 중간에 <script> 태그를 작성한다면, DOM이 완전히 생성되지 않은 상태에서 DOM 조작이 이루어질 수 있기 때문에 에러가 발생할 위험이 있다. 그래서 일반적으로 <script> 태그는 <body> 태그의 가장 아래 부분에 배치하는 것이 일반적이다.
notion image
물론, <script async>, <script defer> 옵션을 통해서 DOM 생성이 블로킹 되는 것을 방지할 수 있다.
  • async:
    • 백그라운드에서 JavaScript 코드를 다운로드한다.
    • 다운로드가 완료되면 DOM 생성을 중지하고, 다운로드받은 JavaScript 코드를 실행한다.
    • 작성 순서대로 실행을 보장하지 않는다.
notion image
  • defer:
    • 백그라운드에서 JavaScript 코드를 다운로드한다. 그리고 DOM 생성이 끝날 때까지 실행이 지연된다.
    • defer 옵션 스크립트 태그가 여러개 있어도, 작성한 순서대로 실행되는 것을 보장한다.
notion image

Render Tree 구성

DOM Tree와 CSSOM Tree가 모두 구성이 끝나면, 이를 결합하여 렌더 트리를 형성한다.
  1. html 태그와 body 태그를 처리하여 렌더 트리 root를 구성한다.
  1. 이 때, 실제 보여지지 않는 태그들은 렌더 트리에서 제외한다.
  1. 화면에 보여지는 나머지 노드들에 CSSOM 규칙들을 찾아 스타일을 적용한다.
 

배치하기 (Layout)

렌더트리의 각 노드의 위치와 크기를 계산하고, 이를 화면에 배치하는 작업을 말한다.
항상 루트에서부터 계산을 시작하며, x, y 좌표를 사용한다.
 

그리기 (Paint)

계산된 위치와 크기를 바탕으로 DOM을 화면에 그린다. (실제 픽셀로 변환한다)
특정 위치에 여러 개의 노드가 함께 그려지는 경우, 여러 레이어를 만들고 이를 다시 합성하는 방식으로 작업이 이루어진다.
페인트 과정이 끝나면 우리가 보는 웹사이트가 나타난다.
 

재배치 (Reflow)

그러나 아직 끝난게 아니다! 화면을 리사이즈 하거나, 특정 이벤트에 따라서 DOM의 크기 또는 위치가 바뀔 수 있는데, 이를 반영해 주어야 한다. 이를 Reflow라고 하며, 실제로 비용이 많이 드는 과정이다.

다시 그리기 (Repaint)

reflow 과정에 따라 화면에 다시 반영하는 repaint 과정이 진행된다. reflow가 일어나야만 repaint 과정이 일어나는 것은 아니며, 경우에 따라 repaint 과정만 일어나는 경우도 있다.
레이아웃에는 영향을 주지 않지만, 다시 그려야하는 visibility, background-color 등이 포함된다.
 

출처

주소창에 naver.com을 치면 일어나는 일을 쉽게 이해해보자
스터디에서 발표를 준비하며, 기술 면접의 단골 질문인 웹 브라우저의 동작 원리 에 대해 처음으로 공부하게 되었다. 그리고 이 주제가 왜 단골 질문으로 꼽히는지 이해할 수 있었다. 이 주제는 깊이 들어가기 시작하면 정말 끝없이 들어갈 수 있는 내용인 것 같아 보였다. 그렇기에 면접관이 면접자의 역량을 파악하는 데 이만한 질문이 없겠구나 싶은 생각이 들었다.
주소창에 naver.com을 치면 일어나는 일을 쉽게 이해해보자
https://velog.io/@sylagape1231/%EC%A3%BC%EC%86%8C%EC%B0%BD%EC%97%90-naver.com%EC%9D%84-%EC%B9%98%EB%A9%B4-%EC%9D%BC%EC%96%B4%EB%82%98%EB%8A%94-%EC%9D%BC%EC%9D%84-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%B4%EB%B3%B4%EC%9E%90
주소창에 naver.com을 치면 일어나는 일을 쉽게 이해해보자
주소창에 www.google.com을 입력했을 때 일어나는 과정
이참에 해당 과정 한번 제대로 정리해보기로 마음먹었다. 웹 브라우저에 해당 도메인 주소를 입력했을 때의 과정을 크게 13단계로 나눴으며, 1~5 단계는 데이터를 받아오는 과정, 6~12단계는 웹 브라우저에 렌더링되는 과정에 대한 설명으로 구분했습니다. 웹 브라우저는 DNS 서버에 검색하기 전에 캐싱된 DNS 기록들을 먼저 확인합니다.
주소창에 www.google.com을 입력했을 때 일어나는 과정
https://velog.io/@tnehd1998/%EC%A3%BC%EC%86%8C%EC%B0%BD%EC%97%90-www.google.com%EC%9D%84-%EC%9E%85%EB%A0%A5%ED%96%88%EC%9D%84-%EB%95%8C-%EC%9D%BC%EC%96%B4%EB%82%98%EB%8A%94-%EA%B3%BC%EC%A0%95#2-%EA%B0%80%EC%9E%A5-%EA%B0%80%EA%B9%8C%EC%9A%B4-dns-%EC%84%9C%EB%B2%84%EC%97%90%EC%84%9C-%ED%95%B4%EB%8B%B9-%EB%8F%84%EB%A9%94%EC%9D%B8-%EC%9D%B4%EB%A6%84%EC%97%90-%ED%95%B4%EB%8B%B9%ED%95%98%EB%8A%94-ip%EC%A3%BC%EC%86%8C%EB%A5%BC-%EC%B0%BE%EC%95%84-%EC%82%AC%EC%9A%A9%EC%9E%90%EA%B0%80-%EC%9E%85%EB%A0%A5%ED%95%9C-url-%EC%A0%95%EB%B3%B4%EC%99%80-%ED%95%A8%EA%BB%98-%EC%A0%84%EB%8B%AC%EC%9D%84-%ED%95%A9%EB%8B%88%EB%8B%A4
주소창에 www.google.com을 입력했을 때 일어나는 과정
[ 네트워크 쉽게 이해하기 22편 ] TCP 3 Way-Handshake & 4 Way-Handshake
TCP는 장치들 사이에 논리적인 접속을 성립(establish)하기 위하여 three-way handshake를 사용한다. TCP 3 Way Handshake는 TCP/IP프로토콜을 이용해서 통신을 하는 응용프로그램이 데이터를 전송하기 전에 Server > Client : TCP SYN ACK 여기서 SYN은 'synchronize sequence numbers', 그리고 ACK는'acknowledgment' 의 약자이다. 이러한 절차는 TCP 접속을 성공적으로 성립하기 위하여 반드시 필요하다.
[ 네트워크 쉽게 이해하기 22편 ] TCP 3 Way-Handshake & 4 Way-Handshake
https://mindnet.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-22%ED%8E%B8-TCP-3-WayHandshake-4-WayHandshake
[ 네트워크 쉽게 이해하기 22편 ] TCP 3 Way-Handshake & 4 Way-Handshake
defer, async 스크립트
모던 웹브라우저에서 돌아가는 스크립트들은 대부분 HTML보다 '무겁습니다'. 용량이 커서 다운로드받는 데 오랜 시간이 걸리고 처리하는 것 역시 마찬가지이죠. 브라우저는 HTML을 읽다가 ... 태그를 만나면 스크립트를 먼저 실행해야 하므로 DOM 생성을 멈춥니다. 이는 src 속성이 있는 외부 스크립트 를 만났을 때도 마찬가지입니다. 외부에서 스크립트를 다운받고 실행한 후에야 남은 페이지를 처리할 수 있습니다.
defer, async 스크립트
https://ko.javascript.info/script-async-defer
defer, async 스크립트
스크립트의 실행 시점을 조절하는 Async와 Defer 속성 - 재그지그의 개발 블로그
동적인 웹 어플리케이션을 만들기 위해서는 JavaScript 파일을 불러오는 것이 필수적입니다. 하지만 복잡한 비즈니스 로직이 포함된 JavaScript 파일이라면 그 용량이 매우 클 것입니다. 따라서 스크립트 파일을 비동기 방식으로 불러오는 방식을 통해 로드 시간을 줄일 수 있습니다. 오늘은 이를 가능하게 만들어주는 태그의 속성 async와 defer 에 대해 알아보고, 두 속성 사이의 차이에 대해 정리해보고자 합니다.
스크립트의 실행 시점을 조절하는 Async와 Defer 속성 - 재그지그의 개발 블로그
https://wormwlrm.github.io/2021/03/01/Async-Defer-Attributes-of-Script-Tag.html
스크립트의 실행 시점을 조절하는 Async와 Defer 속성 - 재그지그의 개발 블로그