URL이 입력될 때 브라우저에서 일어나는 일
- 브라우저 아키텍처에는 표준이 없지만 대부분의 브라우저는 여러 프로세스가 협력하는 멀티 프로세스에 의해 작동한다.
- 대표적인 웹 브라우저 중 하나인 크롬 또한 그렇다. 크롬은 메인 프로세스 격인 브라우저 프로세스와 함께 렌더러 프로세스, GPU 프로세스, 플러그인 프로세스 등 협력하는 여러 프로세스를 포함한다.
- 브라우저 프로세스의 주소표시줄에 유효한 주소가 입력되면 UI 스레드는 네트워크 스레드를 호출한다. 이 때부터 네비게이션이 시작된다. 한편, UI 스레드는 웹 페이지를 보여주기 위한 렌더러 프로세스를 찾아 네트워크 스레드로부터 데이터가 도착할 시점에 렌더러 프로세스가 대기할 수 있도록 한다.
- 네트워크 스레드는 DNS를 거쳐 웹 서버로 클라이언트의 요청을 전송한다. 서버가 HTML 파일을 주면 이는 렌더러 프로세스에 전달되고, HTML이 아닌 zip 파일 등이 도착하면 다운로드 관리자한테 이를 전송한다.
- 데이터와 렌더러 프로세스가 모두 준비되었다면 렌더러 프로세스가 일할 준비가 된 셈이다. 이 때 브라우저 프로세스와 렌더러 프로세스 간 통신(IPC)이 필요하다. 렌더러 프로세스는 브라우저 프로세스에게 준비를 마쳤음을 알린다.
- 브라우저 프로세스가 렌더러 프로세스의 "준비 완료" 요청을 수락하면 Commit이 발생한다. 커밋 발생에 따라 네비게이션이 완료되고 렌더러 프로세스가 본격적으로 HTML을 파싱하기 시작한다. 한편, 이 시점에 주소표시줄이 업데이트되고 탭의 세션 기록이 갱신된다.
- 렌더러 프로세스가 렌더링을 모두 완료하면 이를 브라우저 프로세스에게 알린다. 이 때 UI 스레드는 탭의 로딩 스피너를 중지시킨다.
만약 사용자가 다른 URL을 입력한다면
브라우저는 동일한 과정을 거치기 전에 beforeunload
이벤트의 등록 유무를 확인해야 한다. 이벤트의 등록 유무는 결국 렌더러 프로세스가 알고 있기 때문에 브라우저 프로세스가 렌더러 프로세스에게 이를 확인하는 과정을 거치게 된다.