서버는 일반적으로 클라이언트에게 네트워크를 통해 서비스를 제공하는 시스템을 말하는데, 여기서 클라이언트는 서비스를 사용하는 사용자 혹은 사용자의 단말기를 가리킨다. 자세히는, 서버는 웹페이지, 사이트, 또는 앱 등을 저장하는 컴퓨터이다. 클라이언트의 장비가 웹페이지에 접근하기를 원할 때, 서버로부터 클라이언트의 장치로 웹페이지의 사본이 다운로드 된다. 클라이언트는 웹 사용자의 인터넷이 연결된 장치들과 이런 장치들에서 웹에 접근할 수 있도록 하는 소프트웨어(크롬, 파이어폭스 등)이다.
서버와 클라이언트가 통신을 하는데(클라이언트가 서버에 원하는 것을 요청하면 서버가 그에 대한 응답을 하는 데) 필요한 것들이 있다.
● 인터넷 연결 : 웹에서 데이터를 보내고 받을 수 있게 해준다. ● TCP/IP : Transmission Control Protocol (전송 제어 규약)과 Internet Protocol (인터넷 규약)은 데이터가 어떻게 웹을 건너 여행해야 하는지 정의하는 통신 규약이다. ● DNS : Domain Name System Servers (도메인 이름 시스템 서버)는 웹사이트를 위한 주소록과 같다. 브라우저에 웹 주소를 입력할 때, 브라우저는 그 웹사이트를 검색하기 전에 DNS를 살펴본다.브라우저는 HTTP 메시지를 올바른 장소로 전송하기 위해 그 웹사이트가 있는 서버가 어떤 것인지 찾아야 한다. ● HTTP : Hypertext Transfer Protocol (하이퍼텍스트 전송 규약)은 클라이언트와 서버가 서로 통신할 수 있게 하기 위한 언어를 정의하는 어플리케이션 규약이다.
브라우저에 웹 주소를 입력할 때, 아래와 같은 과정을 거쳐 서버와 클라이언트간의 통신이 일어난다.
1. 브라우저는 DNS 서버로 가서 웹사이트가 있는 서버의 진짜 주소를 찾는다.
2. 브라우저는 HTTP 요청 메시지를 서버로 전송한다. 이 메시지, 그리고 클라이언트와 서버 사이에 보내진 다른 데이터들은 TCP/IP를 사용한 인터넷 연결을 건너 보내진다.
3. 제공된 서버는 클라이언트의 요청을 승인하고, 서버는 웹사이트를 볼 수 있다는 의미를 가진 ‘200 OK’라는 메시지를 클라이언트에게 보낸다. 그리고 웹사이트의 파일들을 브라우저에게 보낸다.
4. 브라우저는 이 파일들을 받아 웹사이트를 만들어 사용자에게 보여준다.
(2) DNS란?
실제 웹 주소는 우리가 사용하는 URL 처럼 이름을 가지고 있지 않고, 숫자들로 이루어져있다. (예: 173.194.121.320) 이것은 IP 주소라고 하고, 웹의 하나뿐인 특정 위치를 나타낸다. 하지만 이 숫자들을 기억하기 쉽지 않고, 이를 해결하기 위해 DNS라는 것이 생겼다. DNS는 사용자가 브라우저에 입력하는 웹 주소(www.google.com 같은)를 웹사이트의 실제 IP주소에 맞춰주는 특별한 서버이다. 아래 그림처럼, 실제로 특정 웹 사이트에 접속할 때, url 이 아닌 웹사이트의 실제 주소를 입력해도 접속이 가능하다.
2. HTTP 통신
(1) HTTP 에 대하여
HTTP는 인터넷상에서 데이터를 주고 받기 위한 서버-클라이언트 모델을 따르는 프로토콜이다. 어플리케이션 레벨의 프로토콜로 TCP/IP 위에서 작동한다. HTTP 는 어떤 종류의 데이터든지 전송할 수 있도록 설계되어 있는데, 인터넷 상에서 흔히 볼 수 있는 HTML로 작성된 문서외에도 이미지, 동영상, 오디오 등이 있다.
(2) 작동방식
HTTP는 서버-클라이언트 모델을 따른다. 클라이언트에서 서버에 요청(request)를 보내면 서버는 그 요청을 처리해서 응답(response)한다. 웹서버는 보통 80 번 포트로 서비스한다. HTTP는 Connectless 방식으로 작동한다. 서버에 연결하고, 요청해서 응답을 받으면 연결을 끊어버린다. 기본적으로는 자원 하나에 대해서 하나의 연결을 만드는데 이런 작동방식은 아래와 같은 장점과 단점을 가진다.
● 장점 : 불특정 다수를 대상으로 하는 서비스에 적합한 방식이다. 수십만명이 웹 서비스를 사용하더라도 접속유지는 최소한으로 할 수 있기 때문에, 더 많은 유저의 요청을 처리할 수 있다.
● 단점 : 연결을 끊어버리기 때문에, 클라이언트의 이전 상태를 알 수가 없다. 이러한 HTTP의 특징을 stateless 라고 하는데, connectless 로 부터 파생되는 특징이라고 할 수 있다. 클라이언트의 이전 상태 정보를 알 수 없게 되면, 웹 서비스를 하는데 당장에 문제가 생긴다. 예를 들어 클라이언트가 과거에 로그인을 성공하더라도 로그 정보를 유지할 수 없다. HTTP는 이를 해결하기 위해 cookie를 이용하고 있다.
(3) HTTP request
클라이언트가 서버에 어떤 것을 요청(request)하면 서버는 그 요청에 응답(response)한다. 이 때, 서버와 클라이언트는 HTTP라는 프로토콜을 사용해 서로에게 요청과 응답을 전달한다. 그리고 당연히 클라이언트의 요청에는 다양한 종류가 있으며, 이를 메서드(method)라 부르기도 한다. 다음은 요청에 사용할 수 있는 메서드들이다.
● GET : 정보를 요청하기 위해 사용한다. URL(URI)형식으로 웹서버측의 리소스(데이터)를 요청한다. ● HEAD : 메시지의 헤더 정보만 요청한다. GET 과 비슷하나, 실제 문서를 요청하는 것이 아니라, 문서의 정보를 요청한다. 따라서 응답 메시지에 본문(Body)이 없이, 헤더만을 보내게 된다. 해당 자원이 존재하는지 혹은 서버에 문제가 없는지를 확인하기 위해 사용한다. ● POST : 정보를 보내기 위해 사용한다. 클라이언트에서 서버로 어떤 정보를 제출하고자 할 때, 요청 데이터를 HTTP의 바디에 담아서 전송한다. 만약 새롭게 작성된 리소스라면 서버측은 HTTP 헤더 항목 중 ‘Location:’에 URI 주소 정보를 포함시켜 응답한다. ● PUT : 정보를 갱신하기 위해 사용한다. POST 처럼 정보를 서버로 제출하는 것으로 형식은 동일하나, 갱신 위주이므로 응답메시지의 HTTP 헤더 항목 중 ‘Location’을 보내지 않아도 된다. ● DELETE : 정보를 삭제하기 위해 사용한다. ● OPTIONS : 웹서버가 제공하는 메서드의 종류를 요청한다. 응답메시지의 HTTP 헤더에서 ‘Allow : GET, POST, HEAD’ 처럼 보내진다. ● TRACE : 요청 리소스가 수신되는 경로를 보여준다.
한편, 보안상의 이유로 GET, POST 2 개 혹은 OPTIONS 포함 3개만을 허용하는 웹서버가 대부분이다.