클라이언트는 앱, 브라우저와 같이 유저와 접점이 되는 것을 말한다.
커피가게로 비유하면 '손님'이 '클라이언트'가 될 수 있겠다.
클라이언트는 원하는 업무를 수행하기 위해 '사장'인 '서버'에게 리소스를 요청하고
'서버'는 '클라이언트'에게 리소스를 응답한다.
이처럼 클라이언트와 서버로 리소스를 요청, 응답 주체를 분리시킨 것을 2-Tier 아키텍처(클라이언트-서버 아키텍처)라고 부른다.
보통은 서버 뒤에 리소스를 저장하는 데이터베이스가 존재하기에 이를 포함하여 3-Tier아키텍처라고 부른다.
프로토콜은 클라이언트와 서버가 통신을 주고받기 위한 규약, 즉 약속이다.
웹 애플리케이션 아키텍처에서는 클라이언트와 서버가 HTTP라는 프로토콜을 이용하여 대화를 한다.
프로토콜은 'OSI 7 Layer 계층' 중 4. 전송 계층, 7. 응용 계층에 해당되며 자주 보는 HTTP, HTTPS 외에도 파일을 전송하기 위한 FTP, 메일을 전송하기 위한 SMTP 프로토콜 등이 있다.
API는 메뉴판과 비슷한 역할을 한다. 서버와 통신하기 위해 클라이언트는 서버의 복잡한 계산을 전달할 필요없이 API로 쉽고 간편하게 전달할 수 있다.
URL 구성은 scheme~url-path까지를 포함하며, URI는 여기에 더해 query, bookmark를 포함하여 URL의 상위개념이라고 할 수 있다.
[file://127.0.0.1/Users/username/Desktop/](file://127.0.0.1/Users/username/Desktop/)
해당 URL은 user의 디렉토리로 접속할 수 있다.localhost
, 127.0.0.1
: 현재 사용 중인 로컬 PC를 지칭합니다.0.0.0.0
, 255.255.255.255
: broadcast address, 로컬 네트워크에 접속된 모든 장치와 소통하는 주소입니다. 서버에서 접근 가능 IP 주소를 broadcast address 로 지정하면, 모든 기기에서 서버에 접근할 수 있습니다포트는 해당 서버에 접속할 수 있는 통로이며, 0~65,535까지 사용할 수 있다. 0~1024번까지의 포트번호는 주요 통신을 위한 규약에 따라 이미 정해져있다.
well-known port는 URL에 자동으로 감춰지지만, 그 외 잘 알려지지 않은 임시포트는 반드시 URL에 포함시켜야한다.
DNS는 호스트의 도메인 이름을 IP주소로 변환시키거나 반대의 경울르 수행할 수 있도록 개발된 데이터베이스 시스템이다. 우리는 url창에 www.naver.com를 치지만 이것이 DNS를 통해 223.130.195.95라는 IP로 변환되어 반환된다.
1. 브라우저는 리졸버에게 IP주소를 요청합니다.
리졸버는 요청받은 도메인의 IP 주소를 찾기위해 여러 네임 서버에 반복적인 질의를 하는 이름 서버입니다.
리졸버는 우선 기존에 찾아본 도메인정보가 내용이 담긴 캐시 파일을 살펴봅니다.
해당되는 도메인정보가 있다면 즉시 IP주소를 리턴합니다.
해당되는 도메인 정보를 찾을수 없는 경우 2번을 진행합니다.
2. DNS 리졸버는 IP주소를 얻기 위해 네임 서버들에게 재귀적인 쿼리를 진행합니다.
루트, 탑레벨, 권한있는 도메인 서버에 차례대로 쿼리를 진행하며 IP주소를 알아냅니다.
이때 리졸버는 쿼리수를 줄일 목적으로 기록되지 않은 도메인 네임 서버들의 주소를 저장하기도 합니다.
3. 마지막으로 리졸버는 전달받은 deploy.states.com의 IP주소를 기록하고 브라우저에게 전달합니다.
도메인 네임 서버는 응답을 보내기위해 한개 이상의 존 파일이라는 파일을 가지고 있습니다.
존 파일은 네임과 클래스, TTL, 레코드 타입, 레코드 데이터로 구성된 레코드들로 구성되어 있습니다.
네임 서버들은 이러한 존 파일들을 바탕으로 요청에 해당되는 레코드를 리턴합니다.
리졸버는 이 레코드를 살펴보고 리턴해야할 IP 혹은 다음에 쿼리를 진행할 서버의 주소를 확인합니다.
대표적인 레코드 타입은 다음과 같다.
따라서 슬라이드 하단의 레코드들은 인터넷 네트워크를 사용하며 192.168.0.2 는 deploy 서브도메인의 주소이고 www 서브도메인은 states.com 도메인으로 연결되어 있음을 알 수 있다.
[그림] HTTP Message의 구조
이 중 start line과 HTTP headers를 묶어 요청이나 응답의 헤드(head)라고 하고, payload는 body라고 칭함.
HTTP로 클라이언트와 서버가 통신을 주고 받는 과정에서, HTTP가 클라이언트나 서버의 상태를 확인하지 않는다. 필요에 따라 다른 방법(쿠키-세션, API 등)을 통해 상태를 확인할 수 있다.
AJAX(asynchronous Javascript and XML)은 js가 비동기적으로 작동하는 방식이다. (특정 기술 X)
fetch를 이용해 DOM을 비동기적으로 조작하여 SPA를 실현시킬 수 있는게 가장 큰 특징이다.
과거에는 XHR(XMLHttpRequest)를 통하여 구현하였지만 최근엔 fetch와 JSON을 결합하여 구현한다.
서버에서 웹 페이지 파일을 렌더링하여 보내는 방식이다. 페이지가 이동 될 때마다 서버에서 다시 렌더링하여 브라우저로 응답하여 보내주어 모든 페이지를 reload하는 방식이다.
CSR은 SSR의 반대다. CSR은 클라이언트에서 페이지를 렌더링한다. 브라우저의 요청을 서버로 보내면 서버는 웹 페이지를 렌더링하는 대신, 웹 페이지의 골격이 될 단일 페이지와 JavaScript를 클라이언트에게 보낸다.
클라이언트가 웹 페이지를 받으면, 웹 페이지와 함께 전달된 JavaScript 파일은 브라우저에서 웹 페이지를 완전히 렌더링 된 페이지로 바꾼다.
브라우저가 다른 경로로 이동하면 SSR과 다르게, 서버가 웹 페이지를 다시 보내지 않고 브라우저가 요청한 경로에 따라 페이지를 다시 렌더링한다.
내일 정리!!
Reference
오늘은 페어프로그래밍없이 처음부터 혼자서 챕터에 대한 공부를 진행했던 날이다. 네트워크 통신에 대한 기초적인 지식들인데 생각보다 양이 많아 머릿 속에 다 들어오진 않았다. 그래도 네트워크 전반에 대해 두루두루 보면서 흐름을 조금 알게되었다고 할까? 물론 이것이 네트워크 공부의 끝은 아니기에, 이 기초를 토대로 차근차근 깊이 공부해보고자 한다.
백엔드 개발자가 되기 위해 프론트엔드단과 어떻게 통신하고 어떤 식으로 API를 활용할 지를 공부하고 고민해 볼 미래가 기대된다.