브라우저 동작 원리 & 구조

지은·2022년 11월 21일
3

Web / Browser

목록 보기
4/7

웹 브라우저 (Web Browser)

: 웹 서버에서 양방향으로 통신을 하며 HTML 문서, 멀티미디어 등의 컨텐츠를 열람할 수 있게 해주는 GUI 기반의 소프트웨어 프로그램
브라우저는 페이지를 다운로드하기 위해 응용 계층의 HTTP 프로토콜을 이용해 데이터를 송신/수신한다.

웹 브라우저 동작 원리

브라우저는 사용자가 선택한 자원(Resource)을 서버에 요청(Request)하고, 서버로부터 받은 응답(Response)을 브라우저에 렌더링한다.(Render).

여기서 자원은 HTML 문서, PDF, 멀티미디어 등 여러 형태일 수 있으며, 자원의 주소는 URI(Uniform Resource Identifier)로 되어있다.

1. 사용자
브라우저를 통해 찾고 싶은 웹 페이지의 URL 주소를 입력한다.

2. DNS 서버
사용자가 입력한 URL 주소 중 도메인 네임을 검색하고,
도메인 네임에 일치하는 IP 주소를 찾아, 사용자가 입력한 URL 정보와 함께 전달한다.

3. HTTP 프로토콜
이렇게 전달 받은 IP 주소와 웹 페이지 URL 정보는 HTTP 프로토콜을 사용해 HTTP 요청 메세지를 생성한다.

4. TCP/IP 프로토콜
이 HTTP 요청 메세지는 TCP 프로토콜 사용해 인터넷을 거쳐 해당 IP 컴퓨터로 전송되고,
도착한 HTTP 요청 메세지는, HTTP 프로토콜을 이용해 웹 페이지 URL 정보로 변환한다.

5. 웹 서버
변환된 정보에 해당하는 데이터를 검색하여 찾아낸 뒤, HTTP 응답 메세지를 생성한다.
이 HTTP 응답 메세지는 다시 TCP 프로토콜을 사용해 인터넷을 거쳐 사용자의 컴퓨터로 전송되고,
도착한 HTTP 응답 메세지는, HTTP 프로토콜을 이용해 웹 페이지 데이터로 변환된다.

6. 웹 브라우저
변환된 데이터가 웹 브라우저에 출력되어 사용자가 볼 수 있게 된다.


브라우저의 구조

1. 사용자 인터페이스(User Interface)

: 주소 표시줄, 이전/다음 버튼, 북마크 메뉴 등 유저와 가장 밀접하게 맞닿아있는 부분


2. 브라우저 엔진(Browser Engine)

: 사용자 인터페이스와 렌더링 엔진 사이의 동작을 제어하는 엔진

  • HTML 문서와 기타 지원의 웹페이지를 사용자의 장치에 시각 표현으로 변환시키며, 문서 객체 모델(DOM) 자료구조를 구현한다.

  • 레이아웃 엔진(Layout Engine)이라고도 불리며, 렌더링 엔진과 밀접하게 연관이 있어 브라우저 엔진과 렌더링 엔진을 묶어 브라우저 엔진이라고 부르기도 한다.

  • 웹 브라우저마다 전용 브라우저 엔진을 사용한다.

    • Gecko : Mozilla 재단에서 만든 브라우저 엔진으로, 파이어폭스가 탑재하고 있다.
    • Webkit : KHTML에서 파생된 브라우저 엔진으로, 사파리가 탑재하고 있다.
    • Blink : 웹킷(Webkit)에서 파생된 브라우저 엔진으로, 크롬, 오페라가 탑재하고 있다.
    • Trident : 마이크로소프트의 브라우저 엔진으로, 아웃룩 익스프레스, 마이크로소프트 아웃룩 등이 탑재하고 있다.

    이외에도 많은 브라우저 엔진들이 존재한다.


3. 렌더링 엔진(Rendering Engine)

: 요청한 콘텐츠를 화면에 출력하는 엔진

  • HTML과 CSS를 파싱해 최종적으로 화면에 그려주며, HTML 및 XML 문서와 이미지를 표시할 수 있다. (플러그인이나 브라우저 확장 기능을 이용하면 PDF와 같은 다른 유형도 표시할 수 있다.)

4. 통신(Networking)

: HTTP 요청과 같은 네트워크 호출에 사용되며, 보통 플랫폼의 독립적인 인터페이스이고 각 플랫폼의 하부에서 실행된다.

TCP/IP에 대해 정리한 글


5. 자바스크립트 해석기(JavaScript Interpreter)

: JavaScript 코드를 해석하고 실행하는 해석기

  • JavaScript는 코드를 위에서 아래로 한 줄씩 읽어가는 방식으로 파싱(parsing)하는 언어(Interpreted Language)이기 때문에 해석기가 필요하다.
  • 자바스크립트 엔진(JavaScript Engine)이라고도 불린다.
  • 웹 브라우저마다 전용 자바스크립트 엔진이 탑재되어 있다.
    • Rhino : Mozilla 재단이 운영하는 오픈 소스 엔진으로, Java로 개발되었다는 특징이 있다.
    • SpiderMonkey : 최초의 JavaScript 엔진으로, 넷스케이프 내비게이터를 지원했으며 현재는 파이어폭스를 지원하고 있다.
    • V8 : 구글이 개발한 오픈 소스 엔진으로, 구글 크롬을 지원하고 있다.
    • JavascriptCore : 애플에서 개발한 엔진으로, Webkit 프레임워크를 위해 개발되었지만 현재는 사파리와 React Native App을 지원하고 있다.
    • Chakra : 마이크로소프트가 개발한 엔진으로, Edge 브라우저를 지원하고 있다.

자바스크립트 엔진의 구조

이중에서 가장 유명한 V8 엔진을 통해 자바스크립트 엔진의 구조를 살펴보자.

힙 메모리(Heap Memory)

: 동적 메모리 할당에 사용되는 자료구조

  • V8 엔진은 힙 메모리에 객체 또는 동적 데이터를 저장한다.
  • 여기에 저장되는 메모리는 V8 엔진 내부에서 가장 큰 공간을 차지하고 있으며, Garbage Collection 또한 발생한다.

콜 스택(Call Stack)

: 프로그램 상에서 우리가 어디에 있는지 기록하는 자료구조

  • JavaScript는 싱글 스레드 기반의 언어이다.
    = 콜 스택이 하나로, 한번에 한 작업만 사용할 수 있다.
  • 스택은 후입선출(LIFO) 구조를 가지고 있기 때문에, 만약 함수를 실행하면 해당 함수는 콜 스택의 가장 상단에 위치하게 된다.
    함수의 실행이 끝나면, 해당하는 함수는 콜 스택의 가장 상단에 위치하고 있기 때문에 바로 제거할 수 있다.

콜 스택의 동작 과정

  • 여기서 콜 스택에 쌓이는 데이터 하나하나를 스택 프레임(Stack Frame)이라고 부른다.
  • 이 스택 프레임들은 쌓이는 순서가 있기 때문에, 스택의 추적 또한 가능하다.

스택 추적(Stack Trace)

브라우저의 콘솔에 출력되는 에러 로그를 통해 어디서 에러가 발생하고 있는지, 에러의 결과가 무엇인지 추적할 수 있다.

  • 콜 스택은 힙 메모리와 달리 자료 구조 자체에 크기 제한이 있다. 따라서 한정된 메모리 공간을 넘어버리면 스택 오버플로(Stack Overflow)가 일어난다.

스택 오버플로

아래처럼 스택 내부에 동일한 스택 프레임이 계속 쌓이다가 스택의 크기(용량)를 넘어버리면 웹 브라우저가 멈춰버린다.


6. UI 백엔드

: 렌더링 엔진이 분석한 Render Tree를 브라우저에 그리는 역할

  • Select, Input창과 같은 기본적인 위젯을 그려준다.
  • 플랫폼에서 명시하지 않은 일반적인 인터페이스로, OS 사용자 인터페이스 체계를 사용한다.

사용자 인터페이스 종류

  • 명령어 라인 인터페이스(CLI; Command Line Interface)
    : 문자로만 명령어를 입력해 처리해야 하는 인터페이스 (mac은 터미널, 윈도우는 명령 프롬프트)
  • 일괄 처리 인터페이스(Batch Interface)
    : 사용자가 배치 처리에 앞서 배치 작업의 모든 세부 사항을 지정하고, 모든 처리가 완료되면 출력을 수신하는 비대화형 사용자 인터페이스
    대규모의 시스템에서 대량의 데이터를 처리하는 데에 자주 사용된다.
  • 그래픽 사용자 인터페이스(GUI; Graphic User Interface)
    : 마우스, 키보드, 모니터 등을 이용해 아이콘을 클릭하는 등의 직관적인 입력이 가능한 인터페이스

7. 웹 스토리지(Web Storage)

: 영구적인 저장소인 로컬 스토리지임시적인 저장소인 세션 스토리지를 따로 두어 응용 환경에 맞는 선택이 가능하다.

웹 스토리지의 특징

  • 웹 브라우저가 직접 데이터를 저장할 수 있게 해주어, 사용자 측에서 좀 더 많은 정보를 안전하게 저장할 수 있게 해준다.
    ➡️ 이러한 정보는 서버로 전송되지 않고, 클라이언트가 저장하고 있기 때문에 네트워크 트래픽 비용 또한 줄여준다.
  • 웹 스토리지는 출처(origin)마다 단 하나씩 존재한다.
    하나의 오리진에 속하는 모든 웹 페이지는 같은 데이터를 저장하기 때문에 같은 데이터에 접근할 수 있게 된다.

로컬 스토리지(localStorage)

: 로컬 스토리지 객체는 보관 기한이 없는 데이터를 저장한다.

  • 로컬 스토리지에 저장된 데이터는 브라우저를 닫거나, 컴퓨터를 재부팅해도 사라지지 않는다.
  • Windows 전역 객체의 localStorage라는 컬렉션(window.localStorage)을 통해 저장 및 조회할 수 있다.
  • 도메인마다 별도의 로컬 스토리지가 생성된다.
    = 도메인만 같으면 전역으로 데이터 공유가 가능하다.

세션 스토리지(sessionStorage)

: 세션 스토리지 객체는 하나의 세션만을 위한 데이터를 저장한다.

  • 세션 스토리지에 저장된 데이터는 브라우징되고 있는 브라우저 컨택스트 내에서만 데이터가 유지되기 때문에, 브라우저 탭을 닫으면 저장된 데이터가 사라진다.
  • Windows 전역 객체의 sessionStorage라는 컬렉션(window.sessionStorage)을 통해 저장 및 조회할 수 있다.
  • 브라우저 컨택스트가 다르면 서로 다른 세션 스토리지를 가진다.
    = 브라우저의 컨택스트가 서로 다르므로 서로 데이터 공유가 불가능하다.
  • 브라우징 : 브라우저 프로그램을 실행해서 인터넷에서 정보를 찾는 행위
  • 브라우저 컨택스트 : 브라우저가 문서를 표시하는 환경
    각 브라우징 컨택스트는 활성화되고 있는 문서의 출처, 표시했던 문서의 방문 기록을 가지고 있다.

웹 스토리지를 활용한 대표적인 기능

브라우저 컨택스트 내에서 저장된 데이터를 가지고 활용할 수 있기 때문에 복구 및 백업에 관련된 기능이 주로 사용된다.

  • 글을 작성하다가 사용자가 창을 벗어난 경우, 작성하던 내용을 복구하거나 백업해주는 기능
  • 사용자가 입력 form에 정보를 입력하다 페이지에서 벗어난 경우, 복구 및 백업해주는 기능
  • 현재 읽은 글의 히스토리 저장(카운팅, 읽은 글 표시 등)
profile
개발 공부 기록 블로그

1개의 댓글

comment-user-thumbnail
2024년 1월 23일

two 스펠링이 잘못 된 것 같아요!!

답글 달기