사용자는 원하는 정보를 검색해서 요청을 보낼 수 있다.
그런데 URL에 'SSAFY'를 검색한다고 이 정보가 짠! 하고 나타나는 것은 아니다. 이 검색의 정보를 얻기까지 웹에서는 사용자의 요청을 받고 검색해서 그 정보를 사용자에게 돌려준다. 지금부터 이 과정에 대해 알아보고자 한다.
1. URL을 IP주소로 변환
WWW.SSAFY.COM 이라는 도메인 이름으로는 컴퓨터끼리 통신이 불가능하다. 인터넷상에서 컴퓨터가 읽을 수 있는 IP주소로 변환해야 서로 통신이 가능하다.
먼저 브라우저 캐시에 해당 URL이 존재하는지 우선 확인하고 존재한다면 그 정보를 불러온다.(대역폭 절약)
존재하지 않는다면 도메인 주소를 IP주소로 변환해 주는 DNS(Domain Name System) 서버에 요청하여 해당 URL의 IP주소를 반환받는다.
DNS는 브라우저가 인터넷에서 서버를 찾는 데 도움이 된다.(휴대폰의 연락처 앱과 같은 역할)
- 가장 먼저 브라우저 캐시를 확인. 브라우저는 일정기간 동안의 DNS 기록들을 저장하고 있다. DNS query가 이곳에서 가장 먼저 실행이 된다.
- 그다음에 브라우저는 OS캐시를 확인한다. 브라우저 캐시에 IP주소가 발견되지 않았다면, 브라우저는 systemcall을 통해서 OS가 저장하고 있는 DNS 기록들의 캐시에 접근한다.
- 그다음에는 local router(공유기) 캐시를 확인한다. OS에서 DNS 기록을 찾지 못하면 브라우저는 DNS 기록을 캐싱하고 있는 router와 통신을 해서 찾으려고 한다.
- 그래도 못 찾는다면 마지막으로 ISP(인터넷 서비스 제공 업체)에 내가 검색하는 URL의 DNS query(DNS 서버에 보내는 요청인데, UDP or TCP 프로토콜을 사용한다)를 날린다.
DNS query를 받으면 ISP의 DNS서버가 해당 IP주소를 찾기 위해 작동하는데, 보통 ISP는 자체적인 DNS서버가 있다. 이 서버로 클라이언트가 요청한 도메인 이름에 대한 IP주소를 찾는데, DNS서버는 트리 구조를 이용해서 도메인 이름의 계층을 따라가며 IP주소를 찾아 반환한다.
이 과정에서 클라이언트가 요청한 도메인 이름을 DNS서버가 찾아내기 위해 다른 DNS 서버와 통신하면서 정보를 검색하는데, 이를 DNS 레졸버(resolver)가 수행한다. 만약에 ISP의 DNS서버에서 요청한 도메인의 주소를 찾지 못하면 다른 DNS 서버로 쿼리를 전달해서 찾는다.
2. Browser가 서버와 Connection을 한다.
브라우저가 올바른 IP주소를 받게 되면 서버와 connection을 빌드하게 된다. 브라우저는 인터넷 프로토콜을 사용해서 서버와 연결이 된다. 인터넷 프로토콜에는 여러 종류가 있지만, 웹 사이트의 HTTP 요청의 경우에는 TCP를 사용한다.
클라이언트와 서버간 데이터 패킷들이 오가려면 TCP connection이 되어야 한다. TCP/IP three-way handshake라는 프로세스를 통해 서버와 클라이언트가 connection이 된다. 단어 그대로 클라이언트와 서버가 SYN(synchronize sequence numbers)과 ACK(acknowledgment)메세지들을 가지고 3번의 프로세스를 거친 후 연결이 된다.
TCP/IP three-way handshake는 다음에 따로 다루기로 하겠다.
이 과정이 끝나면 TCP connection이 완성된다.
3. Browser가 웹 서버에 HTTP 요청을 한다.
TCP로 연결이 되었다면, 데이터를 전송하면 된다.
클라이언트의 브라우저는 GET요청을 통해 서버에게 www.ssafy.com 웹페이지를 요구한다. 이 과정에서 비밀 자료를 포함하던지, form을 사용해 POST 요청을 날릴 수도 있다.
이 요청을 할 때 다른 부가적인 정보들도 함께 전달이 된다.
- browser identification(User-Agent 헤더)
- 받아들일 요청의 종류(Accept 헤더)
- 추가거인 요청을 위해 TCP connection을 유지를 요청하는 connection 헤더
- 브라우저에서 얻은 쿠키 정보
- 기타 등등
4. 서버가 요청을 처리하고 response를 생성한다.
서버는 웹서버를 가지고 있다. 이들은 브라우저로부터 요청을 받고 request handler한테 요청을 전달해서 요청을 읽고 response를 생선 하게 된다. Request handler란 ASP.NET, PHP, Ruby 등으로 작성된 프로그램을 의미한다. 이 request handler는 요청과 요청의 헤더, 쿠키를 읽어서 요청이 무엇인지 파악하고 필요하다면 서버에 정보를 업데이트한다. 그다음에 response를 특정한 포맷(JSON, XML, HTML)으로 작성한다.
5. 서버가 HTTP response를 보낸다.
서버의 response에는 요청한 웹페이지, status code, compression type, 어떻게 인코딩 되어 있는지, 어떻게 페이지를 캐싱할지, 설정할 쿠키가 있다면 쿠키, 개인정보 등이 포함된다.
response의 첫 줄은 statud code를 나타낸다. 현재 상태를 의미하며 총 5가지가 있다.
- 1xx은 정보만 담긴 메세지라는 것을 의미한다
- 2xx response가 성공적이라는 것을 의미한다
- 3xx 클라이언트를 다른 URL로 리다이렉트함을 의미한다
- 4xx 클라이언트 측에서 에러가 발생했음을 의미한다
- 5xx 서버 측에서 에러가 발생했음읠 의미한다
6. Browser가 HTML content를 보여준다.
브라우저는 HTML content를 단계적으로 보여준다. 처음에는 HTML의 스켈레톤을 렌더링 한다. 그다음에는 HTML tag들을 체크하고 추가적으로 필요한 웹페이지 요소(이미지, css, 자바스크립트)들을 GET으로 요청한다. 이 정적인 파일들은 브라우저에 의해 캐싱이 돼서 나중에 해당 페이지를 방문할 때 다시 서버로부터 불러오지 않아도 된다. 그다음에는 우리가 원했던 www.ssafy.com의 모습이 보이게 된다.
https://oizys.tistory.com/36 - 참고자료
'CS지식' 카테고리의 다른 글
SOLID 원칙 (0) | 2023.05.07 |
---|---|
클린코드의 개념 (0) | 2023.05.02 |
GET방식 POST방식 특징 (0) | 2023.04.18 |
MVC 패턴 (0) | 2023.04.13 |