Gernar
Frontend DeveloperBrowser API, сеть и рендеринг

Интервью-вопрос

Что происходит, когда пользователь вводит URL в браузере

Короткий ответ: браузер разбирает адрес, находит сервер, устанавливает соединение, получает документ и строит страницу. Важно показать не только порядок, но и места, где появляются задержки, блокировки рендера и ошибки фронтенда.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 60 правильно

С чего лучше начать ответ на интервью?

Вы объясняете путь от ввода адреса до появления страницы.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

Хороший ответ не обязан быть лекцией по сетям. Вам достаточно показать последовательность и объяснить, почему она важна для frontend-разработчика.

Самый безопасный порядок такой: URL, кэши и DNS, соединение, HTTP, ответ, парсинг HTML, загрузка ресурсов, построение страницы, выполнение JavaScript и дальнейшие запросы приложения.

Если вы начинаете с фразы "браузер отправляет запрос на сервер", добавьте перед этим хотя бы разбор URL и DNS. Иначе пропадает часть, где часто теряется время до первого байта.

Хороший ответ
  1. 1Разобрать URL и схему
  2. 2Найти IP через кэши или DNS
  3. 3Установить TCP и TLS для HTTPS
  4. 4Получить HTML и ресурсы
  5. 5Построить DOM, CSSOM, layout и paint
Слабый ответ
  1. 1Сказать только про запрос к серверу
  2. 2Пропустить DNS и TLS
  3. 3Смешать HTML, CSS и API в один ответ
  4. 4Забыть про блокировки рендера
  5. 5Не объяснить, что это меняет во фронтенде

Что происходит до запроса

Браузер сначала разбирает введенную строку. Если схема не указана, он может попробовать выбрать https или обработать ввод как поисковый запрос. Для нормального URL важны схема, host, порт, путь, query и fragment.

Пример:

https://shop.example.com:443/products?id=10#reviews

https задает протокол. shop.example.com это host. 443 это порт. /products это путь. ?id=10 отправляется на сервер. #reviews остается в браузере и может использоваться для прокрутки или клиентского роутинга.

Практический риск: не передавайте токены, email и одноразовые секреты через URL. Query может попасть в логи сервера, аналитику, историю и referrer. Fragment не уходит на сервер, но виден в адресной строке, истории и клиентском коде. Безопаснее использовать код обмена с коротким сроком жизни, защищенные cookies или серверную сессию, если это подходит вашему сценарию.

После разбора адреса браузеру нужен IP-адрес. Он проверяет кэши браузера, ОС, иногда настройки сети, и только потом идет к DNS-резолверу. Если домен уже был недавно открыт, этот шаг может быть почти незаметным.

Практический вывод: каждый новый origin может добавить задержку. Поэтому набор сторонних доменов для аналитики, шрифтов, виджетов и рекламы влияет не только на размер ресурсов, но и на DNS, соединения и TLS.

Соединение, HTTPS и HTTP-ответ

Когда IP найден, браузер устанавливает соединение. Для классического HTTPS это TCP, затем TLS. На TLS-этапе проверяется сертификат, домен, срок действия и цепочка доверия. Если проверка не проходит, пользователь может увидеть предупреждение, а запросы из приложения могут падать.

Затем браузер отправляет HTTP-запрос. Для навигации это обычно GET за HTML-документом. Сервер отвечает статусом, заголовками и телом ответа. Заголовки могут управлять кэшем, типом контента, сжатием, cookies, политиками безопасности и редиректами.

Не говорите, что CORS проверяется перед любой загрузкой страницы. Обычная навигация на URL не равна fetch из JavaScript. CORS важен, когда код страницы обращается к другому origin и браузер решает, можно ли дать вашему JavaScript доступ к ответу.

Как браузер строит страницу

Браузер не ждет, пока скачает абсолютно все. Он начинает парсить HTML потоково, строит DOM и по мере встреченных тегов запрашивает дополнительные ресурсы: CSS, JavaScript, картинки, шрифты, favicon и другие файлы.

CSS участвует в построении CSSOM. Затем DOM и CSSOM используются для render tree, после чего идут layout и paint. Если CSS большой или приходит поздно, пользователь дольше ждет видимый контент.

JavaScript может менять этот процесс. Обычный скрипт без атрибутов может остановить парсинг HTML, пока файл не загрузится и не выполнится. defer сохраняет порядок и выполняется после парсинга HTML. async выполняется как только загрузится, поэтому порядок между несколькими async-скриптами не гарантирован.

Плохой пример:

<script src="/heavy-analytics.js"></script>
<h1>Catalog</h1>

Такой скрипт может задержать появление заголовка и ухудшить метрики первого отображения. Если файл упадет или будет долго грузиться, пользователь увидит пустой экран дольше, а аналитика может исказить реальное поведение. Безопаснее грузить некритичный код с defer, после основного контента или по событию, если бизнес-логика не требует другого порядка.

Что меняет кэш и повторное открытие

При повторном посещении сценарий может быть короче. DNS может быть в кэше, соединение может переиспользоваться, ресурсы могут прийти из HTTP cache, memory cache или Service Worker. При переходе назад браузер может восстановить страницу из back-forward cache почти мгновенно.

Поэтому на интервью лучше говорить "в общем случае" или "при холодной загрузке". Это звучит точнее, чем утверждение, что браузер всегда проходит все шаги с нуля.

Практический вывод для frontend

Этот вопрос проверяет не только память. Он связан с реальными решениями в интерфейсе: сколько доменов вы подключаете, как грузите критичный CSS, где ставите скрипты, какие заголовки кэша ожидаете от сервера и как обрабатываете редиректы.

Хорошая короткая формулировка для интервью:

При холодной навигации браузер разбирает URL, находит IP через DNS, устанавливает соединение и для HTTPS делает TLS. Потом отправляет HTTP-запрос, получает HTML и начинает потоково строить страницу: DOM, CSSOM, render tree, layout и paint. CSS и синхронные скрипты могут блокировать отображение, а кэш, Service Worker и повторное соединение могут сильно сократить часть шагов.

Практический вывод: при отладке медленной страницы смотрите не только на React-компоненты. Проверьте redirects, DNS и TLS, размер критичного CSS, синхронные скрипты, кэширование, лишние origins и повторные API-запросы после гидрации.

Частые ошибки

Где обычно ошибаются

Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.

  1. 1

    Пропуск DNS и соединения

    Если сразу перейти к HTTP-запросу, ответ выглядит как заученная схема без сети. Лучше коротко назвать DNS, TCP и TLS. Эти этапы дают задержку до первого байта и объясняют пользу CDN, preconnect и кэшей.
  2. 2

    Смешивание DOM и render tree

    DOM это дерево HTML-узлов, а render tree учитывает стили и видимость элементов. Если сказать, что браузер просто строит DOM и показывает страницу, вы пропустите CSSOM, layout и paint. Тогда не получится объяснить, почему CSS и шрифты влияют на первый рендер.
  3. 3

    Категоричное описание JavaScript

    Фраза "JavaScript выполняется после HTML" слишком грубая. Обычный <script> может блокировать парсинг, defer ждет DOM, а async выполняется после загрузки файла без сохранения порядка. Это влияет на ошибки инициализации и на скорость отображения.
  4. 4

    Игнорирование кэша

    При повторном открытии часть шагов может быть короче или вообще не пойти в сеть. HTTP cache, Service Worker и back-forward cache меняют поведение страницы. Поэтому важно не описывать каждый переход как полностью холодную загрузку.
  5. 5

    Неверное объяснение CORS

    CORS не нужен для обычной навигации на страницу, но важен для запросов из JavaScript к другому origin. Браузер применяет политику и может заблокировать доступ к ответу, даже если сервер физически ответил на запрос.
  6. 6

    Токены и личные данные в URL

    Query уходит на сервер и может попасть в логи, аналитику, историю и referrer. Fragment не отправляется на сервер, но остается в истории браузера и доступен клиентскому коду. Не передавайте access token, email или одноразовые секреты через URL. Безопаснее использовать короткоживущий код обмена, cookie с защитными атрибутами или серверную сессию, если это подходит архитектуре.

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, которыми проверяют понимание сети, рендера и поведения браузера.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание