둘을 가르는 질문은 하나다. 상황에 따라 변하는 정보를 제공할 수 있는가. Web Server는 HTML, CSS, 이미지처럼 미리 만들어진 정적 콘텐츠만 준다. WAS는 DB에서 데이터를 꺼내 그때그때 다른 결과를 내는 동적 페이지를 만든다.

정적 콘텐츠만 다루는 Web Server

Web Server는 클라이언트가 주소를 가지고 HTTP로 요청하면 알맞은 내용을 돌려주는 컴퓨터다. 여기서 다룰 수 있는 데이터는 웹에서 처리할 수 있는 정적인 것으로 한정된다. HTML은 프로그래밍 언어가 아니라 DB 조회 결과를 담을 방법이 없기 때문이다. 동적인 데이터를 내려주려면 WAS가 필요해진다.

앞에 웹 서버를 두는 이유

그러면 WAS가 어차피 다 해주는데 왜 앞에 Web Server를 또 두는가. 면접 단골 질문이고 이유가 넷이다.

책임을 나눠 서버 부하를 막는다. 정적 콘텐츠는 Web Server가, 동적 콘텐츠는 WAS가 맡는다. WAS는 DB 조회처럼 페이지를 만드는 데 필요한 여러 로직을 처리하는데, 단순한 정적 콘텐츠까지 맡으면 그 리소스 때문에 다른 작업이 밀린다. 톰캣 5.5 이상은 정적 처리 성능이 크게 떨어지지 않는다고 하니 예전만큼 큰 이유는 아니다.

로드밸런싱을 할 수 있다. 앞단에 Web Server를 두고 뒷단에 WAS를 여러 대 두면 요청을 나눠 뿌린다.

헬스 체크도 웹 서버가 맡는다. 로드밸런싱을 하다 보면 특정 WAS가 제대로 동작하지 않을 수 있어서, 주기적으로 HTTP 요청을 보내 정상 응답이 오는지 확인하고 비정상인 서버에는 요청을 전달하지 않는다. 상태를 확인하는 주기가 Interval로 기본 5초이고, 몇 번 연속 실패해야 비정상으로 볼지가 Fails, 몇 번 연속 성공해야 정상으로 되돌릴지가 Passes다.

마지막이 보안이다. WAS는 DB 관련 로직이나 DB 접근 권한을 가질 수 있어 외부에 노출되면 위험한데, 리버스 프록시를 앞에 두면 실제 서버를 감출 수 있다. 클라이언트는 리버스 프록시를 실제 서버로 여기고 요청하므로 뒤쪽 서버의 IP를 모른다. SSL 암복호화도 Web Server가 맡고, 공격이 중요한 정보를 담은 DB나 로직까지 번지는 것도 앞단에서 막힌다. 리버스 프록시는 이 밖에 캐싱과 로드밸런싱도 함께 맡는다.

WAS와 웹 컨테이너

WAS는 웹 애플리케이션과 서버 환경을 만들어 동작시키는 소프트웨어 프레임워크다. PHP, JSP, ASP 같은 언어로 동적인 페이지를 만들고, 프로그램 실행 환경과 데이터베이스 접속 기능을 제공하며, 비즈니스 로직을 수행한다. 구조로 보면 웹 서버에 웹 컨테이너를 더한 것이다. 웹 컨테이너는 서블릿과 JSP를 실행시킬 수 있는 소프트웨어이자 웹 애플리케이션이 배포되는 공간이고, 자바 계열에서는 웹 애플리케이션 컨테이너라고 부른다.

Web Server로는 Apache, nginx, Microsoft IIS가 있고 WAS로는 Tomcat, Jetty, JBoss, IBM WebSphere, 티맥스 JEUS가 있다.

관련

출처