ブラウザプロセスとナビゲーション
現代のブラウザ ( 特に Chromium ベースのもの ) は、単一のプログラムではなく、OS のように複数のプロセスが協調して動作する分散システムです。
1.1 ブラウザのマルチプロセスアーキテクチャ
ユーザーがブラウザアイコンをクリックした瞬間、
メインとなる ブラウザプロセス ( Browser Process ) が立ち上がります。
これはアプリケーション全体を統括する指揮官のような存在であり、タブ外の UI ( アドレスバー、ブックマーク、戻るボタンなど ) や、ネットワーク通信、ストレージへのアクセス権限などを管理します。
しかし、Web ページのレンダリングそのものは、セキュリティと安定性の観点から分離されたレンダラープロセス ( Renderer Process ) で行われます。
これにより、あるタブがクラッシュしてもブラウザ全体が落ちることを防ぎ、悪意のある Web サイトが他のタブのデータや OS のリソースにアクセスすることを防ぎます。
さらに、描画処理を専門に行う GPU プロセスや、プラグインを扱うプロセスなどが独立して存在します 。
1.2 URL の解析と入力処理
ユーザーがアドレスバー(Omnibox)にフォーカスし、入力を開始すると、
ブラウザプロセスのUIスレッドがその入力を解析します。
検索クエリか、URLか?
ブラウザは入力された文字列をヒューリスティックに解析します。
スペースが含まれているか、有効なドメイン名が含まれているか、プロトコルスキーム(http:// など)があるかなどを判定します。
-
検索クエリの場合 : ユーザーが設定したデフォルト検索エンジンの検索URL (例: https://www.google.com/search?q=...) に変換されます。
-
URLの場合 : 完全なURL形式に正規化されます。プロトコルが省略されている場合、現代のブラウザはデフォルトでHTTPSを試行する傾向にあります。
HSTS (HTTP Strict Transport Security) の事前チェック
ここで重要なのがHSTSです。
ブラウザは「HSTSプリロードリスト」と呼ばれる巨大な静的リストを内部に持っています。
もしユーザーが http://qiita.com と入力しても、そのドメインがHSTSリストに含まれていれば、ブラウザはネットワークリクエストを発行する前に、即座に内部で https://qiita.com へと書き換えます。
これにより、最初の平文通信に対する中間者攻撃(Man-in-the-Middle Attack)のリスクを排除します。
1.3 ナビゲーションの開始と beforeunload
ユーザーがEnterキーを押すと、UIスレッドは現在のページ(もしあれば)に対して「移動しても良いか?」を確認します。
これは beforeunload イベントとしてJavaScriptでフック可能です。
「入力中のデータがあります、移動しますか?」というアラートが出るのはこの処理のためです。
現在のレンダラープロセスがナビゲーションを承認すると、ブラウザプロセスはネットワークスレッドに対してリソースの取得を指示します。タブのローディングスピナーが回り始めるのはこの瞬間です。
