1. 웹 서버와 WAS( Web Application Server )

  • 웹 서버는 정적인 컨텐츠( html, css, js )를 제공하는 서버입니다.
    • ex) Apache, Nginx 
  • WAS는 DB 조회나, 어떤 로직을 처리해야 하는 동적인 컨텐츠를 제공하는 서버입니다.
    • ex) Tomcat, Jeus

즉, 웹 서버와 WAS의 차이는 어떤 타입의 컨텐츠를 제공하느냐의 차이입니다.

웹 서버와 WAS는 각각 독립적으로 존재할 수 있습니다.

대부분의 WAS는 정적인 컨텐츠를 제공해주고 있기 때문에, 웹 서버 없이 WAS만 존재할 수 있습니다.

그래서 WAS는 웹 서버를 포함하는 개념이라고 생각해도 될 것 같습니다.


WAS 자체로 웹 서버의 역할을 수행하기 때문에 무조건적으로 웹 서버를 앞단에 두어야 할 이유는 없습니다.

그런데 일반적으로 웹 서버를 WAS 앞 단에 배치하게 되는데, WAS만 사용하면 될 것이지 왜 웹 서버를 앞단에 배치하는 구조를 사용할까요?





2. 웹 서버 사용 이유

1) WAS가 해야 할 일의 부담을 줄이기 위해서 입니다.

WAS 앞에 웹 서버를 둬서 웹 서버에서는 정적인 문서만 처리하도록 하고, WAS는 애플리케이션의 로직만 수행하도록 기능을 분배하여 서버의 부담을 줄이기 위한 것입니다.



위의 그림처럼 WAS앞에 웹 서버를 둠으로써 서버의 부담을 줄일 수 있습니다.

웹 서버에서는 플러그인 형태로 WAS를 연결하면 일 처리를 나눌 수 있겠죠.



2) WAS의 환경설정 파일을 외부에 노출시키지 않도록 하기 위해서입니다.

클라이언트와 연결하는 포트가 직접 WAS에 연결이 되어 있다면 중요한 설정 파일들이 노출될 수 있기 때문에 WAS 설정 파일을 외부에 노출시키지 않도록 하기 위해서 웹 서버를 앞단에 배치시킵니다.

웹 서버와 WAS에 접근하는 포트가 다르기 때문에, WAS에 들어오는 포트에는 방화벽을 쳐서 보안을 강화할 수도 있습니다.





3. 아파치( Apache )와 CGI, 그리고 톰캣( Tomcat )

자바 웹 애플리케이션을 개발 할 때 주로 사용하는 조합이 아파치와 톰캣일 것입니다.

그러면 다른 언어들은 톰캣 같은 WAS가 없을까요?


아파치에는 CGI( Common Gateway Interface )라는 것을 제공합니다.

CGI는 이름 그대로 인터페이스로서, 웹 서버 상에서 프로그램을 동작시키기 위한 방법을 정의한 프로그램( 또는 스크립트 )입니다.

즉 PHP, Perl, Python 등의 언어들은 CGI를 구현해놓았기 때문에, 아파치에서 다양한 언어로 짜여진 각 프로그램을 실행할 수 있습니다.


예를 들어 아파치에 PHP 모듈을 설치했을 경우, 요청이 왔을 때 아파치는 HTTTP 헤더를 분석하고 파싱하여 PHP로 파라미터를 넘겨줍니다.

그러면 PHP에서는 파라미터를 받아 응답 할 HTML 문서를 만들어서 아파치에 전달하죠.

HTML 문서를 전달 받은 아파치는 CSS, JS, img 등 정적인 자원들과 함께 브라우저로 반환합니다.



그런데 자바는 CGI로 구현되어 있지 않습니다.

자바 자체가 무겁고, Common 라이브러리와 JEE라는 플랫폼이 존재하기 때문에 아파치에서 굳이 CGI를 제공하지 않은 것 같습니다.

그렇기 때문에 톰캣은 Default Servlet을 통해 정적인 파일을 제공해주기 때문에 웹 서버의 역할을 할 수 있는 것입니다.

( 그럼에도 웹 서버를 두는 이유는 앞서 언급을 했습니다. )




이상으로 웹 서버와 WAS의 차이점에 대해 알아보았습니다.


댓글 펼치기 👇
  1. Favicon of http://blog.naver.com/loveelf1 loveelf1 2019.12.17 22:36

    정리 잘 보았습니다. 내용 개인 블로그에 퍼가도 될까요?!

  2. YOOSANGOH 2020.03.16 01:19

    잘봤습니다!
    Webserver / web application server 개념이 안잡힌 상태에서
    jsp는 톰캣이라는 was에서 처리하는데 그럼 php를 처리하는 was의 명칭은 뭐지? 라며 계속 검색했는데
    php는 cgi로 apache 모듈에서 처리하는거 같군요??

  3. Favicon of https://redcoder.tistory.com RoJae 2020.04.13 22:58 신고

    헷갈리는 부분을 명확하게 집어주셨네요.
    정리 잘 보았어요. 감사합니다.
    참고하여 저도 블로그에 글을 남겨야겠어요~
    (링크 추가해서 말이죠~)

  4. ㅇㅇ 2020.06.25 16:45

    감사용

  5. Jg 2020.11.25 00:42

    이게 참 헷갈립니다ㅎ
    현직에 있으신분들도 제대로모르는경우가 허다합니다ㅎ

    Spring, Flask ,django 등등 프레임워크에대한 것보단 설명해주신 web, was,cgi 갠
    Apache같은 것들을 왜 써야하는지에 대한 것들등등 을 이해하는게 중요합니다