웹 서버와 웹 애플리케이션 서버의 차이?

웹 서버와 웹 애플리케이션 서버의 차이?

면접 단골 질문에 대해 알아봅시다.


면접에서 단골 질문으로 나오는 주제입니다.

그래서 인터넷에 검색해보면 굉장히 많은 글이 있는 주제이기도 합니다.

하지만 대다수의 글이 제대로 이해했거나 제대로 이해하하려는 노력 없이 사전적인 정의를 복사 붙여넣기한 수준의 글들인 것 같은 느낌이 강하게 들었습니다.

현업에서 일하고 있는 입장에서 잘 와닿지 않는 글들이 대부분이었기 때문입니다.

저도 제가 이 주제를 제대로 이해했는지는 잘 모르겠지만, 그럼에도 불구하고 아마 단순 사전적인 정의를 떠난, 약간 새로운 관점의 글이 되지 않을까 싶습니다.


웹 서버와 웹 애플리케이션 서버의 차이


사전적인 정의만 놓고보면 아주 간단합니다.

웹 서버는 정적 컨텐츠의 처리를 주 목적으로 하며, 웹 애플리케이션 서버는 정적, 동적 컨텐츠를 모두 처리할 수 있다. 입니다.

그럼 웹 애플리케이션 서버만 써도 웹 서버의 역할까지 함께 수행할 수 있는데 왜 굳이 나눴을까요?


이유는 고대의 선배님들이 사용하시던 하드웨어는 옛말로 정말 조선컴수준이었기 때문에, 웹 서버를 따로 사용해 정적 컨텐츠와 동적 컨텐츠를 분리해내면서까지 성능 최적화를 위한 노력을 했기 때문이었습니다.

당시 EJB라는 괴물로 작업하시던 한 개발자분(로드 존슨 형님…)“야~! 이거 도저히 못해먹겠다~!” 해서 탄생한 것이 바로 현재 우리가 많이 사용하는 Spring이죠. (과연 로드 존슨 형님께는 봄이 왔을까요…? 😥)


현재는 무어의 법칙에 따라 하드웨어의 성능이 비약적으로 증가해서 어지간한 애플리케이션은 서버에 부담조차 안가는 수준입니다.

또한 Spring Boot을 정말 많이 사용하고 있고 이에 따라 자연스레 내장 톰캣을 사용하기 때문에 서버를 아주 쉽게 올렸다 내렸다 할 수 있게 됐습니다.

내장 톰캣은 경량 WAS로 나왔기 때문에 기존의 외장 톰캣보다 확실히 가볍습니다.

즉, 하드웨어와 소프트웨어의 발달로 이제는 웹 애플리케이션 서버만 사용하더라도 대부분의 작업을 아주 빠르게 처리해낼 수 있게 됐다는 뜻이죠.


그럼에도 불구하고 웹 서버는 여전히 필수적으로 사용되고 있습니다.

대표적으로 Nginx가 있죠?


제 생각에 현업에서 웹 서버를 사용하는 이유는 크게 두가지가 있는 것 같습니다.

그리고 아주 중요한 역할을 해내고 있다고 생각합니다.


⚖️ 보안


전 세계의 port에 대한 표준을 관리하는 IANA라는 단체가 있습니다.

이 단체에서 Well Known Port 라는 것을 관리하고 있는데요, 쉽게 얘기하면 고정적인 포트를 의미합니다.

ftp=21, ssh=22, http=80, https=443 등 아주 친숙한 프로토콜과 이에 매핑되는 포트들이 있죠.

이런것들을 관리한다고 생각하시면 됩니다.


📜 Service Name and Transport Protocol Port Number Registry


이 Well Known Port들은 생략하고 사용할 수 있는 경우가 많습니다.

왜냐하면 이미 전 세계적인 표준이기 때문에 유닉스 시스템에 이미 이 정보가 입력돼있거든요.

그리고 유닉스 시스템에서 root 권한이 있어야만 사용할 수 있다는 특징을 갖습니다.

우리가 자주 사용하는 톰캣은 기본 포트가 8080이죠?

즉, 우리가 스프링 애플리케이션을 개발해서 기동하면 http://localhost:8080으로 접속할 수 있습니다.


하지만 우리가 구글에 접속 할 경우 https://www.google.com:443 이라고 접속하진 않습니다.

위 URI의 경우 https 프로토콜을 사용하므로 443 포트를 사용 할 것인데, 443은 Well Known Port이므로 생략할 수 있기 때문입니다.

그리고 이러한 포트들을 사용하기 위해서는 애플리케이션을 root 권한으로 실행해야만 합니다.

만약 Well Known Port를 사용하는 애플리케이션인데, root 권한으로 실행하지 않을 경우 권한이 없다는 에러가 발생하며 실행되지 않을 것입니다.


그럼 우리가 개발한 스프링 애플리케이션의 기본포트인 8080을 http의 포트인 80으로 변경하고, root 권한으로 실행해도 되겠네요?

물론 됩니다! 하지만, 이 경우 보안 문제가 생길 수 있습니다.


만약 해커가 80포트로 접속해서 권한을 탈취한다면, 장악당한 애플리케이션에 대해 모든 권한을 갖는것과 다를게 없기 때문입니다.

서버의 데이터를 조작하거나 서버를 다운시켜버리는 등의 행위도 가능해질 것이며, 장악당한 애플리케이션이 돈이 오고가는 중요한 비즈니스를 처리하고 있다거나 하면 문제는 더욱 심각해질수도 있을겁니다.

따라서 WAS(웹 애플리케이션 서버)는 별도의 권한을 주어 8080, 8081 등의 포트들로 실행하고, 웹 서버를 따로 구축하여 웹 서버만 root 권한으로 실행하는 것입니다.


NginxMaster processWorker process로 나뉘며, 일반적으로 Master process를 root 권한으로 실행합니다. Worker process가 실제로 작업을 수행하는 주체이지만, 반대로 탈취당할 경우 보안상의 이슈가 있기 때문에 보통 www-data등의 유저로 설정하고 아예 셸(Shell)에 접근조차 못하게 하는 경우가 많습니다.


이렇게 하면 웹 서버가 해커에게 탈취당하더라도 웹 서버가 자체적으로 수행해내는 중요한 비즈니스가 없기 때문에 상대적으로 보안상 안전해집니다.

그리고 웹 서버는 정적 컨텐츠를 서빙하거나 WAS로 라우팅 해주는 역할들을 함께 수행하게 됩니다.


⚖️ 유지보수 용이성과 고가용성


이 부분이 아주 큰 이유가 아닐까 싶습니다.

특히 B2C서비스를 하는 회사들의 경우 B2B 사업을 하는 회사들에 비해 감당해내야 하는 트래픽이 굉장히 크기 때문에, 서버의 고가용성이 정말 중요합니다.

이러한 문제를 웹 서버를 도입하여 상당부분 해결할 수 있습니다.


웹 서버로 요즘 Nginx를 아주 많이 사용합니다.

웹 서버는 WAS에 비해 경량이고, Nginx의 경우 Event Driven이라는 방식으로 동작하기 때문에, 실시간 처리에 매우 강력한 모습을 보입니다.

이러한 특징으로 인해 Nginx는 사전적인 정의대로의, 정적 컨텐츠를 제공하는 웹 서버의 역할이 아닌 리버스 프록시 로서의 역할을 아주 훌륭하게 수행 해냅니다.

그리고 리버스 프록시라는 일종의 초고성능 라우터를 도입하게 됨으로써 로드 밸런싱, 무중단 배포, 애플리케이션 인스턴스의 스케일아웃 등의 작업이 원활하게 이루어질 수 있게됩니다.

웹 서버를 사전적인 정의대로 단순히 정적 페이지만 제공해주는 서버라고 생각했다면 이 부분들을 정말 이해하기 힘들 수도 있습니다.


결론


사전적인 의미야 물론 중요합니다만, 본질적인 것에 대한 이해가 수반되지 않는다면 큰 의미가 없다고 저는 생각합니다.

많은 면접관분들이 이 주제를 질문하고, 많은 취준생분들이 사전적인 정의를 암기합니다.

하지만 이런 실무와는 동떨어진 사전적인 정의들을 암기한다고 그러한 개념들을 실무에 녹여내고 어떤 가치를 만들어낼 수 있을까요?

과연 웹 서버를 사용해야만 하는 상황이 닥치면 웹 서버를 효율적으로 사용해낼 수 있을까요?

아니, 애초에 웹 서버를 도입해야 한다는 생각 자체를 할 수 있을까요?

위 내용들에 호기심이 생기신 분들은 리버스 프록시, 로드 밸런싱, 무중단 배포, 스케일업, 스케일아웃 등의 키워드로 추가적인 검색을 해보시는것도 추천드립니다 !

글 읽어주셔서 감사드리고, 이만 마치겠습니다. 🙇‍♂️



© 2022. All rights reserved.