Server는 클라이언트의 요청에 대한 특정한 서비스를 제공하는 역할을 한다. 서버는 절대적으로 존재하는 것이 아니라 어떤 요청에 대해 처리한다면 서버라고 할 수 있다.
반대로 서버는 동시에 클라이언트가 될 수 있다는 말이다.
모든 컴퓨터는 서버가 될 수 있다
간단히, Web에서 Server의 역할을 수행한다.
웹서버는 하드웨어나 소프트웨어, 혹은 두 측면 모두에 대한 작업을 수행한다고 한다.
Hardware side
: 다른 웹서버의 소프트웨어(프로그램)이나 website's component(ex. HTML, docs, image, CSS, Javascript files) 등을 저장하고, 인터넷과 연결되어 물리적인 데이터를 현재 웹서버에 연결된 다른 디바이스에 공유하는 역할을 수행하기도 한다.
Software side
: 호스팅된 파일에 대한 클라이언트(유저)의 접근을 제어하는 여러 부분들을 포함하고 있는데, 대표적인 예로 HTTP Server가 있다. HTTP Server는 URL(혹은 +domain)과 HTTP를 통해 접근할 수 있고, 그 요청에 따라 클라이언트에게 호스팅된 website 컨텐츠들을 제공해주는 역할을 한다.
간단히,
브라우저가 HTTP를 통해
파일A
를 옳바른 Web Server에 요청HTTP Server(software)가 Web Server(hardware)에 저장된
파일A
를 찾아 브라우저에게 돌려준다.(없으면 404)
어떤 웹사이트를 구현하기 위해선 static web server
혹은 dynamic web server
가 필요하다
요청에 따라 웹페이지의 구성이 항상 일정하다.
미리 저장된 파일(HTML, Image, JavaScript)을 그대로 반환해주는 역할을 수행한다.
비용이 저렴하고 속도가 빠르지만, 한정적인 서비스와 관리에 불리하다는 특징이 있다.
그래서 static(고정된, 정적인)
요청에 따라 웹페이지의 구성이 달라 진다. 요청과 데이터들을 가공 및 처리 한 뒤 생성된 웹페이지를 반환한다. 대부분의 웹페이지는 동적(Dynamic) 웹페이지다.
서비스를 다양하게 제공할 수 있지만 Static Web Server에 비해 느리다는 단점이 있다.
추가로, 데이터를 가공하고 처리하기 위한 WAS(Web Application Server)가 필요하다.
앞에서 언급했듯이 동적 데이터 처리를 위해선 WAS
가 필요하다고 했다. 웹서버를 위한 웹서버라고 이해해도 좋을 것 같다.
만일 다음과 같은 요청이 들어왔다고 해보자.
coffee.png
img요청로그인 정보 :
Royce
<img src ="coffee.png">
{"loginMember" : "Royce"}
coffee.png
라는 이미지는 정적 웹서버에 저장하여 요청의 관계없이 반환해줄 수 있다.
하지만, 로그인 정보는 조금 다르다. "Royce"가 아닌 "Noah"라는 이름의 Member
가 접속을 했다면 동적으로 다른 웹사이트를 반환해야 한다.
이러한 경우 DB를 조회하여 Member
별 정보를 적용하거나 요청을 분석하여 옳바른 Member
인지 확인 할 수 있도록 이름을 추출하는 등, 요청에 따라 동적으로 웹페이지를 구성해야 하고, 이러한 과정을 WAS
가 수행한다.
이러한 이유로 동적 웹사이트에서 WAS
가 필요하다고 한다.
사실 WAS 없이 웹서버만, 혹은 웹서버 없이 WAS만으로도 동적 웹사이트를 구현 할 수 있다.
그럼에도 불구하고 WAS와 웹서버를 분리하여 사용하는 이유는 다음과 같다.
일반적으로 Web Server가 WAS에 비해 전방(클라이언트와 가까움)에 비치 한다.
클라이언트 -> 웹서버 -> 웹어플리케이션 -> DB
예시로, 이벤트 페이지를 제공하는 웹사이트와 메인 페이지를 제공하는 웹사이트를 반환해야 한다면, 전방의 웹서버는 여러개의 WAS를 연결하여 역할을 분리 할 수 있다.
전방에 위치한 웹서버는
coffee/event/~
에 대한 요청과
coffee/main/~
에 대한 요청을
WAS1
(for main), WAS2
(for event)로 나누어 처리할 수 있다는 말이다.
DB에 접근하고, 비지니스 로직을 처리할 수 있는 WAS
에서 직접 클라이언트의 요청을 받는 다면 보안적인 부분에서 취약할 수 있다. 기본적인 방화벽이 있지만, 웹서버라는 Layer가 추가적으로 존재한다면, 클라이언트의 직접적인 접근을 방지할 수 있고, WAS
의 정보를 노출시키지 않을 수 있다.
WAS
를 여러대 연결할 수 있다 보니 여러 웹 컨테이너(php, java, flask, ...)를 활용하여 특정한 요청에 강한 서비스를 선택적으로 사용하여 효율적인 요청 처리가 가능하다.