웹 브라우저

웹 브라우저는 웹의 문서와 응용 프로그램을 탐색하고 실행하는 응용 소프트웨어이다. 사용자가 입력한 URL이나 하이퍼링크를 바탕으로 웹 서버와 통신하고, 전송받은 HTML, CSS, 이미지, 글꼴과 기타 자원을 해석하여 화면에 표시한다. JavaScript와 WebAssembly로 작성된...

분류응용 소프트웨어, 인터넷 소프트웨어, 클라이언트 소프트웨어
용도웹 자원의 탐색, 요청, 표시와 실행
주요 입력URL, 사용자 입력, 하이퍼링크
주요 프로토콜HTTP, HTTPS, DNS, WebSocket
주요 웹 기술HTML, CSS, JavaScript, WebAssembly, DOM
핵심 구성 요소사용자 인터페이스, 네트워크 스택, 렌더링 엔진, JavaScript 엔진, 저장소, 보안 경계
대표 렌더링 엔진Blink, Gecko, WebKit
대표 JavaScript 엔진V8, SpiderMonkey, JavaScriptCore
최초의 웹 브라우저WorldWideWeb
최초 개발1990년
주요 형태데스크톱 브라우저, 모바일 브라우저, 텍스트 기반 브라우저, 임베디드 브라우저

웹 브라우저는 웹의 문서와 응용 프로그램을 탐색하고 실행하는 응용 소프트웨어이다. 사용자가 입력한 URL이나 하이퍼링크를 바탕으로 웹 서버와 통신하고, 전송받은 HTML, CSS, 이미지, 글꼴과 기타 자원을 해석하여 화면에 표시한다. JavaScript와 WebAssembly로 작성된 프로그램을 실행하며, 입력 처리, 오디오와 영상 재생, 파일 전송, 로컬 저장소, 알림과 장치 접근 등 웹 플랫폼의 기능을 응용 프로그램에 제공한다.

웹 브라우저는 단순히 웹 문서를 보여 주는 프로그램에서 출발했지만, 현대에는 문서 편집기, 메신저, 미디어 플레이어, 게임, 개발 환경과 업무용 소프트웨어를 실행하는 범용 응용 프로그램 플랫폼으로 확장되었다. 브라우저 안에서 실행되는 웹 응용 프로그램은 운영체제와 하드웨어에 직접 접근하는 대신 브라우저가 제공하는 API와 권한 체계를 사용하며, 브라우저는 서로 다른 출처에서 전달된 코드를 격리하고 사용자의 데이터와 장치를 보호하는 실행 환경 역할도 맡는다.

일반적인 웹 브라우저는 주소 표시줄과 탭을 관리하는 사용자 인터페이스, 서버와 통신하는 네트워크 스택, 문서 구조와 스타일을 처리하는 렌더링 엔진, 프로그램을 실행하는 JavaScript 엔진, 그래픽 합성과 미디어 처리를 담당하는 구성 요소, 방문 기록과 쿠키를 관리하는 저장소로 이루어진다. 현대 브라우저는 안정성과 보안을 높이기 위해 이러한 기능을 여러 운영체제 프로세스로 분리하고, 웹사이트나 프레임을 별도의 렌더러 프로세스와 샌드박스에 배치하는 구조를 널리 사용한다.

최초의 웹 브라우저인 WorldWideWeb는 팀 버너스리가 CERN에서 1990년에 개발했으며 웹 문서를 열람하는 기능과 편집 기능을 함께 제공했다. 이후 여러 환경에서 실행할 수 있는 라인 모드 브라우저와 그래픽 브라우저가 등장했고, 1993년 공개된 NCSA Mosaic은 문자와 이미지를 한 화면에 통합하여 표시하면서 웹의 대중화에 중요한 역할을 했다. 웹 브라우저는 이후 Netscape Navigator, Internet Explorer, Mozilla Firefox, Safari, Google Chrome 등으로 계보가 이어졌으며, 웹 표준의 발전과 함께 운영체제에 준하는 규모의 소프트웨어 체계로 성장했다.

브라우저 목록

웹 브라우저
NCSA MosaicMosaic 계열NCSA Mosaic · AMosaic · VMS Mosaic · Mosaic-CK · AIR Mosaic · Spyglass Mosaic · SPRY Mosaic · Quarterdeck Mosaic · CompuServe Mosaic · IBM WebExplorer · Internet in a Box · Netscape Navigator · Internet Explorer 1
Netscape NavigatorNetscape Navigator · Netscape Communicator · Mozilla Application Suite · Netscape 6 · Netscape 7 · Netscape Browser · Netscape Navigator 9
Mozilla Application SuiteGeckoMozilla Application Suite · Beonex Communicator · Classilla · Gnuzilla · Netscape 6 · Netscape 7 · SeaMonkey · Iceape · Mozilla Firefox · Camino · Galeon · K-Meleon · Conkeror · Minimo · MicroB
SeaMonkeySeaMonkey · Iceape
Mozilla FirefoxGecko · QuantumMozilla Firefox · Firefox for Android · Fennec · Fennec F-Droid · Firefox Focus · Firefox Reality · Wolvic · Tor Browser · Mullvad Browser · Waterfox · LibreWolf · GNU IceCat · Iceweasel · Abrowser · Floorp · Zen Browser · Pulse Browser · Mercury Browser · Ghostery Private Browser · Iceraven Browser · Mull Browser · Firedragon · Cachy Browser · Light · Mypal · Pale Moon · Basilisk · TenFourFox · Timberwolf · Swiftfox · Swiftweasel · Cyberfox · Comodo IceDragon · Cliqz · Flock · AT&T Pogo · xB Browser
Firefox for AndroidFirefox for Android · Fennec · Fennec F-Droid · Iceraven Browser · Mull Browser
Firefox FocusFirefox Focus
Firefox RealityFirefox Reality · Wolvic
Tor BrowserTor Browser · Mullvad Browser · xB Browser
Mullvad BrowserMullvad Browser
Pale MoonGoannaPale Moon · Basilisk · New Moon · Arctic Fox · Mypal 28
BasiliskBasilisk
K-MeleonK-Meleon · K-MeleonCCF ME · K-Ninja
Spyglass MosaicSpyglass Mosaic · Internet Explorer · Internet Explorer for UNIX · Internet Explorer for Mac
Internet ExplorerTrident · TasmanInternet Explorer · Internet Explorer Mobile · Pocket Internet Explorer · Internet Explorer for UNIX · Internet Explorer for Mac · MSN Explorer · AOL Explorer · NeoPlanet · NetCaptor · Avant Browser · GreenBrowser · Deepnet Explorer · Crazy Browser · SlimBrowser · TheWorld Browser · MyIE · MyIE2 · Maxthon · Tencent Traveler · QQ Browser · 360 Secure Browser · Baidu Browser · Sogou Explorer · Sleipnir · Lunascape · Yahoo! Browser · AT&T Yahoo! Browser · BT Yahoo! Browser · Verizon Yahoo! Browser · Netscape Browser 8 · MediaBrowser · Enigma Browser · UltraBrowser · iRider · Browzar · Ace Explorer · AM Browser · Smart Bro · WebSpirit · Microsoft Edge Legacy
MyIEMyIE · MyIE2 · Maxthon
MaxthonTrident → ChromiumMaxthon · Maxthon Cloud Browser · Maxthon Nitro
Microsoft Edge LegacyEdgeHTMLMicrosoft Edge Legacy · Microsoft Edge
KonquerorKHTML → WebKit → BlinkKonqueror · Konqueror Embedded · Safari · Chromium
SafariWebKitSafari · Mobile Safari · Safari Technology Preview · WebKit Nightly · Shiira · OmniWeb · iCab · GNOME Web · Midori · Arora · Falkon · Rekonq · Roccat Browser · Origyn Web Browser · QtWeb · Iris Browser · Steel · surf · Uzbl · xombrero · Luakit · dwb · Jumanji · Vimprobable · Vimb · Badwolf · Eolie · Fifth · Lariza · WebPositive · PhantomJS · qutebrowser · Otter Browser · Dooble · Dolphin Browser · BOLT Browser · Nokia Browser for Symbian · Orion · DuckDuckGo Browser · SigmaOS · Stainless · Sunrise Browser · Demeter · Fluid
GNOME WebGNOME Web
FalkonFalkon
MidoriWebKit → ChromiumMidori · AstianGO
Dolphin BrowserDolphin Browser · Dolphin Zero · Dolphin Jetpack
ChromiumWebKit → BlinkChromium · Google Chrome · Microsoft Edge · Opera · Brave · Vivaldi · Arc · Dia · Comet · ChatGPT Atlas · Fellou · Tabbit · Genspark Browser · Amazon Silk · Samsung Internet · NAVER Whale · Yandex Browser · Cốc Cốc · 360 Secure Browser · 360 Extreme Explorer · QQ Browser · UC Browser · Baidu Browser · Sogou Explorer · Maxthon · Sleipnir · SRWare Iron · Comodo Dragon · Chromodo · Avast Secure Browser · AVG Secure Browser · CCleaner Browser · Epic Privacy Browser · Iridium Browser · Ungoogled Chromium · Thorium · Cromite · Bromite · Vanadium · Mulch · Kiwi Browser · Quetta Browser · JioSphere · Huawei Browser · Mi Browser · Mint Browser · Ecosia Browser · DuckDuckGo Browser · Puffin Browser · Rockmelt · Torch Browser · SalamWeb · Beaker Browser · Blisk · Polypane · Sizzy · Ghost Browser · Sidekick · Wavebox · Stack Browser · Decentr · CryptoTab Browser · Cent Browser · Slimjet · Supermium · Catsxp · Ulaa · Helium Browser · Tempest Browser · Gener8 · Carbon Browser · Aloha Browser · Phoenix Browser · Min · Colibri · Dooble · Falkon · qutebrowser · Otter Browser · Angelfish · Liri Browser · Flock · CoolNovo · ChromePlus · Kinza · Orbitum · Citrio · Coowon · Sputnik Browser · Amigo Browser · Atom Browser · Cheetah Secure Browser · Sushi Browser · WhiteHat Aviator · BlackHawk Browser · Redcore · Titan Browser · Chromium GOST
Google ChromeGoogle Chrome · Chrome for Android · Chrome for iOS
Microsoft EdgeEdgeHTML → BlinkMicrosoft Edge Legacy · Microsoft Edge · Microsoft Edge Mobile
OperaPresto → BlinkOpera · Opera One · Opera GX · Opera Mini · Opera Mobile · Opera Touch · Opera Coast · Opera Neon · Opera Crypto Browser · Opera Air
ArcArc · Arc Search · Dia
DiaDia
360 Secure Browser360 Secure Browser · 360 Extreme Explorer · 360 AI Browser · 360 Mobile Browser
UC BrowserUC Browser · UC Mini · UC Turbo
Puffin BrowserPuffin Browser · Puffin TV Browser · Puffin Incognito Browser
Comodo DragonComodo Dragon · Chromodo
Avast Secure BrowserAvast Secure Browser · AVG Secure Browser · CCleaner Browser
BromiteBromite · Cromite
JioSphereJioSphere
ChromePlusChromePlus · CoolNovo
OperaElektra · Presto → BlinkOpera · Opera One · Opera GX · Opera Mini · Opera Mobile · Opera Touch · Opera Coast · Opera Neon · Opera Crypto Browser · Opera Air · Opera TV Browser · Nintendo DS Browser · Nintendo DSi Browser · Internet Channel · Otter Browser · Fifth
Links텍스트 · 그래픽Links · ELinks · FELinks · Hacked Links · Links-g
ELinksELinks · FELinks
Lynx텍스트Lynx · MacLynx · ALynx
w3m텍스트w3m · w3m-img · emacs-w3m
Emacs/W3EmacsEmacs/W3 · EWW · emacs-w3m
tkWWWTcl/TktkWWW · Phoenix (tkWWW 기반 브라우저)
NetFront임베디드NetFront · NetFront Browser · NetFront Browser NX · NetFront Life Browser · NetFront Browser for DTV · PlayStation Portable 웹 브라우저 · PlayStation 3 웹 브라우저 · Nintendo 3DS Internet Browser · Wii U Internet Browser
Openwave Mobile Browser모바일UP.Browser · Openwave Mobile Browser · Openwave Mercury Browser · Myriad Browser
Nokia Browser모바일Nokia Browser for Symbian · Nokia Series 40 Browser · Ovi Browser · Nokia Xpress · MicroB · Maemo Browser · Nokia 770 Browser
BlackBerry Browser모바일BlackBerry Browser · BlackBerry WebKit Browser · BlackBerry Access
ArachneDOSArachne · Arachne GPL · DPMI Arachne
Dillo경량Dillo · DilloNG
NetSurf독자 엔진NetSurf · NetSurf for RISC OS
LadybirdLibWebSerenityOS Browser · Ladybird
WorldWideWeb최초의 웹 브라우저WorldWideWeb
NaviPressNaviPress · AOLpress
VoyagerAmigaOSVoyager · Voyager NG
Songbird미디어 브라우저Songbird · Nightingale
Planetweb게임기Planetweb · Dream Passport
독립 브라우저독자 계보Line Mode Browser · ViolaWWW · Erwise · MidasWWW · Cello · Samba · Arena · Amaya · HotJava · Grail · Cyberdog · SlipKnot · NetShark · Oracle PowerBrowser · Ariadna · MacWeb · WinWeb · AWeb · IBrowse · Fresco · Oregano · Browse · WebsterXL · DR-WebSpyder · Embrowser · Abaco · Mothra · NetPositive · BeZilla · Flow Browser · Servo · Nyxt · Chawan · Browsh · Carbonyl · Netrik · retawq · edbrowse · WebbIE · pwWebSpeak · BrookesTalk · ZAC Browser · KidZui · Ghostzilla · Gollum Browser · Kirix Strata · Miro · SpaceTime · Gazelle · Minuet · Charlotte · Net-Tamer · DosLynx · Bobcat · Skipper · Prodigy Classic · Blazer · Xiino · AvantGo · ThunderHawk · Teashark · Dorothy Browser · Skyfire · Miren Browser · Boat Browser · APUS Browser · CM Browser · DU Browser · Via Browser · XBrowser · Soul Browser · Stargon Browser · Habit Browser · Lightning Browser · Tint Browser · Ninesky Browser · ONE Browser · Jig Browser · Skweezer · Rocket Browser · PS2 Linux 웹 브라우저 · Nintendo Switch Internet Browser

역사

웹 이전의 하이퍼텍스트와 인터넷 클라이언트

웹 브라우저의 개념적 배경에는 정보를 문서의 순서대로만 읽는 대신 관련 항목을 연결해 탐색하려는 하이퍼텍스트 연구가 있다. 버니바 부시가 1945년에 제안한 메멕스는 마이크로필름에 저장한 자료 사이에 연관 경로를 만들고 따라가는 장치의 구상이었으며, 오늘날의 인터넷 소프트웨어를 직접 구현한 것은 아니었다. 테드 넬슨은 1965년 발표한 논문에서 하이퍼텍스트라는 용어를 사용했다. 더글러스 엥겔바트 연구진은 NLS를 통해 연결된 문서의 열람과 편집을 실제 컴퓨터 작업 환경으로 발전시켰다. 1968년 공개 시연에는 마우스 조작, 문서 내부와 문서 사이의 링크, 원격 화면 공유와 공동 작업이 포함되었다. 이러한 연구는 이후 브라우저에 나타나는 링크 탐색과 대화형 문서 조작의 선행 사례다.[1][2]

인터넷에서 정보를 이용하는 클라이언트도 웹보다 먼저 존재했다. 텔넷은 서로 다른 컴퓨터의 터미널과 원격 프로그램을 연결했고, FTP는 파일을 전송하는 수단이었다. 웹이 막 보급되던 1991년에는 미네소타 대학교의 고퍼가 등장하여 여러 서버에 분산된 문서와 검색 서비스를 메뉴와 디렉터리 형태로 제공했다. 고퍼 사용자는 개별 서버의 내부 경로를 모두 외울 필요 없이 항목을 선택하며 다른 서버로 이동할 수 있었으며, 게이트웨이를 통해 FTP나 WAIS 같은 기존 정보 서비스에도 접근할 수 있었다. 따라서 인터넷 정보 탐색이 웹 브라우저와 함께 처음 시작된 것은 아니며, 초기 웹은 이미 존재하던 여러 서비스와 공존하면서 이용 범위를 넓혔다.[3][4]

팀 버너스리는 1980년 CERN에서 사람·프로젝트·소프트웨어에 관한 정보를 서로 연결하는 ENQUIRE를 작성했다. 1989년의 웹 제안서는 이러한 경험을 바탕으로, 연구소의 잦은 인력 이동과 이기종 컴퓨터 환경에서 정보가 사라지거나 찾기 어려워지는 문제를 다루었다. 핵심 요구는 특정 기종이나 중앙 데이터베이스에 종속되지 않는 원격 접근, 기존 자료의 재이용, 독립적으로 관리되는 정보들의 연결이었다. 서버와 표시 프로그램을 명확한 인터페이스로 나누자는 설계는 같은 자료에 여러 종류의 클라이언트가 접근할 수 있게 하는 출발점이 되었다. 웹 브라우저의 탄생은 이처럼 하이퍼텍스트의 연결 방식과 인터넷의 분산 통신 구조가 결합된 결과였다.[5]

WorldWideWeb와 초기 웹 브라우저

최초의 웹 브라우저 WorldWideWeb는 팀 버너스리가 1990년 CERN에서 NeXT 컴퓨터를 사용해 개발한 프로그램이다. 웹이라는 정보 공간을 읽는 기능과 문서를 작성하는 기능이 함께 들어 있었으므로, 초기 개발자는 이를 브라우저 겸 편집기로 설명했다. 당시 브라우저, 웹 서버, 문서 주소와 전송·표시 방식이 함께 만들어졌으며, 1990년 말에는 첫 웹 서버와 브라우저가 작동하고 있었다. 프로그램 이름은 뒤에 웹 전체를 뜻하는 World Wide Web과 혼동하지 않도록 Nexus로 바뀌었다. 따라서 WorldWideWeb라는 특정 응용 프로그램과 월드 와이드 웹이라는 분산 정보 시스템은 구별해야 한다.[6][7]

WorldWideWeb는 Objective-C와 NeXTSTEP의 텍스트 편집 구성 요소를 이용했으며, 화면에서 문서를 직접 수정하는 위지위그 방식으로 하이퍼텍스트를 작성할 수 있었다. 사용자는 대상 문서나 특정 위치를 표시한 다음 편집 중인 문장의 선택 영역에 링크를 연결했다. 뒤로 이동하기와 연결된 항목을 차례로 탐색하는 메뉴도 제공되었다. 초기 버전은 이미지를 본문 안에 배치하지 않고 별도 창에서 열었고, 널리 재현되는 1993년 화면은 그 뒤의 기능 개선을 반영한다. HTTP 문서뿐 아니라 FTP, 뉴스, 로컬 파일도 탐색할 수 있었지만, 당시에는 HTTP PUT이 구현되지 않아 직접 편집하여 저장하는 기능은 로컬 파일에 한정되었다.[8]

이 첫 구현은 웹이 단순한 읽기 전용 문서 배포 수단으로만 구상된 것이 아니었음을 보여준다. 링크를 따라 정보를 찾는 과정과 새로운 문서를 작성하고 연결하는 과정이 하나의 도구에 들어 있었기 때문이다. 그러나 NeXTSTEP의 풍부한 개발 기능은 구현을 빠르게 해 주는 동시에 실행 환경을 제한했다. 버너스리는 1991년 8월 공개한 프로젝트 소개에서 네트워크 곳곳의 정보에 같은 방식으로 접근한다는 목표와 함께 NeXT 브라우저·편집기와 이식 가능한 라인 모드 브라우저를 소개하고, 소스 배포와 협업을 제안했다. 이후 초기 웹의 확산은 최초 프로그램을 그대로 복제하는 것보다 공통 문서와 프로토콜을 처리하는 다양한 클라이언트를 만드는 방향으로 진행되었다.[9][10]

라인 모드 브라우저와 플랫폼 확장

라인 모드 브라우저는 NeXT 컴퓨터가 없는 사용자도 웹에 접근할 수 있도록 개발되었다. CERN에서 실습 중이던 니컬라 펠로가 주요 개발을 맡았고, 1991년 3월에는 CERN 중앙 컴퓨터 이용자에게 제공되었다. 1992년 1월에는 1.1 버전이 익명 FTP로 배포되었으므로, 1991년의 초기 이용과 1992년의 배포 기록은 서로 다른 단계에 해당한다. 이 브라우저는 그래픽 화면이나 마우스를 요구하지 않고 텍스트를 순차적으로 출력했다. 링크 옆의 번호를 입력하면 관련 문서로 이동하는 방식으로, 문서의 연결 구조는 유지하면서 기종별 화면 제어 기능에 대한 의존도를 낮췄다.[11][12][13]

문자 기반이라는 특성은 단순한 기능상의 제약만은 아니었다. 당시의 일반 터미널과 워크스테이션의 터미널 에뮬레이터에서 같은 정보에 접근할 수 있었고, 문서를 가져와 변환하거나 다른 프로그램의 입력으로 사용하는 방식에도 적합했다. 초기 문서는 캐리지 리턴과 줄바꿈 이외의 특별한 제어 시퀀스를 요구하지 않는다는 점을 강조했다. 이후 라인 모드 브라우저는 libwww 위에 구축된 예제 프로그램으로 유지되었다. 네트워크 접근과 문서 처리에 필요한 공통 코드를 라이브러리로 제공함으로써, 새로운 응용 프로그램은 모든 통신 기능을 처음부터 작성하지 않고도 웹을 이용할 수 있었다.[14][15]

동시에 X 윈도 시스템을 사용하는 워크스테이션에서는 그래픽 클라이언트가 개발되었다. 핀란드의 학생들이 만든 Erwise, 페이위의 ViolaWWW, SLAC의 토니 존슨이 작성한 MidasWWW는 Mosaic 이전 또는 같은 초기 시기에 웹의 이용 환경을 넓힌 사례다. 이들은 설치 조건, 화면 구성, 문서 표현과 확장 기능에서 서로 다른 선택을 했다. MidasWWW는 Motif 계열의 인터페이스를 제공했고 유닉스와 VMS용 소스가 배포되었다. 이 시기의 중요성은 단일 브라우저가 표준 사용법을 독점했다는 데 있지 않고, 공통된 웹 문서를 여러 독립 구현이 읽을 수 있다는 가능성이 실제 소프트웨어로 확인되었다는 데 있다.[16][17]

NCSA Mosaic과 웹의 대중화

NCSA Mosaic은 미국 일리노이 대학교의 국립 슈퍼컴퓨팅 응용 연구소에서 마크 안드리슨, 에릭 비나 등 개발자들이 만든 브라우저다. 1993년 1월부터 유닉스의 X 윈도 시스템용 사전 공개판이 제공되었고, 같은 해 4월 공식 버전이 나왔다. 이어 Windows와 Macintosh용 구현도 등장하면서 연구용 워크스테이션 밖의 개인용 컴퓨터로 이용층이 넓어졌다. 초기 그래픽 브라우저에는 이미 WorldWideWeb, Erwise, ViolaWWW 등이 있었으므로 Mosaic을 최초의 그래픽 웹 브라우저라고 부르는 것은 정확하지 않다. Mosaic의 역사적 비중은 기존 기술을 설치하기 쉽고 이해하기 쉬운 프로그램으로 제공하여 웹의 대중화를 촉진했다는 데 있다.[18][19][20]

Mosaic은 텍스트와 이미지를 같은 문서 화면에서 보여 주고, 뒤로·앞으로 이동하기, 홈으로 돌아가기, 자주 찾는 문서 저장과 같은 동작을 그래픽 인터페이스로 제공했다. 서로 다른 글꼴과 이미지가 결합된 문서는 웹을 단순한 원격 텍스트 조회보다 시각적인 매체로 경험하게 했다. 그러나 이러한 개별 기능의 최초 발명을 모두 Mosaic에 귀속시키기보다, 여러 선행 브라우저에서 시도된 아이디어를 다루기 쉬운 형태로 결합한 점을 구분하는 것이 중요하다. NCSA의 회고는 설치 편의성과 이용자 요구에 대한 빠른 대응을 성공 요인으로 설명한다. 안드리슨은 인터넷 토론에서 의견을 모으고 새 버전을 반복 배포했으며, 이러한 개선과 지원은 기능 목록만으로 설명하기 어려운 보급 효과를 만들었다.[21]

보급 경로도 웹의 성장에 중요했다. 비상업적 이용자는 NCSA에서 프로그램을 내려받을 수 있었고, 여러 운영체제에 대응하는 배포판은 학교·연구기관과 가정용 컴퓨터 사이의 장벽을 낮췄다. 일리노이 대학교의 기록에 따르면 1994년에는 Spyglass를 통한 상업적 기술 이전과 라이선스 사업도 이루어졌다. 한편 CERN은 별도의 결정으로 1993년 4월 30일 웹 소프트웨어를 공공 영역에 공개하여 자유로운 이용과 확산을 지원했다. 이 두 흐름은 각각 브라우저 제품의 보급과 웹의 공통 기반을 확장했지만, CERN의 공개 결정이 곧 모든 Mosaic 배포판의 라이선스를 동일하게 만들었다는 뜻은 아니다. 연구소의 시범 기술이 범용 클라이언트와 상용 제품으로 확장되는 과정에서 Mosaic은 중요한 연결 고리였다.[22][23]

Netscape Navigator와 상용 웹의 성장

1994년 안드리슨과 짐 클라크가 설립한 회사는 이후 넷스케이프 커뮤니케이션스라는 이름으로 알려졌으며, 같은 해 말 Netscape Navigator 1.0을 내놓았다. Mosaic 개발에 참여했던 인력의 경험은 새로운 회사로 이어졌지만, NCSA Mosaic이라는 연구소 제품과 Netscape의 상용 브라우저는 별개의 프로젝트였다. Navigator는 웹을 공통 실행 환경으로 발전시키려는 상용 전략의 중심에 놓였고, 회사는 브라우저와 서버 제품을 함께 개발했다. 이는 브라우저를 연구 자료의 열람 도구뿐 아니라 기업과 일반 소비자가 온라인 서비스를 이용하는 공통 접점으로 보는 전환이었다.[24]

상용 웹의 확장에는 화면 표현 이외의 기능도 필요했다. HTTP 쿠키는 서버가 전달한 작은 상태 정보를 브라우저에 저장하고 이후 요청에 돌려보내도록 하여, 서로 분리된 HTTP 요청을 하나의 이용 흐름과 연결하는 수단이 되었다. Netscape의 원래 쿠키 명세는 후속 표준화의 출발점 가운데 하나였으며, 이러한 상태 관리는 로그인 상태나 장바구니 같은 기능을 구현하는 데 활용된다. Netscape가 개발에 참여한 SSL은 통신 상대의 인증과 전송 내용의 기밀성·무결성을 제공하도록 설계되었다. 쿠키와 암호화 통신은 서로 다른 문제를 해결하는 기능이며, 함께 사용될 때도 브라우저의 상태 보존과 안전한 전송을 구별해야 한다. 당시 SSL의 역사적 역할은 중요하지만, SSL 3.0은 이후 보안 결함 때문에 사용이 금지되었다.[25][26][27]

또 다른 전환은 자바스크립트의 도입이었다. 브렌던 아이크가 Netscape에서 개발한 스크립트 언어는 1995년 Navigator 2.0의 시험판에 포함되었고, 같은 해 말 JavaScript라는 이름으로 발표되었다. 웹 문서는 링크를 클릭할 때마다 서버의 새 문서로 이동하는 방식에 더해, 브라우저 안에서 입력을 검사하고 사용자 동작에 반응하는 코드를 실행할 수 있게 되었다. Microsoft도 JScript를 구현했으며, 1997년에는 여러 구현을 조정하기 위한 ECMAScript의 첫 표준이 채택되었다. 이 과정은 브라우저가 문서 표시 프로그램에서 응용 프로그램 실행 환경으로 발전하는 출발점이었고, 동시에 구현 차이를 조정할 공통 명세의 필요성을 드러냈다.[28][29]

제1차 브라우저 전쟁

1990년대 중후반의 제1차 브라우저 전쟁은 Netscape Navigator와 마이크로소프트의 Internet Explorer 사이의 경쟁을 중심으로 전개되었다. Internet Explorer는 1995년 등장했고, 초기 소매 배포에서는 Windows 95용 Microsoft Plus! 추가 패키지에 포함되었다. 이후 경쟁은 웹 페이지의 표시 속도나 편의 기능뿐 아니라 운영체제와의 결합, 배포 계약, 개발자가 사용할 수 있는 인터페이스까지 확대되었다. 브라우저가 여러 운영체제에서 같은 응용 프로그램을 실행하는 환경이 될 수 있다는 전망은 운영체제 공급자와 브라우저 공급자의 이해관계를 직접 연결했다. 따라서 이 경쟁은 단순히 두 문서 열람 프로그램 중 어느 쪽이 사용하기 쉬운지를 겨루는 문제를 넘어섰다.[30][31]

새로운 기능을 신속히 구현하는 경쟁은 웹의 표현력과 상호작용을 확대했지만, 개발자가 특정 제품에 의존하는 문제도 키웠다. 같은 페이지라도 브라우저별로 표시 결과가 다르거나, 특정 스크립트와 문서 객체 조작 방식이 다른 제품에서 작동하지 않는 경우가 생겼다. 개발자는 브라우저의 종류를 판별해 서로 다른 코드를 제공하거나, 여러 버전의 화면을 별도로 시험해야 했다. Web Standards Project가 당시의 문제로 지적한 것도 이러한 불완전한 표준 지원과 제작 비용의 증가였다. 문서 구조, 스타일, 스크립트와 객체 모델을 공개 명세에 맞추려는 요구는 기능 경쟁을 중단하자는 주장이라기보다, 새로운 기능이 상호운용 가능한 공통 기반 위에서 작동해야 한다는 요구였다.[32][33]

배포 방식과 운영체제의 영향력은 미국의 Microsoft 반독점 소송에서 핵심 쟁점이 되었다. 1999년 연방법원의 사실인정은 Internet Explorer의 무상 공급, PC 제조사와 인터넷 접속 사업자를 통한 배포, Windows와의 기술적·계약적 결합을 자세히 검토했다. 이미 설치된 브라우저가 있는 컴퓨터를 구입하거나 접속 서비스와 함께 브라우저를 받는 경로는 이용자가 별도 제품을 찾아 내려받는 경로와 경쟁 조건이 달랐다. 한편 Netscape는 1998년 브라우저 소스 공개를 통해 개발 방식을 바꾸었다. 이 시기의 결과는 Internet Explorer의 확산뿐 아니라, 독립적인 브라우저 개발을 공개 프로젝트로 지속하려는 Mozilla의 등장에도 이어졌다. 법적 분쟁의 세부 결론과 별개로, 브라우저의 역사를 기술 기능만으로 설명할 수 없음을 보여 준 사건이었다.[34][35]

웹 표준 운동과 Mozilla

웹 표준 운동은 브라우저와 제작 도구가 공통 명세를 일관되게 구현하도록 요구하는 활동이었다. W3C는 1996년 CSS 레벨 1 권고안을 발표하여 글꼴·색상·여백 같은 표현을 문서 구조와 구분해 지정할 수 있는 기반을 마련했고, 1998년에는 문서 객체 모델 레벨 1을 권고안으로 발표했다. 1998년 결성된 Web Standards Project는 이러한 명세의 존재만으로는 충분하지 않다고 보고, 실제 제품에서의 충실한 구현과 개발자 교육을 촉구했다. 같은 문서가 여러 브라우저와 장치에서 이용될 수 있어야 한다는 목표는 제작 비용뿐 아니라 접근성과 문서의 장기적인 이용 가능성에도 관련되었다.[36][37][38]

Mozilla는 Netscape의 소스 공개를 계기로 1998년에 형성되었다. 같은 해 3월 31일 Netscape Communicator 소스가 공개되었고, 이후의 개발은 기존 제품의 다음 버전을 만드는 일에서 여러 브라우저와 개발 도구를 만드는 공동체 활동으로 확대되었다. 1998년 하반기 로드맵에는 Gecko와 크로스 플랫폼 사용자 인터페이스를 사용하는 새 브라우저가 제시되었다. 이 때문에 Mozilla와 Firefox의 역사를 옛 Navigator의 이름만 바꾼 과정으로 이해하는 것은 부정확하다. 조직과 개발 공동체의 연속성 속에서도 문서를 처리하는 엔진과 응용 프로그램의 구조는 크게 바뀌었다. 여러 해의 개발을 거쳐 Mozilla 1.0은 2002년에 배포되었다.[39][40]

통합 인터넷 제품군에서 브라우징에 집중하는 흐름은 2002년 Phoenix의 등장으로 구체화되었다. 이 프로젝트는 뒤에 Mozilla Firefox가 되었고, 2003년에는 독립 비영리 조직인 Mozilla 재단이 설립되었다. 2004년 11월 9일 공개된 Firefox 1.0은 탭, 팝업 차단, 통합 검색과 확장 기능을 하나의 사용 경험으로 제공했다. 이러한 기능을 Firefox가 모두 최초로 발명한 것은 아니지만, 독립적인 공개 브라우저를 일반 이용자가 선택할 수 있는 제품으로 정착시키는 데 기여했다. 공개 소스 검토와 공동 개발, 표준 준수, 최종 사용자의 편의성을 함께 추구한 점은 이후 브라우저 경쟁에서 중요해졌다.[41][42]

WebKit과 모바일 웹의 성장

애플은 2003년 1월 Safari의 공개 시험판을 발표했다. 그 기반에는 KDE의 Konqueror 프로젝트에서 나온 KHTML이 있었고, Apple은 이를 자사 환경에 맞게 발전시켰다. 이후 WebKit은 웹 문서를 처리하는 재사용 가능한 엔진 프로젝트로 성장했으며, 2005년에는 공개 개발 프로젝트로서의 협업이 확대되었다. 여기서 Safari는 사용자 인터페이스와 여러 제품 기능을 갖춘 브라우저이고, WebKit은 그 안에서 웹 콘텐츠를 처리하는 기반이라는 차이가 중요하다. WebKit의 구성 요소인 WebCore는 문서와 스타일, 배치 및 다수의 웹 API를 담당하고, JavaScriptCore는 자바스크립트 실행을 담당한다.[43][44][45]

2007년 발표된 아이폰의 Safari는 작은 화면에서도 기존 웹 페이지를 탐색하고 손가락으로 확대할 수 있는 사용 방식을 강조했다. 이를 통해 모바일 브라우저에는 문서를 해석하는 정확성뿐 아니라 터치 입력, 화면 회전, 확대와 이동을 자연스럽게 처리하는 능력이 중요해졌다. 데스크톱 화면을 전제로 작성된 페이지를 좁은 화면에 보여 주려면 실제 화면 크기와 문서를 배치하는 논리적 영역인 뷰포트를 구분할 필요도 있었다. Apple의 개발 문서는 기본 뷰포트 설정과 viewport 메타 태그로 문서의 폭 및 초기 배율을 조정하는 방식을 설명한다. 같은 HTML을 이용하더라도 모바일 환경의 표시와 조작에는 별도의 설계가 필요하다는 점이 널리 드러난 시기였다.[46][47]

모바일 환경에서는 독립된 브라우저뿐 아니라 다른 앱 안에 웹 콘텐츠를 넣는 웹뷰도 중요한 실행 형태가 되었다. 엔진을 재사용하면 뉴스·게임·소셜 서비스 같은 앱이 HTML과 자바스크립트로 구성된 화면을 표시할 수 있지만, 앱의 이름만으로 내부 엔진을 판단할 수는 없다. 예를 들어 Android 4.4는 2013년에 Chromium 기반으로 새로 구현한 WebView를 도입했다. 이는 Safari의 제품 계보와 Android의 앱 계보가 같다는 뜻이 아니라, 웹 기술이 서로 다른 제품과 운영체제의 공통 구성 요소로 사용된다는 뜻이다. WebKit과 그로부터 분기된 엔진의 확산은 이처럼 브라우저 제품의 역사와 콘텐츠 엔진의 역사를 나누어 이해해야 하는 대표적인 사례가 되었다.[48]

Google Chrome과 Chromium

구글은 2008년 9월 2일 Windows용 Google Chrome 시험판을 공개했다. 같은 시기에 공개된 Chromium은 브라우저 개발의 기반이 되는 오픈 소스 프로젝트로, Google이 배포하는 Chrome 제품과는 구분된다. 초기 Chrome은 WebKit을 렌더링 기반으로 사용하면서 V8 자바스크립트 엔진을 결합했다. 개발의 출발점은 웹 메일이나 문서 작업처럼 브라우저 안에서 많은 코드를 실행하는 응용 프로그램이 늘어났다는 변화였다. 개별 문서를 표시하는 데 적합했던 기존 구조를 그대로 확장하기보다, 서로 다른 웹 응용 프로그램을 안정적으로 실행하고 관리하는 방향이 강조되었다.[49][50]

이를 구현한 핵심 선택 가운데 하나는 다중 프로세스 구조였다. 브라우저의 창과 탭을 관리하는 부분, 웹 문서를 처리하는 렌더러, 당시 사용되던 플러그인을 분리하여 한 구성 요소의 오류가 전체 프로그램으로 번지는 범위를 줄이고자 했다. 렌더러를 샌드박스에서 실행하는 방식은 웹 콘텐츠의 취약점이 파일이나 운영체제에 직접 영향을 미치는 위험을 줄이기 위한 설계였다. 다만 다중 프로세스가 언제나 탭 하나마다 정확히 하나의 프로세스를 배정한다는 뜻은 아니다. 초기 설계에서도 서로 관계가 있는 같은 사이트의 탭은 렌더러를 공유할 수 있었다. 이러한 구조는 보안 경계, 자원 사용량, 응답성 사이의 절충을 브라우저 설계의 중요한 과제로 만들었다.[51]

2013년 Chromium 개발진은 WebKit에서 분기한 Blink를 발표했다. 다른 WebKit 기반 브라우저와의 프로세스 구조 차이를 처리하는 복잡성을 줄이고 자체 구조를 발전시키려는 결정이었다. 이는 Chrome이 Netscape나 Internet Explorer의 이름을 이어받은 것이 아니라, 렌더링 엔진 수준에서 KHTML·WebKit과 연결되는 계보를 가진다는 뜻이다. Chromium은 다른 브라우저 제품의 기반으로도 사용되었다. Opera는 2013년 기존 Presto 기반 제품에서 Chromium 기반 제품으로 전환했고, Microsoft Edge의 Chromium 기반 버전은 2020년 1월 15일 정식 공개되었다. 여러 제품이 같은 기반 코드를 사용하게 되었어도 사용자 인터페이스, 계정 기능, 배포 정책까지 동일해지는 것은 아니다.[52][53][54]

현대 웹 브라우저의 발전

2010년대 이후 브라우저는 동영상 재생, 그래픽 처리와 복잡한 응용 프로그램 실행을 자체 웹 플랫폼 기능으로 지원하는 방향으로 발전했다. 2014년 W3C 권고안이 된 HTML5는 오디오·비디오와 캔버스, 개선된 문서 구조 및 응용 프로그램용 API를 포함했으며, 오류가 있는 문서도 구현 간에 일관되게 처리하도록 규칙을 구체화했다. 2017년에는 주요 브라우저 구현에 WebAssembly 지원이 보급되어, 다른 언어로 작성한 프로그램을 웹에서 실행하기 위한 공통 바이너리 형식이 실용화되었다. 이러한 변화는 별도의 플러그인에 의존하던 일부 기능을 웹 플랫폼의 공통 기능으로 옮기고, 브라우저가 실행할 수 있는 응용 프로그램의 범위를 넓혔다.[55][56][57]

기능의 확대와 함께 보안 및 개인정보 보호도 브라우저 내부 구조의 문제로 다루어졌다. 여러 사이트의 코드를 처리하는 프로그램은 한 사이트의 악성 동작이 다른 사이트의 정보로 이어지지 않도록 격리해야 한다. Mozilla는 2021년 Firefox의 사이트 격리 구조를 설명하며, 자바스크립트 수준의 접근 제한뿐 아니라 사이트 사이의 메모리 공간 분리가 필요한 이유를 제시했다. 개인정보 보호에서는 WebKit이 2017년 발표한 Intelligent Tracking Prevention과 같은 기능이 사이트 간 추적에 쓰이는 쿠키와 저장 데이터의 이용을 제한했다. 이 방향의 발전은 웹을 정상적으로 이용하는 데 필요한 상태와 여러 사이트를 넘나드는 추적을 구별하면서, 호환성과 보호 수준을 함께 고려하는 과제를 낳았다.[58][59]

표준 개발과 시험 방식도 변화했다. 2004년 형성된 WHATWG는 기존 웹과의 호환성을 유지하면서 응용 프로그램 기능을 발전시키는 작업을 진행했고, 2019년 W3C와 WHATWG는 HTML과 DOM의 단일 명세 개발에 협력하기로 합의했다. 이후에도 구현별 차이를 줄이는 일은 별도의 지속적인 과제로 남았다. 2022년 시작된 Interop 협력은 여러 브라우저 개발 조직이 공통 시험과 중점 분야를 정해 상호운용성을 개선하는 사례다. 현대 브라우저의 발전은 새로운 기능을 추가하는 경쟁과 함께, 이미 존재하는 웹이 제품·장치·엔진에 관계없이 작동하도록 시험하고 조정하는 공동 작업으로 이루어진다. 따라서 브라우저의 종류가 늘어나는 현상과 독립적인 엔진 구현이 늘어나는 현상은 같은 의미로 취급할 수 없다.[60][61][62]

정의와 역할

웹 클라이언트로서의 브라우저

문서 뷰어와 응용 프로그램 플랫폼

브라우저와 사용자 에이전트

브라우징 컨텍스트

웹 브라우저와 검색 엔진의 차이

사용자 인터페이스

주소 표시줄과 검색 통합

탭과 창

탐색과 세션 기록

북마크와 읽기 목록

다운로드 관리

개인 정보 보호 모드

사용자 프로필과 동기화

내부 구조

브라우저 프로세스

렌더러 프로세스

사이트 격리와 프로세스 모델

네트워크 서비스

렌더링 엔진

JavaScript 엔진

그래픽 합성과 GPU 가속

오디오와 영상 처리

데이터 저장소

확장 기능 시스템

웹 페이지의 처리 과정

웹 브라우저가 페이지를 표시하는 과정은 탐색 대상의 결정, 자원의 취득, 문서와 스타일의 해석, 프로그램 실행, 화면 생성과 입력 처리로 나누어 설명할 수 있다. 다만 다음 단계들은 페이지 전체에 대해 한 번씩 차례로 끝나는 직렬 절차가 아니다. 문서의 일부가 도착하면 파싱과 추가 요청이 시작되고, 먼저 준비된 내용이 화면에 나타나는 동안 나머지 자원의 다운로드가 계속될 수 있다. 브라우저의 HTTP 캐시가 응답을 재사용하거나, 적용 가능한 서비스 워커가 요청에 직접 응답하면 서버와의 통신 자체가 생략될 수도 있다. 따라서 아래 구분은 작업 사이의 의존 관계를 이해하기 위한 개념적 모형이며, 실제 작업 분담과 병렬화 방식은 브라우저 엔진에 따라 다르다.[63]

URL 해석과 탐색 시작

탐색은 주소 입력, 링크 선택, 폼 제출, 스크립트의 위치 변경 등에서 시작된다. 탐색 대상이 정해지면 브라우저는 URL을 스킴, 호스트, 포트, 경로, 질의 문자열, 프래그먼트 등으로 해석한다. 상대 URL은 기준 URL을 함께 사용하여 해석하며, 문서 안의 링크에서는 문서 주소와 base 요소의 설정이 기준에 영향을 준다. 도메인의 국제화 처리, 퍼센트 인코딩, 기본 포트의 정규화도 이 단계와 관련된다. 예를 들어 HTTPS URL의 호스트와 포트는 통신 상대를 정하는 데 쓰이고, 경로와 질의 문자열은 그 상대에게 요청할 자원을 나타낸다. 같은 서버 주소를 사용하더라도 스킴이나 포트가 다르면 서로 다른 출처가 될 수 있으므로, URL 해석은 네트워크 주소를 얻는 작업이면서 이후 접근 제어의 기준을 정하는 작업이기도 하다.[64]

브라우저는 이어서 탐색 대상이 현재 문서인지 새로운 문서인지, 어느 창이나 프레임을 갱신할지, 세션 기록에 새 항목을 만들거나 기존 항목을 대체할지 판단한다. 동일 문서의 프래그먼트로 이동할 때는 보통 문서를 다시 내려받지 않고 해당 위치로 스크롤하며 주소와 기록을 갱신한다. History API를 이용한 단일 페이지 애플리케이션의 주소 변경도 새 HTML 문서의 취득을 뜻하지 않는다. 반대로 새 문서가 필요한 탐색은 응답의 유형과 보안 조건을 검사한 뒤 문서 생성으로 이어지며, 다운로드 응답이나 외부 프로토콜 처리는 일반적인 HTML 표시와 다른 경로를 따른다. 뒤로 가기에서도 보존된 문서 상태를 재사용할 수 있으므로 주소가 바뀔 때마다 DNS 조회부터 모든 단계를 반복한다고 볼 수 없다.[65]

DNS 조회와 연결 수립

네트워크에서 자원을 받아야 하고 대상 호스트가 도메인 이름으로 주어졌다면, 브라우저는 이용 가능한 이름 해석 체계를 통해 연결할 주소를 얻는다. DNS의 재귀 리졸버는 이미 저장된 응답을 반환하거나 필요한 경우 권한 있는 네임 서버까지 질의를 진행하며, 응답의 유효 기간인 TTL은 캐시 재사용에 관여한다. 브라우저나 운영체제의 캐시, 이미 열려 있는 연결을 활용할 수 있으므로 매 요청마다 외부 DNS 질의가 발생하지는 않는다. 하나의 이름에 여러 주소가 대응할 수도 있고, 이름이 별칭을 거쳐 해석될 수도 있다. URL에 IP 주소가 직접 쓰였다면 일반적인 도메인 이름 조회는 필요하지 않다. 또한 DNS 결과는 연결할 위치를 제공할 뿐, 그 서버가 요청한 HTTPS 서비스의 정당한 주체라는 사실까지 인증하지는 않는다.[66]

연결 수립 방식은 사용할 HTTP 버전에 따라 달라진다. HTTP/1.1과 HTTP/2의 일반적인 HTTPS 연결은 TCP 위에서 TLS 핸드셰이크를 수행하고 인증서를 검증한다. 이때 ALPN을 이용하여 HTTP/2 등의 사용을 협상할 수 있다. 이에 비해 HTTP/3는 UDP를 기반으로 동작하는 QUIC을 사용하며 TLS 1.3 이상의 핸드셰이크가 QUIC 연결 수립 과정에 통합된다. 따라서 모든 웹 요청이 ‘TCP 연결 뒤에 TLS 연결’이라는 같은 절차를 따른다는 설명은 부정확하다. 브라우저는 서버가 알린 대체 서비스 정보 등으로 HTTP/3 사용 가능성을 파악할 수 있고, UDP 연결에 문제가 있으면 TCP 기반 HTTP로 전환할 수 있다. 이미 수립된 연결은 여러 요청에 재사용되며, 특히 HTTP/2와 HTTP/3는 하나의 연결 안에서 여러 스트림을 다중화한다. 연결 재사용 여부와 프로토콜 선택은 실제 페이지의 지연 시간에 큰 영향을 준다.[67]

HTTP 요청과 응답

브라우저는 자원의 목적과 호출 방식에 맞추어 HTTP 요청을 구성한다. 일반적인 문서 읽기에는 GET이 쓰이지만 폼 제출이나 API 호출에는 POST 등 다른 메서드가 사용될 수 있다. 요청에는 대상 자원과 메서드뿐 아니라 허용할 표현 형식, 압축 방식, 언어와 같은 헤더가 들어갈 수 있고, 조건이 맞으면 쿠키나 인증 정보도 함께 전송된다. 요청과 응답의 의미는 HTTP 버전 사이에 공유되지만 전송 표현은 다르다. HTTP/2와 HTTP/3에서는 헤더와 본문이 프레임과 스트림으로 전달되므로, 네트워크상의 모든 요청이 사람이 읽을 수 있는 HTTP/1.1 형태의 텍스트 메시지인 것은 아니다.[68]

응답에는 상태 코드, 헤더, 그리고 필요한 경우 본문이 포함된다. 브라우저는 Content-Type 등으로 표현의 유형을 판단하고, Content-Encoding에 따른 압축 해제를 거쳐 데이터를 해당 처리기로 넘긴다. 성공 응답의 본문이 HTML이면 문서 파싱으로 이어지지만 이미지, PDF, 다운로드 파일은 다른 방식으로 처리될 수 있다. Location을 동반한 적절한 리다이렉트 응답은 다른 주소의 요청으로 이어지며, 오류 상태를 받은 경우에도 서버가 제공한 HTML 오류 페이지를 표시할 수 있다. 응답 본문은 대개 스트림으로 전달되므로 브라우저가 전체 파일의 수신 완료를 기다려야만 그 내용을 처리할 수 있는 것은 아니다.[69]

캐시에 저장된 응답이 사용 가능한지도 중요한 분기점이다. 신선도가 유효한 저장 응답은 네트워크 통신 없이 재사용할 수 있으며, 재검증이 필요하면 ETag나 Last-Modified를 바탕으로 조건부 요청을 보낸다. 서버가 304 Not Modified로 응답하면 새 본문을 전부 전송하는 대신 저장된 표현을 계속 이용할 수 있다. Cache-Control의 no-cache는 매번 저장을 금지한다는 뜻이 아니라 재사용 전 검증을 요구하는 지시이며, no-store와 구별된다. 이처럼 같은 URL에 접근하더라도 캐시 상태와 요청 조건에 따라 실제 전송량과 처리 경로가 달라진다.[70]

자원 불러오기

HTML 문서는 대개 하나의 독립된 파일이 아니라 스타일시트, 스크립트, 이미지, 글꼴, 미디어 등 여러 자원의 출발점이다. 브라우저는 마크업을 처리하면서 이러한 참조를 발견하고 필요한 요청을 시작하며, CSS의 가져오기 규칙이나 스크립트의 모듈 의존성처럼 뒤늦게 발견되는 참조를 통해 추가 자원을 찾기도 한다. 일부 구현은 주 파서가 스크립트 때문에 기다리는 동안에도 미리 읽기 스캐너를 사용하여 뒤쪽 마크업의 자원을 선행 요청한다. 이때 자원의 발견 순서, 다운로드 완료 순서, 실제 적용 순서는 반드시 일치하지 않는다. 대역폭과 연결 수를 공유하는 자원들 사이에는 경쟁이 생기며, 문서 구조를 알아야만 시작할 수 있는 요청은 그만큼 늦어진다.[71]

문서 작성자는 preload로 현재 탐색에 필요한 자원을 일찍 요청하거나 modulepreload로 모듈을 준비하도록 힌트를 줄 수 있다. preconnect는 자원 본문을 받는 대신 통신 연결을 미리 준비하는 힌트이므로 그 역할이 다르다. 미리 받았다는 사실만으로 스타일시트가 적용되거나 스크립트가 실행되는 것은 아니며, 실제 사용 요청과 자원 유형·자격 증명 조건 등이 맞아야 준비된 결과를 활용할 수 있다. 또한 다른 출처에서 가져온 자원을 페이지에 포함하는 것과 그 응답 내용을 스크립트가 읽는 것은 별개의 허용 문제다. 브라우저는 요청 모드와 CORS 규칙 등을 적용하여 이를 구분한다. 제어 중인 서비스 워커가 있는 경우에는 그 워커가 네트워크 요청을 중계하거나 Cache API의 저장 응답으로 대체할 수 있다. 따라서 자원 목록만으로 서버에 실제로 전송되는 요청 수를 단정할 수는 없다.[72]

HTML 구문 분석과 DOM 구성

HTML 파서는 수신한 바이트에 문자 인코딩을 적용하여 문자 스트림을 얻고, 이를 토큰화한 뒤 트리 구성 규칙에 따라 문서를 만든다. 시작 태그, 종료 태그, 문자, 주석 같은 토큰은 현재 삽입 모드와 열린 요소의 상태에 따라 처리된다. 따라서 HTML 파싱은 단순히 시작 태그마다 노드를 하나 만들고 종료 태그마다 한 단계 올라가는 과정이 아니다. 생략된 html·head·body 요소가 보충되거나, 잘못 중첩된 태그와 표 내부의 예상하지 못한 내용이 표준의 오류 복구 규칙에 따라 배치될 수 있다. 일반적인 text/html 문서와 XML로 전달되는 문서는 파싱 규칙과 오류 처리 방식도 다르다. 이 때문에 원본 소스의 태그 배열과 개발자 도구에 나타나는 문서 구조가 반드시 그대로 일치하지는 않는다.[73]

파싱의 결과인 DOM은 문서, 요소, 텍스트, 주석 등을 객체와 노드 관계로 표현하며, 부모·자식·형제 관계를 통해 탐색하고 변경할 수 있는 프로그래밍 인터페이스를 제공한다. DOM은 픽셀 배치도나 화면에 보이는 요소만의 목록이 아니므로, 표시되지 않는 요소와 주석도 문서 구조 안에 존재할 수 있다. 또한 최초 응답의 정적인 복사본에 머무르지 않는다. 스크립트는 DOM API로 노드를 생성·이동·삭제하고 속성이나 텍스트를 바꾸며, 그 결과가 이후 스타일 계산과 화면 갱신에 반영된다. 네트워크 수신과 파싱은 점진적으로 진행될 수 있으므로 실행 시점에 따라 스크립트가 접근할 수 있는 노드의 범위도 달라진다. 이런 구조적 성질은 DOM과 렌더링에 쓰이는 박스 구조를 구별해야 하는 이유다.[74] DOMContentLoaded는 파싱과 관련된 지연 스크립트 처리 뒤 발생하지만, 이미지 등 모든 자원의 로딩이나 최종 화면의 완성을 뜻하지 않는다. load 이벤트도 자신을 지연시키는 자원과 작업의 완료를 나타내는 별도의 기준이다.[75]

CSS 구문 분석과 CSSOM 구성

CSS 처리에서는 스타일시트의 문자 데이터를 토큰과 규칙·선언으로 해석하고, 속성 이름과 값이 해당 문법에 맞는지 판단한다. 지원하지 않는 선언이나 잘못된 문법은 정해진 오류 처리 규칙에 따라 무시되지만, 보통 그것만으로 스타일시트 전체의 처리가 중단되지는 않는다. CSSOM은 이렇게 해석된 스타일시트, 규칙 목록, 선언 등을 스크립트가 조회하거나 조작할 수 있도록 나타내는 객체 모형이다. DOM처럼 모든 스타일 정보가 하나의 단순한 트리로 합쳐진다는 뜻은 아니며, 규칙의 구조와 개별 요소에 최종 적용될 스타일 값도 구별된다. 실제 엔진은 선택자 일치를 빠르게 하기 위한 색인이나 계산 결과의 캐시 같은 별도 내부 구조를 사용할 수 있다.[76]

외부 스타일시트가 화면 표시나 스크립트 실행에 미치는 영향은 HTML 파서 자체의 진행과 나누어 보아야 한다. 적용 대상인 스타일시트는 조건에 따라 초기 렌더링을 지연시킬 수 있지만, CSS를 내려받는 동안 HTML 토큰화와 DOM 구성이 항상 직접 멈추는 것은 아니다. 다만 파서가 만든 선행 스타일시트가 스크립트 차단 조건을 만족하면, 뒤따르는 파서 차단 스크립트는 그 스타일시트를 기다릴 수 있다. 이 경우 스크립트 대기가 HTML 파싱 지연으로 이어진다. 미디어 조건이 맞는지, 스타일시트가 활성화되어 있는지, 요소가 언제 어떤 방식으로 삽입되었는지도 결과에 영향을 준다. 따라서 ‘CSS는 언제나 HTML 파싱을 막는다’거나 ‘CSS는 스크립트와 독립적이다’라는 설명은 둘 다 지나친 단순화다. CSS 다운로드, CSS 파싱, 스크립트 실행 허용, 첫 화면 표시의 완료 시점은 서로 같지 않다.[77]

JavaScript 실행

JavaScript 엔진은 소스를 구문 분석하고 실행에 필요한 표현을 만든 뒤 코드를 수행한다. 인터프리터와 기계어 컴파일러의 조합, 최적화 단계, 코드 캐싱 방법은 구현마다 다르다. 예를 들어 V8에는 Ignition 바이트코드 인터프리터가 있으며, 언어 명세가 모든 엔진에 동일한 내부 실행 파이프라인을 요구하는 것은 아니다. 웹 페이지에서 실행되는 스크립트는 언어 기능 외에도 브라우저가 제공하는 DOM과 네트워크 등의 API를 이용한다. 문서와 스타일을 변경하는 코드가 실행되면 렌더링 작업이 추가로 필요할 수 있고, 긴 동기 실행은 같은 실행 흐름에서 기다리는 입력 처리와 화면 갱신을 늦출 수 있다.[78]

HTML에 포함된 스크립트의 실행 시점은 종류와 속성에 따라 달라진다. 파서가 삽입한 일반 외부 클래식 스크립트에 async와 defer가 없으면 다운로드와 실행이 끝날 때까지 파싱이 중단될 수 있다. async 없이 defer를 지정한 파서 삽입 외부 클래식 스크립트는 파싱과 병행하여 받아 두었다가 문서 파싱 뒤 순서대로 실행하고, async 스크립트는 준비된 시점에 실행되므로 마크업상의 순서를 보장하지 않는다. 파서가 삽입한 모듈 스크립트는 의존 모듈까지 가져오며 기본적으로 파싱 이후 실행하도록 처리되고, async를 붙이면 준비되는 시점을 우선한다. 모듈에는 defer가 별도의 효과를 주지 않는다. 스크립트를 비동기로 내려받는다는 말은 그 실행도 자동으로 별도 스레드에서 수행된다는 뜻이 아니다. 페이지의 주 실행 흐름에서 실행되는 동안에는 다른 작업과 경쟁하며, 별도 작업자인 Web Worker의 실행과 구별된다. 워커는 독립적인 실행 환경을 사용하며 문서의 DOM에 직접 접근하지 않는다.[79]

스타일 계산과 레이아웃

스타일 계산은 DOM의 각 요소에 적용되는 선택자를 찾아 브라우저 기본 스타일, 사용자 스타일, 문서 작성자의 스타일 등을 캐스케이딩 규칙으로 조정하는 과정이다. 선언의 출처와 중요도, 계층, 선택자의 명시도, 등장 순서 등이 충돌 해결에 관여하고, 상속과 초기값을 통해 직접 선언이 없는 속성의 값도 정해진다. 이렇게 얻은 계산값과 문서 구조를 토대로 화면 배치에 필요한 박스가 만들어진다. 이를 흔히 ‘DOM과 CSSOM으로 렌더 트리를 만든다’고 요약하지만, 표준이 모든 엔진에 같은 이름의 단일 자료구조를 강제하는 것은 아니다. display: none인 요소의 하위 트리는 박스를 만들지 않고, 반대로 가상 요소나 익명 박스는 DOM 요소와 일대일로 대응하지 않는다. 줄바꿈이나 다단 배치로 하나의 박스가 여러 조각으로 나뉘기도 한다.[80]

레이아웃은 이러한 박스와 조각의 크기와 위치를 계산한다. 뷰포트 크기, 포함 블록, 글꼴의 측정값, 이미지의 고유 크기, 줄바꿈, 블록·플렉스·그리드 등의 배치 규칙이 결과에 영향을 준다. 새 글꼴이나 이미지 정보가 도착하거나 창 크기·DOM·관련 스타일이 바뀌면 영향받는 범위의 계산이 다시 필요할 수 있다. 브라우저는 변경된 부분과 의존 관계를 추적하여 불필요한 작업을 줄이므로, 작은 변경이 언제나 문서 전체의 레이아웃을 다시 실행하는 것은 아니다. 그러나 스크립트가 스타일을 바꾼 직후 최신 기하 정보를 요구하면 예정된 갱신보다 앞서 동기적인 레이아웃이 강제될 수 있다. 이런 쓰기와 읽기를 반복하면 계산이 누적되어 입력 반응과 프레임 생성이 느려질 수 있으며, 화면의 모양을 바꾸는 작업과 그 결과를 측정하는 작업을 구분하는 것이 성능 분석의 핵심이 된다.[81]

페인트와 합성

페인트는 배치된 내용을 어떤 순서와 속성으로 그릴지 결정하는 단계다. 배경, 테두리, 텍스트, 이미지, 그림자 등을 그리는 명령과 클리핑·변환·겹침 관계를 기록하며, 현대 엔진에서는 이 결과를 디스플레이 리스트 같은 중간 표현으로 보관할 수 있다. 여기서 그리기 명령을 만드는 작업과 명령을 실제 픽셀로 바꾸는 래스터화는 구별된다. 래스터화는 구현과 장치 조건에 따라 CPU나 GPU를 활용할 수 있고, 큰 영역을 타일로 나누어 현재 화면에 필요한 부분부터 처리할 수도 있다. Chromium의 RenderingNG는 스타일, 레이아웃, 사전 페인트, 페인트, 커밋, 레이어화, 래스터화, 합성 등을 구분한다. 이는 한 구현의 구체적인 구조이며, 다른 브라우저가 같은 단계 이름이나 스레드 배치를 사용해야 한다는 뜻은 아니다.[82]

합성은 준비된 표면이나 타일을 위치·변환·투명도 등의 정보에 따라 결합하여 최종 프레임을 구성하는 과정이다. 모든 DOM 요소가 독립된 합성 레이어를 갖는 것은 아니며, 엔진은 효과와 애니메이션의 요구, 가림 관계, 메모리 비용 등을 고려하여 레이어를 구성한다. 이미 래스터화된 내용을 재사용할 수 있는 일부 스크롤이나 transform·opacity 애니메이션은 새 레이아웃과 페인트를 매번 수행하지 않고 합성 중심으로 갱신할 수 있다. 그렇다고 해당 속성을 쓰는 모든 경우에 주 스레드 작업이나 다시 그리기가 완전히 사라지는 것은 아니다. 레이어가 지나치게 많아지면 저장 공간과 관리 비용도 커진다. 최종적으로 합성 결과가 디스플레이의 표시 시점에 전달되지만, 프레임 준비가 늦으면 화면 주사율에 맞추어 새 프레임을 제공하지 못해 움직임이 끊겨 보일 수 있다.[83]

사용자 입력과 화면 갱신

페이지가 표시된 뒤에도 브라우저는 포인터 이동, 클릭, 키보드 입력, 스크롤과 같은 동작을 계속 처리한다. 입력 위치와 화면의 기하 정보를 비교하는 히트 테스트는 대상 요소를 찾는 데 쓰이며, DOM 이벤트는 이벤트 경로의 캡처·대상·버블링 규칙에 따라 등록된 처리기로 전달된다. 모든 이벤트가 버블링하는 것은 아니고, 기본 동작의 취소 가능성도 이벤트 종류에 따라 다르다. 스크립트가 입력을 받아 DOM이나 스타일을 변경하면 필요한 렌더링 단계가 다시 예약된다. 한편 Chromium처럼 합성 스레드에서 처리 가능한 스크롤 경로를 둔 구현에서는 일부 화면 이동이 주 스레드의 JavaScript 실행과 독립적으로 진행될 수 있다. 기본 스크롤을 취소할 수 있는 이벤트 처리기가 관여하면 주 스레드의 판단을 기다려야 하는 경우가 있어, 입력 처리 방식 자체가 체감 반응성에 영향을 준다.[84]

작업의 실행 순서는 이벤트 루프와 연결된다. 사용자 입력 처리나 타이머 콜백 등은 작업으로 예약될 수 있고, Promise 반응과 같은 마이크로태스크는 정해진 체크포인트에서 처리된다. 체크포인트에서는 새로 추가된 항목을 포함하여 대기 중인 마이크로태스크를 계속 처리할 수 있으므로, 이를 끝없이 추가하면 다른 작업과 렌더링을 지연시킬 수 있다. 화면 갱신은 모든 작업 뒤에 무조건 한 번씩 일어나는 것이 아니라 표시 장치의 주사율, 문서의 가시성, 브라우저의 제한 정책 등을 고려한 렌더링 기회에 이루어진다. requestAnimationFrame 콜백은 이 갱신 과정에 맞추어 실행할 코드를 예약하는 수단이며 고정된 초당 실행 횟수를 보장하지 않는다. 따라서 데이터 변경, JavaScript 실행 완료, 픽셀 생성, 실제 화면 표시를 같은 순간으로 취급해서는 안 된다.[85]

렌더링 엔진

Blink

Gecko

WebKit

역사적 렌더링 엔진

엔진 계통과 코드 공유

렌더링 엔진과 브라우저의 구분

JavaScript 엔진

V8

SpiderMonkey

JavaScriptCore

JavaScript 해석과 컴파일

JIT 컴파일

가비지 컬렉션

WebAssembly 실행

렌더링 엔진과의 연동

웹 플랫폼

HTML

CSS

JavaScript와 ECMAScript

Document Object Model

Web API

네트워크 API

그래픽과 멀티미디어 API

장치 접근 API

백그라운드 실행

Progressive Web App

웹 표준과 상호 운용성

WHATWG

World Wide Web Consortium

Ecma International

Internet Engineering Task Force

Living Standard

브라우저 구현과 표준화

상호 운용성 시험

접두사와 실험적 기능

하위 호환성

보안

동일 출처 정책

출처와 사이트

샌드박스

사이트 격리

HTTPS와 인증서 검증

콘텐츠 보안 정책

권한 관리

다운로드 보호

악성 웹사이트와 피싱 방지

브라우저 취약점과 업데이트

개인 정보 보호

쿠키

제3자 쿠키

캐시와 브라우저 저장소

브라우저 지문 채취

추적 방지

개인 정보 보호 모드의 범위

데이터 삭제와 보존

동기화 데이터

네트워크와 저장소

HTTP와 HTTPS

연결 재사용과 다중화

프록시와 VPN

DNS 처리

HTTP 캐시

쿠키 저장소

Web Storage

IndexedDB

Cache API

오프라인 실행

성능과 자원 관리

페이지 로딩 성능

렌더링 성능

JavaScript 실행 성능

메모리 관리

탭 절전과 폐기

네트워크 최적화

사전 연결과 사전 로딩

GPU 가속

전력 소비

확장 기능과 자동화

브라우저 확장 기능

콘텐츠 스크립트

권한과 격리

사용자 스크립트

북마클릿

개발자 도구

WebDriver

헤드리스 브라우저

브라우저 자동화

접근성과 국제화

접근성 트리

보조 기술 연동

키보드 탐색

확대와 글꼴 설정

문자 인코딩

국제화와 현지화

오른쪽에서 왼쪽으로 쓰는 문자

입력기와 복합 문자 처리

브라우저의 종류

그래픽 웹 브라우저

텍스트 기반 웹 브라우저

데스크톱 웹 브라우저

모바일 웹 브라우저

임베디드 웹 브라우저

헤드리스 웹 브라우저

키오스크 브라우저

프라이버시 중심 브라우저

게임기와 스마트 TV의 브라우저

주요 웹 브라우저

Google Chrome

Safari

Microsoft Edge

Mozilla Firefox

Opera

Samsung Internet

Chromium 계열 브라우저

기타 웹 브라우저

운영체제와의 관계

데스크톱 운영체제

모바일 운영체제

시스템 웹뷰

기본 브라우저

파일과 프로토콜 연결

운영체제 보안 기능과의 연동

브라우저 기반 운영체제

웹 응용 프로그램과의 관계

전통적인 웹사이트

단일 페이지 응용 프로그램

Progressive Web App

브라우저 게임

클라우드 응용 프로그램

원격 데스크톱과 스트리밍

웹 기반 개발 환경

호환성과 웹 개발

표준 모드와 호환 모드

브라우저별 차이

기능 탐지

반응형 웹 디자인

폴리필과 트랜스파일

브라우저 호환성 시험

개발자 도구를 이용한 분석

배포와 업데이트

운영체제 내장 브라우저

독립 설치형 브라우저

모바일 애플리케이션 스토어

자동 업데이트

장기 지원과 기업 정책

관리형 브라우저

생태계와 거버넌스

브라우저 개발사

오픈 소스 프로젝트

표준화 단체

웹 개발자와 웹사이트

검색 엔진과 기본 검색 계약

인증 기관

브라우저 엔진의 다양성

다른 소프트웨어와의 관계

웹 서버

검색 엔진

운영체제

네트워크 클라이언트

문서 뷰어

응용 프로그램 런타임

게임 엔진과 사용자 인터페이스 도구

영향

웹의 대중화

소프트웨어 배포 방식의 변화

운영체제 독립적인 응용 프로그램

정보 접근과 통신

전자 상거래와 온라인 서비스

클라우드 컴퓨팅

모바일 컴퓨팅

개방형 웹과 플랫폼 경쟁

장점과 한계

관련 문서

  1. W3C: A Little History of the World Wide Web ↩
  2. Doug Engelbart Institute: 1968 Demo ↩
  3. RFC 854: Telnet Protocol Specification ↩
  4. RFC 1436: The Internet Gopher Protocol ↩
  5. Tim Berners-Lee: Information Management, A Proposal ↩
  6. CERN: The birth of the Web ↩
  7. Tim Berners-Lee: The WorldWideWeb browser ↩
  8. Tim Berners-Lee: The WorldWideWeb browser의 기능과 초기 화면 설명 ↩
  9. Tim Berners-Lee: 1991년 8월 WorldWideWeb 공개 소개 ↩
  10. CERN: WorldWideWeb NeXT Application의 역사 ↩
  11. CERN: Line Mode browser available at CERN ↩
  12. W3C: 초기 웹의 연표 ↩
  13. W3C: Quick Guide for W3C Line Mode Browser ↩
  14. W3C: 1992년 Line Mode Browser 설명 ↩
  15. W3C: libwww의 구조와 라인 모드 브라우저 ↩
  16. Tim Berners-Lee: 초기 브라우저와 Mosaic에 대한 기록 ↩
  17. W3C: MidasWWW Browser의 초기 배포 문서 ↩
  18. NCSA: 1993년 Mosaic 공개 기록 ↩
  19. NCSA: Mosaic 원본 설명서의 1993년 4월 1.0 배포 기록 ↩
  20. NCSA: NCSA Mosaic 프로젝트 기록 ↩
  21. NCSA: Mosaic의 사용성·개발·지원에 관한 회고 ↩
  22. University of Illinois: Mosaic의 보급과 상업적 기술 이전 ↩
  23. CERN: 웹 소프트웨어의 공개 ↩
  24. Allen Wirfs-Brock·Brendan Eich: JavaScript, The First 20 Years의 Netscape 초기 사업과 연표 ↩
  25. RFC 7568: SSL 3.0의 사용 중단 ↩
  26. RFC 6265: HTTP State Management Mechanism ↩
  27. RFC 6101: 역사 문서로 보존된 SSL 3.0 명세 ↩
  28. Allen Wirfs-Brock·Brendan Eich: JavaScript, The First 20 Years ↩
  29. Ecma International: ECMAScript 명세의 기원과 첫 표준 ↩
  30. Microsoft: Internet Explorer의 초기 배포와 발전 ↩
  31. 미국 연방법원: Netscape가 미들웨어 플랫폼으로 제기한 경쟁 ↩
  32. Web Standards Project: Mission과 브라우저 비호환성 문제 ↩
  33. Web Standards Project: 웹 표준을 사용해야 하는 이유 ↩
  34. 미국 연방법원: Microsoft 사건의 배포 경로와 Windows 결합에 관한 사실인정 ↩
  35. Mozilla: 프로젝트의 역사 ↩
  36. W3C: 1996년 CSS1 권고안 발표 ↩
  37. W3C: DOM Level 1 Specification ↩
  38. Web Standards Project: Mission ↩
  39. Mozilla: Mozilla Timeline ↩
  40. Mozilla: History of the Mozilla Project ↩
  41. Mozilla: Phoenix·재단·Firefox의 주요 연표 ↩
  42. Mozilla: Firefox 1.0 공식 발표 ↩
  43. Apple: 2003년 Safari 발표와 KHTML 기반 설명 ↩
  44. WebKit: 2005년 공개 개발 블로그의 시작 ↩
  45. WebKit: 엔진의 주요 구성 요소 ↩
  46. Apple: 2007년 iPhone과 모바일 Safari 발표 ↩
  47. Apple: Safari Web Content Guide의 뷰포트 설명 ↩
  48. Chromium: Android 4.4의 Chromium 기반 WebView 도입 ↩
  49. Google: 2008년 Chrome 공개 ↩
  50. Chromium: 2008년 프로젝트와 WebKit·V8 통합 설명 ↩
  51. Chromium: 2008년 Multi-process Architecture 설명 ↩
  52. Chromium: Blink 발표 ↩
  53. Opera: Opera 15의 구조 전환 ↩
  54. Microsoft: 새로운 Chromium 기반 Edge의 정식 배포 ↩
  55. W3C: 2014년 HTML5 권고안 ↩
  56. W3C: HTML5의 멀티미디어·그래픽 기능 ↩
  57. Mozilla: 2017년 주요 브라우저의 WebAssembly 지원 ↩
  58. Mozilla: Firefox의 사이트 격리 보안 구조 ↩
  59. WebKit: Intelligent Tracking Prevention의 도입 ↩
  60. WHATWG: 설립 배경과 작업 방식 ↩
  61. W3C: 2019년 WHATWG와의 HTML·DOM 협력 합의 ↩
  62. web.dev: Interop 2022의 공동 상호운용성 개선 ↩
  63. IETF RFC 9111: HTTP 캐시, W3C: Service Workers의 FetchEvent ↩
  64. WHATWG: URL Standard의 URL 표현·파싱·출처, WHATWG: HTML Standard의 문서 기준 URL ↩
  65. WHATWG: HTML Standard의 탐색과 세션 기록 ↩
  66. IETF RFC 1034: 도메인 이름 해석과 캐싱 ↩
  67. IETF RFC 9113: HTTP/2 연결 수립, IETF RFC 9114: HTTP/3 연결 수립과 재사용 ↩
  68. IETF RFC 9110: HTTP 메시지와 메서드, IETF RFC 9113: 프레임과 스트림 ↩
  69. IETF RFC 9110: 표현 메타데이터와 상태 코드, WHATWG: Fetch Standard의 응답 본문 처리 ↩
  70. IETF RFC 9111: HTTP 캐시의 신선도·검증·Cache-Control ↩
  71. Google Chrome: 렌더러의 하위 자원 로딩과 미리 읽기 ↩
  72. WHATWG: HTML Standard의 자원 링크 유형, WHATWG: Fetch Standard의 CORS, W3C: Service Workers의 fetch 처리 ↩
  73. WHATWG: HTML Standard의 토큰화와 트리 구성 ↩
  74. WHATWG: DOM Standard의 노드 트리와 변경 알고리즘 ↩
  75. WHATWG: HTML Standard의 파싱 종료 절차 ↩
  76. W3C: CSS Syntax Module Level 3, W3C: CSS Object Model의 스타일시트와 규칙 ↩
  77. WHATWG: HTML Standard의 스타일과 스크립트 상호작용 ↩
  78. V8: Ignition 인터프리터, WHATWG: HTML Standard의 웹 애플리케이션 API와 실행 모형 ↩
  79. WHATWG: HTML Standard의 script 요소와 실행 방식, WHATWG: HTML Standard의 Web Workers ↩
  80. W3C: CSS Cascading and Inheritance Level 5, W3C: CSS Display의 박스 트리와 조각 ↩
  81. Google web.dev: 레이아웃과 강제 동기 레이아웃 ↩
  82. Google Chromium: RenderingNG의 렌더링 파이프라인 ↩
  83. Google Chromium: RenderingNG의 스레드·GPU 작업, Google Chrome: 합성과 래스터화의 관계 ↩
  84. WHATWG: DOM Standard의 이벤트 전달, Google Chrome: 입력 이벤트와 합성 스레드 ↩
  85. WHATWG: HTML Standard의 이벤트 루프·마이크로태스크·렌더링 갱신 ↩