이틀 전 면접에서 받은 질문이다. "웹 서버와 WAS의 차이에 대해서 설명해주세요"
... ㅠㅠ
아는 줄 알았는데 횡설수설 하다가 그냥 넘어갔다. 다음을 위해 정리해야겠다.
웹 서비스의 전체적인 흐름을 먼저 살펴보자.
출처 : https://coding-factory.tistory.com/741
웹 개발을 하면 백엔드 에서는 다음과 같은 구조로 시스템을 구성하게 된다.
웹 브라우저에서 Web Server
로 HTTP Request를 보내고, 정적 데이터를 요청하는 경우에는 Web Server에서 곧 바로 응답을 한다. 하지만 동적 데이터를 요청하는 경우에는 Web Server가 아닌 Web Application Server WAS
에 요청에 대한 처리를 위임한다. Web Application Server
는 Web Server에서 받은 요청을 컨테이너가 응답하여 동적 콘텐츠를 삽입할 수 있는 프로그래밍 언어인 Java를 사용할 수 있게끔 JSP/Servlet을 실행한 뒤, DB에서 값을 가져오는 등의 동적인 값을 확정하고 컨테이너는 그 요청 결과를 HTML 문서로 재 정의하여 다시 Web Server로 넘긴 후 그것을 웹 브라우저에서 다시 응답한다.
먼저, 정적 페이지와 동적 페이지를 먼저 알아보자
정적 웹 페이지는 항상 동일한 페이지(데이터)를 응답을 보내준다.
Web Server
는 파일 경로 이름을 받아 경로와 일치하는 file contents(image, html, css, JS file 등)를 반환하는데, 항상 동일한 페이지를 반환한다.
블로그 문서나, about 페이지와 같이 정적인 데이터를 보여주는 것이 정적 웹 페이지의 예시가 된다. 정적 웹 페이지는 사용자가 요청을 보내면 서버는 미리 저장된 웹 페이지를 보내기만 하면 되며, 사용자는 서버에 저장된 HTML, CSS, JS 등의 파일의 변경되지 않는다면 항상 같은 웹 페이지를 마주하게 된다.
동적 웹 페이지는 브라우저에게 요청을 받은 이후 서버가 추가 작업을 거친 이후 클라이언트에게 응답한다.
클라이언트가 요청할 때 마다 서버가 작업을 하기 때문에, 항상 같은 페이지를 보여주진 않는다.
브라우저를 켜 네이버 페이지를 한번 보자.
눈에 한번 담고, 새로고침하여 페이지를 다시 한번 로드해보자.
잘 보면 몇 가지 달라진 점이 있다. 회원 정보 상단에 날씨 정보가 바뀌었고, 그 아래 Adobe 광고가 바뀌었다.
동적 웹 페이지란 이런 것을 말한다. 정적 웹 페이지에서 주로 사용하는 HTML 만으로는 동적인 구현이 불가능하므로, 프로그래밍 언어를 통해 동적인 데이터를 HTML 문서와 함께 웹 브라우저에 돌려주는 것이다.
Web Server
의 개념은 하드웨어와 소프트웨어로 나누어 생각할 수 있다.
하드웨어의 관점에서는 Web Server가 설치되어 있는 컴퓨터를 말하고,
소프트웨어의 관점에서는 클라이언트가 서버에 HTTP 요청을 하면 정적인 컨텐츠(.html, .jpeg, .css 등)을 제공하는 미들웨어 프로그램
이라고 할 수 있다.
HTTP 프로토콜을 기반으로 클라이언트(웹 브라우저 또는 웹 크롤러)의 요청을 서비스하는 기능을 담당한다.
클라이언트의 요청에 따라 조금 더 세부적인 기능으로 나눌 수 있다.
대표적인 Web Server로 Apache, WebtoB, NginX, IIS(Windows 전용 Web 서버) 등 이 있다.
DB 조회나 다양한 로직 처리를 요구하는 동적 컨텐츠를 제공하기 위해 만들어진 Application Server 미들웨어이다.
HTTP를 통해 컴퓨터나 장치에서 애플리케이션을 수행한다. DB 조회가 필요하거나, 사용자의 입력을 받아 서버에서 가변적으로 로직을 수행하는 등, 동적인 처리가 필요한 동적인 요청을 처리하기 위해 만들어졌다.
Web Container 웹 컨테이너
, 또는 Servlet Container 서블릿 컨테이너
라고 불리는데, 이 때 컨테이너란 JSP, Servlet을 실행시킬 수 있는 소프트웨어를 말한다.
WAS는 JSP, Servlet 구동 환경을 제공하며, 프로그래밍 언어로 작성한 뒤 HTML 문서로 만들고 Web Server로 전달한다.
그림에서 볼 수 있듯이, WAS는 웹 서버와 웹 컨테이너를 포함하고 있다.
대표적인 WAS로 Tomcat, Jeus, JBoss, Netty 등이 있다.
WAS는 동적인 컨텐츠만 처리하도록 설계된 것이 아니라, 정적인 컨텐츠도 함께 처리할 수 있게 설계되었다. 때문에 WAS 하나만 사용하여 웹 서비스를 제공하는 것도 가능하다. 트래픽이 적다면 WAS 하나만 사용하여 서비스하는 것이 복잡하지 않아 유지 보수하기도 좋다. 하지만 WAS는 DB 조회나 프로그래밍 로직 처리로 인해 많은 트래픽을 처리량에 있어 약점을 보인다. 트래픽이 많아진다면 WAS앞에 Web Server를 하나 더 두어 정적인 요청은 Web Server가 처리하도록 하여 트래픽을 분산시키는 것이 좋다.
보안적인 측면도 고려할 수 있다. 물리적으로 분리함으로써 보안을 강화할 수 있고, 특히 SSL에 대한 암복호화 처리에 Web Server를 사용한다.
Web Server를 통해 여러 대의 WAS를 연결하여 로드 밸런싱 Load Balancing
를 할 수도 있다. 이로 인해 fail over, fail back 처리에 유리하다. 특히 여러 대의 서버를 사용하는 대용량 웹 애플리케이션의 경우 Web Server와 WAS를 분리하여 무중단 운영을 위한 장애 극복에 쉽게 대응할 수 있다.
또한 다양한 웹 애플리케이션 서비스를 제공할 수 있다. 언어, 프레임워크 기술에 있어서 Java Application이나 PHP, Python 등을 Web Server 와 연결하여 하나의 서비스로 제공할 수 있다.
이 모든 이유가 자원 이용의 효율성
이라는 하나의 맥락으로 통한다. 또한 장애 극복, 배포 및 유지 보수의 편의성 또한 Web Server와 WAS 분리의 이유가 되겠다.
https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
https://gyoogle.dev/blog/web-knowledge/Web%20Server%EC%99%80%20WAS%EC%9D%98%20%EC%B0%A8%EC%9D%B4.html
https://codechasseur.tistory.com/25
https://coding-factory.tistory.com/741
https://velog.io/@gillog/Web-Server%EC%99%80-Web-Application-Server%EC%9D%98-%EC%B0%A8%EC%9D%B4
https://www.youtube.com/watch?v=NyhbNtOq0Bc
https://www.youtube.com/watch?v=70bzGTx-BHo