Web Server란?
웹 서버는 1. 하드웨어 웹 서버, 2. 소프트웨어 웹 서버로 분류됩니다. 하드웨어 웹 서버의 경우는 웹 서버가 설치되어 있는 컴퓨터를 의미하며 소프트웨어 웹 서버의 경우 클라이언트로부터 HTTP 요청을 받아 정적 컨텐츠(html, css, png 등)를 제공하는 프로그램을 의미합니다. 그리고 대표적인 소프트웨어 웹서버로는 Apache, Nginx가 있습니다.
웹 서버는 정적 컨텐츠를 전달한다고 했는데요, 이처럼 웹 서버의 주된 목적은 웹 페이지, 이미지 파일 등을 클라이언트로 전달하는 것입니다. 그렇다면 동적 컨텐츠에 대한 HTTP 요청이 들어왔을 때의 처리는 누가 해주는걸까요? 바로 WAS입니다.
WAS(Web Applicaition Server)
WAS는 DB 조회나 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어진 프로그램입니다. 가장 대표적인 WAS의 예시로는 Tomcat이 있는데요, Spring에서 DispatcherServlet을 서블릿으로 등록해 동작시키는 친구가 바로 Tomcat입니다.
WAS는 대부분 웹 서버 + 웹 컨테이너가 합쳐진 형태입니다. 따라서 WAS 하나만으로도 HTTP 요청을 받는 것이 가능합니다. 스프링 부트에서 Application을 실행시키면 별도의 웹 서버 없이 WAS만 작동하는데 이 상태로 배포까지 해도 문제가 되지 않습니다.
웹 서버와 함께 사용되는 경우, 인자에 따라 페이지가 바뀐다거나, 어떤 자원의 상태에 대한 조작을 하고 싶을 때 WAS까지 요청이 도달합니다. 즉, 1차적으로 웹서버에서 정적 페이지 요청을 필터링하고, 만약 정적 페이지 요청이 아닌 동적 페이지 요청이라면 WAS로 요청이 토스되는 것입니다.
그런데, WAS가 웹서버의 기능까지 제공해줄 수 있다면 왜 굳이 웹서버가 필요한걸까요?
웹 서버, WAS가 같이 사용되는 이유
웹 서버와 WAS가 같이 사용되었을 때 효과가 크기 때문입니다. 그러면 어떤 효과를 누릴 수 있는지 알아보죠.
책임 분배를 통한 서버 부하 방지
정적 페이지를 웹 서버가 제공해주고 동적 페이지를 WAS가 제공해주면 책임 분배에 따른 성능 이점을 누릴 수 있습니다. 만약 WAS가 동적 페이지, 정적 페이지 제공을 모두 수행한다면 지연 시간이 길어질 것이며 페이지 노출 시간이 길어지게 됩니다.
여러 대의 WAS 연결 가능
하나의 웹 서버에 여러 대의 WAS가 연결될 수 있습니다. 그리고 이런 경우, 웹서버가 로드밸런싱의 역할까지 담당할 수 있습니다. 또한 WAS에 대한 헬스체킹 기능까지 수행해서 어떤 서버가 요청에 대한 불능 상태인지를 쉽게 파악할 수 있습니다. 무중단 서버 운영을 위한 장애 극복에도 쉽게 대응할 수 있게 됩니다.
보안 관련
웹서버를 따로 두게되면 보안상 이점을 가질 수 있습니다. 실제 서버가 외부에 노출되지 않기 때문입니다. 몇 대의 WAS가 존재하든 상관없이, 사용자는 진입점이 모두 웹서버로 동일해집니다. 그리고 이 요청이 어떻게 분산되어 어느 WAS에 도달하는지는 이제 웹 서버의 책임인거죠.
이런 특성으로 인해 웹서버 + WAS 구조를 사용하면 HTTPS 서버도 쉽게 구축이 가능합니다. SSL 인증서를 받은 뒤, 단순히 리버스 프록시 기능을 활용해 요청을 WAS로 전달할 수 있습니다. 즉, 클라이언트 입장에서는 HTTPS 프로토콜을 사용해 WAS에 접근하는 것처럼 보이지만, 실제로는 HTTPS 연결은 웹 서버와 이루어지며 내부적으로 HTTP 프로토콜을 통해 WAS에 접근하게 됩니다.
마무리
웹서버와 WAS 개념에 대해 알아보았습니다. 쉽게 말해 웹서버는 정적 페이지 전달, WAS 관리 및 보안의 역할을 합니다. 반면 WAS는 실제 비즈니스 로직 처리, 데이터 처리에 집중합니다.
즉, 웹 서버와 WAS를 사용했을 때 아키텍처를 나타내면 위와 같습니다.
이렇게 책임을 분배함으로서 더욱 유지보수하기 좋은 서비스를 만들 수 있고, 심지어는 보안, 성능 이슈까지 대응할 수 있습니다. 규모가 작은 서비스라면 WAS만으로도 충분히 대응할 수 있겠으나 어느정도 규모가 커지고 안정성이 요구된다면 웹서버 도입을 적극적으로 검토해봐야 한다고 생각합니다.
참고 자료
https://www.youtube.com/watch?v=mcnJcjbfjrs
https://yozm.wishket.com/magazine/detail/1780/
https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
https://codechasseur.tistory.com/25
'우테코 5기' 카테고리의 다른 글
[레벨 2 미션] 지하철 미션 학습 기록(1) (0) | 2023.05.29 |
---|---|
Forward Proxy, Reverse Proxy (0) | 2023.05.29 |
도메인 엔티티 ID 부여에 대한 주관적인 생각 (0) | 2023.05.27 |
HTTPS 개념 및 EC2로 배포한 서버에 적용하기(nginx + cerbot) (3) | 2023.05.25 |
[레벨 2 미션] 웹 장바구니 미션 학습 기록 (2) (0) | 2023.05.20 |