Introduce
최근에 네트워크나 운영체제 쪽으로 CS 지식이 부실하다는 생각이 든다. 전공 수업에서 다 배웠던 내용이긴 하지만 시간이 좀 지나기도 했고, 그때는 단지 시험에서 점수를 잘 받기 위해서 공부했었던 것 같아서 이번에 짬짬이 정리해보고 CS 지식들을 리마인드 해보고자 한다.
그래서 어떻게 리마인드 할까? 무작정 다시 외워야 할까? 그냥 무작정 다시 외우기만 하면 금방 까먹을 것 같다는 생각이 든다. 그래서 내가 선택한 방법은 특정 주제를 던지고 그 주제에 대해서 최대한 스토리를 그려보며 공부해보고자 한다.
이번 게시글의 주제는 www.google.com 을 브라우저에 입력했을때 어떤일이 일어날까? 이다.
1. 사용자가 브라우저에 www.google.com 을 입력한다.
2. 브라우저는 캐싱된 DNS 기록을 통해 google.com에 대응되는 IP주소가 있는지 확인한다.
내가 입력한 google.com을 컴퓨터가 읽을 수 있을까? 당연하게도 읽을 수 없다. 그렇기에 서버가 읽을 수 있는 IP주소로 변환을 해주어야 한다.
이전에 만약 google.com으로 접속한 기록이 있다면 브라우저는 어딘가에 google.com 에 대한 IP 주소를 가지고 있을 것이다. 그러므로 IP 주소를 찾기 위해 4가지의 캐시 기록을 순차적으로 체크하게 된다.
1. 브라우저 캐시: 브라우저(Chrome, Firefox, Edge 등)는 최근에 방문한 도메인의 DNS 결과를 내부 캐시에 저장한다.
2. 운영체제 캐시: 브라우저 캐시에 없다면 운영체제의 DNS Resolver 캐시에서 찾는다.
3. 로컬 라우터 캐시: 운영체제 캐시에도 없다면 라우터(공유기)가 가진 DNS 캐시에서 확인한다.
4: ISP(인터넷 서비스 제공자) 캐시 라우터 캐시에도 없다면 ISP(KT, SK, LG 등) DNS 서버의 캐시에서 조회한다.
3. 만약 캐싱된 정보가 없다면 ISP의 DNS 서버가 www.google.com을 호스팅하고 있는 IP 주소를 찾기 위해 DNS Query를 전송한다.
DNS란 도메인과 IP주소를 가지고 있는 데이터베이스이다.
만약 ISP 캐시까지 찾았으나 도메인과 일치하는 IP주소를 찾지 못한경우 ISP의 DNS 서버가 DNS query로 Root DNS에 요청을 보내게 된다. Root DNS 는 도메인의 TLD(Top-Level Domain) DNS 서버만 알려주게 된다. (com 도메인을 관리하는 TLD DNS 서버의 주소 반환)
이제 TLD DNS 서버에 다시 요청을 보내게 되면 google.com 도메인을 관리하는 DNS 서버를 알게된다.
그리고 마지막으로 google.com 의 DNS 서버로 요청을 보내게 되면 google.com 의 DNS 서버는 IP 주소를 반환해준다.
이처럼 IP 주소를 반환받거나 또는, 에러를 발생시킬 때까지 계속해서 Recursive Search 한다.
4. IP 주소를 확인했으니 연결하자! TCP Connection
브라우저는 정보 전달을 위해 DNS로 받은 Google 서버의 IP 주소로 TCP 연결을 하게 된다. 이때 TCP 연결을 위해 TCP 3-way Handschake 과정을 진행하고, 이를 통해 구글 서버간의 TCP 연결이 확립된다.
📌 3-way Handshake
- SYN (Synchronize)
- 브라우저가 Google 서버에 SYN 패킷을 전송하며, 연결할 준비가 됐어? 라고 묻는다.
- SYN-ACK (Synchronize-Acknowledge)
- Google 서버는 SYN-ACK 패킷을 보내며 나는 준비 됐어! 너는 준비 됐니? 라고 응답한다.
- ACK (Acknowledge)
- 브라우저가 다시 ACK 패킷을 보내며 나도 준비 됐어! 연결을 시작하자! 라고 확정짓게 된다.
Google 서버는 HTTPS를 사용하기 때문에 TCP 연결이 완료되면 TLS handshake 가 시작된다.
📌 TLS Handshake
- Client Hello
- 브라우저는 지원 가능한 암호화 알고리즘과 TLS 버전을 Google 서버로 전송한다.
- Sever Hello
- Google 서버가 암호화 알고리즘과 SSL 인증서를 브라우저에게 전달한다.
- 인증서 검토
- 브라우저는 CA 인증서 체인을 통해 Google의 SSL 인증서가 신뢰할 수 있는지를 확인한다.
- 세션 키 교환
- 브라우저와 Google 서버는 대칭키를 교환하며, 이후의 데이터 통신을 암호화한다.
- 연결 완료
- 양쪽 모두 보안 연결 설정이 완려됨을 확인하고, HTTPS 연결이 시작된다.
5. Google 서버에 HTTP Request 전송
TCP Handshake 와 TLS Handshake 까지 완료되면 브라우저는 HTTP 요청을 보내게 된다. 요청에는 쿠기, 캐시, 인증 정보등이 헤더에 포함되어 전송된다.
6. 서버는 요청을 처리하고 HTTP Response 생성한다.
Google 서버는 요청을 분석하고, 검색 엔진과 데이터베이스에서 필요한 정보들을 가져온다. 이후, HTML, CSS, JS, 이미지 등 웹 페이지에 필요한 구성 요소들을 준비한다.
7. 서버가 생성한 HTTP Response를 전송한다.
Google 서버는 준비된 HTML 페이지를 HTTP 응답으로 브라우저에 전송한다.
8. 브라우저는 HTML 컨텐츠를 보여준다.
브라우저는 전송 받은 HTML, CSS, JS 등을 해석하여 화면에 렌더링 함으로써 Google 페이지가 화면에 표시된다.