Server와 Client는 가장 많이 사용되는 용어 중 하나입니다.
해당 용어에 대한 관계를 간단하게 말하자면 아래와 같습니다.
"두 개의 프로그램 간에서
Server는 서비스를 제공(응답)하는 측면,
Client는 해당 서비스를 요청하고 받는 측면"
위의 관계에 따라 Server와 Client는 단일 컴퓨터 내에서도 이루어질 수 있지만, 통신을 이용하여 원격으로 이루어질 경우 큰 의미를 갖습니다. 그래서 보통 웹 상에서 많이 사용되는 개념입니다.
이번 포스팅에서는 사용자가 브라우저를 통해 접속했을 때의 서버, 클라이언트 관계와 과정에 대하여 간략히 다뤄보도록 하겠습니다.
가장 먼저, 사용자는 보통 브라우저(Chrome, Explorer, Safari 등) 소프트웨어를 통해 웹에 접속하곤 합니다. 그리고 URL(Uniform Resource Locator)을 통해 사용자가 원하는 특정 페이지로 이동합니다. 이 짧은 순간에 많은 과정이 포함됩니다.
URL은 우선 HTTP 프로토콜을 사용할 경우 다음과 같이 구성됩니다.
HOST는 서버 프로그램이 위치하는 웹상의 공인 IP(Internet Protocol)주소를 의미합니다. (IP 주소라 하면 보통 IPV4의 경우 xxx.xxx.xxx.xxx의 형태를 떠올리시는 경우가 많습니다. 이는 서버를 구성할 때, 해당 IP에 대하여 도메인 네임 서비스를 신청하여 복잡한 IP주소 대신 도메인 네임을 이용하여 사용하는 것입니다. 덕분에 직관적으로 보이며, 사용자 입장에서 굉장히 편리해집니다!)
PATH는 많은 파일로 구성된 서버 내에서 특정 자원을 요청 혹은 이동을 위한 경로입니다. 그래서 "/file1.html", "/directory2/file2.pdf"와 같이 디렉토리명을 포함하기도 합니다. 이에 따라 URL(Uniform Resource Locator)이라는 용어를 사용하였습니다. 하지만 사실 이 방식은 굉장히 한정적이기에, 예전에 자주 사용되었던 방식입니다. 요즘의 웹서비스는 대부분 URL이 아닌 URI(Uniform Resource Identifier)라는 개념을 사용합니다. (URI는 URL과 URN을 포함하는 개념입니다.)
URI(Uniform Resource Identifier)는 URL을 포함하는 개념으로써, 사용자가 조금 더 직관적으로 사용할 수 있도록 도와줍니다.
예를 들어, https://www.acmicpc.net/problem/1000 라는 URI가 있다고 하면, HOST는 [acmicpc.net], PATH는 [/problem/1000]이 됩니다. "/problem/1000" 은 사용자가 보기에, "HOST의 1000번 문제에 대한 자원"이라고 이해할 수 있습니다.
URI 하나에도 수많은 사람들의 고민이 녹아있습니다. Rewrite, REST 등의 많은 관련 개념이 있으며 이에 대한 내용은 추후 포스팅에서 다루도록 하겠습니다.
브라우저 웹 주소를 입력하였을 때 클라이언트(브라우저 소프트웨어)는 해당 URI로 보통 HTTP 프로토콜에서 GET type(method)으로 서버에 요청합니다. 이 후, 서버는 PATH에 따라 라우팅을 수행합니다. 자세하게는, PATH에 따라 적절한 메소드(컨트롤러, 액션 메소드 등 다양한 용어와 방식이 존재합니다.)를 수행할 수 있게 매칭해줍니다. 이 후, 서버는 PATH에 맞게 적절한 자원을 찾은 후, 필요하다면 데이터베이스와 같은 외부 프로그램이나 View를 구성하기 위한 내부의 다른 메소드들을 수행하는 등 다양한 과정을 통해 최종적으로 클라이언트에게 HTML을 구성하여 응답합니다. (로그인 했을 때, 로그인된 유저에 대한 정보를 데이터베이스에서 불러오고, 유저의 정보에 맞게 유저의 이름이나 기타 정보를 다른 메소드로 이용하여 HTML을 구성하는 것이 예시가 될 수 있습니다.) 이후, 브라우저는 응답받은 HTML을 분석하여 사용자에게 보여주게 됩니다.
물론 포트설정, 로컬 스토리지, 세션 스토리지나 쿠키 등에 설정된 값, 클라이언트의 브라우저 정보 등에 따라 조금 더 세부적인 절차가 이루어질 수 있습니다. 예를들어 [로그인 유지] 라는 체크박스를 이용하여 로그인한 경우가 많으실 겁니다. 이 경우 세션 혹은 쿠키를 이용하여 클라이언트(브라우저)나 서버측면에서 [로그인 유지] 기능을 위한 값들을 설정하고 추후 해당 세션 혹은 쿠키를 이용해 추가적인 로그인을 방지시켜주는 것입니다.
대부분의 사용자가 브라우저를 이용하여 특정 웹페이지에 접속할 때, 서버-클라이언트의 과정은 위와 같았습니다.
서버-클라이언트의 관계와 과정은 개념자체가 광범위하며 개발방식에 따라 그 과정과 용어도 천차만별입니다. 프로토콜(HTTP, SFTP 등)에 따라서도, PATH에 대한 설계에 따라, HTTP method, header, body...에 따라서도 요청과 응답은 복잡하고 방식은 달라질 수 있습니다. (응답에도 단일페이지의 경우 HTML이 아닌 JSON을 사용한 경우가 많고, 클라이언트의 요청에도 http내부에 많은 데이터를 담을 수 있습니다.)
추후 포스팅을 통해 위에 대한 자세한 내용을 하나하나 작성하고자 합니다. 혹시나 잘못된 내용이 있다면 언제든 댓글을 통해 피드백을 부탁드립니다.
'Development > Etc' 카테고리의 다른 글
한국 지도 시각화하기 및 gps 표시 ( D3.js v5를 이용하여) (0) | 2019.02.13 |
---|---|
Python Flask[플라스크] 시작하기 - 1 (0) | 2019.01.20 |
Python Django[장고] 시작하기 - 2 (0) | 2019.01.18 |
Python Django[장고] 시작하기 - 1 (Pycharm, Anaconda를 이용하여) (0) | 2019.01.18 |
싱글톤 패턴(Singleton Pattern) 간단하게 구현하기 (0) | 2019.01.08 |