Frontend Labs
⋯

Part III — Inside the browser

18. The browser's process model: multi-process architecture and site isolation

A modern browser is not one program — it's several cooperating processes, because a single-process browser means one crashed tab (or one exploited renderer bug) takes down everything, including your banking tab open in another window.

┌─────────────────────────────────────────────────────────────┐
│ Browser Process (1, privileged: disk, network sockets, UI)   │
│  - owns the address bar, bookmarks, extensions installation  │
│  - the ONLY process allowed to touch the filesystem directly │
└───────────────┬───────────────────────────────────────────────┘
                │ IPC (Chrome: Mojo; Firefox: IPDL)
    ┌───────────┼──────────────┬─────────────────┬───────────────┐
    ▼           ▼              ▼                 ▼               ▼
┌────────┐ ┌────────┐    ┌──────────┐      ┌───────────┐  ┌────────────┐
│Renderer│ │Renderer│ ... │GPU process│      │Network    │  │Utility procs│
│(tab A) │ │(tab B) │    │(compositing,      │process    │  │(audio, etc.)│
│sandboxed│ │sandboxed│   │ rasterization)   │(fetches,   │  └────────────┘
│no disk/ │ │no disk/ │   └──────────┘      │ DNS, TLS) │
│network  │ │network  │                     └───────────┘
└────────┘ └────────┘

Each renderer process runs a heavily sandboxed copy of the engine (Blink, Gecko, or WebKit) and is deliberately denied direct filesystem/network access — it must ask the privileged browser process via IPC for everything. This is the concrete mechanism that limits the blast radius of a compromised renderer (e.g., an exploited PDF parser or a malicious ad) from becoming a full system compromise.

Site isolation (shipped in Chrome since 2018, largely in response to Spectre) puts each origin — not just each tab — in its own renderer process by default. This is why opening dev tools and inspecting the "Frames" tree of a page with cross-origin iframes shows genuinely separate processes: a malicious iframe's renderer process physically cannot read memory belonging to the parent page's renderer process, closing off an entire class of speculative-execution side-channel attacks (§51).

Real-world example. Task Manager (Chrome: Shift+Esc) literally shows you this architecture — one row per renderer process (often one per tab, sometimes more for cross-origin iframes), one row for the GPU process, one for the network service. A tab using 400MB isn't "the browser" using 400MB — it's that specific renderer process's V8 heap + DOM + layout data.

Generated from real-life-JS-guide.md · 8 Oct 2026 16:36