🧐TIL

[다시하는 백엔드 기초 공부] 웹서버

웹서버 (Web Server)

웹 개발을 하다보면 클라이언트의 요청을 받아 웹사이트의 콘텐츠를 반환하는 모든 대상을 서버로 통일해서 부르는 경우가 많다. 용어상 틀린 것은 아니지만 때로는 “Spring 서버”, “FastAPI 서버” 처럼 프레임워크를 서버로 부르는 경우가 생기기도 하고 과거와 달리 백엔드 서버와 프론트엔드 서버를 각각 분리하기도 하는 현재, 웹서버의 정의를 다시 정리해본다.

웹서버의 정의

일단 웹서버의 정의를 검색하면 “클라이언트의 요청에 따라 웹사이트의 콘텐츠(텍스트, 이미지, HTML 파일 등)를 저장하고 제공하는 하드웨어 또는 소프트웨어”라고 나온다. 여기에서 “하드웨어 또는 소프트웨어”라는 점에 주목해야하는데, 하드웨어 관점과 소프트웨어 관점에 따라 뜻이 달라지기 때문이다.

소프트웨어 관점에서 웹서버는 사용자에게 필요한 콘텐츠를 제공하는 프로그램으로 요청을 받고 요청 내용에 따라 콘텐츠를 반환하는 일련의 과정을 처리한다.

그런데 하드웨어 관점에서는 앞서 말한 웹서버 프로그램을 포함하여 웹사이트의 컴포넌트 파일들을 물리적으로 저장하고 인터넷에 연결되어 통신을 할 수 있는 기기의 개념으로 확장된다. “온프레미스 서버”나 “클라우드 서버” 같은 개념은 하드웨어 관점에서 서버의 물리적 위치에 따라 나뉜 것이라고 볼 수 있다.

이 포스트에서 계속 설명할 내용들은 소프트웨어 관점에서의 웹서버와 연관된 내용이라고 보면 된다.

웹서버의 역할

(소프트웨어로서) 웹서버는 클라이언트(주로 웹 브라우저)로부터 HTTP 요청을 받아 정적 콘텐츠(Static Content)를 그대로 응답하는 프로그램이다. 즉, 브라우저가 요청한 파일을 “그대로” 돌려주는 역할을 하는 것으로 HTML, CSS, JavaScript 파일 및 이미지, 폰트, 동영상 등을 제공한다.

대표적으로는 Nginx와 Apache가 웹서버로 많이 사용된다.

여기서 주의할 것은 웹서버는 클라이언트의 요청에 따라 내용이 달라지는 동적 콘텐츠의 처리를 하지는 않는다는 것이다. 동적 콘텐츠의 생성은 WAS(Web Application Server)의 역할로 웹서버와 WAS는 서로 다르다.

특징 요약

  • 처리 대상: 정적 파일 (HTML, CSS, JS 등)
  • 실행 방식: 요청 받은 파일을 그대로 응답
  • 속도: 매우 빠름 (I/O 중심, CPU 부담 적음)
  • 예시: Nginx, Apache

웹서버 역할의 확장

그런데, 의문이 하나 든다. 웹사이트에 정적 콘텐츠만 서빙하던 과거와 달리 현재는 동적 콘텐츠의 전달이 중요해지고 웹서비스의 복잡도가 높아지면서 프론트엔드 서버와 백엔드 서버를 분리해서 사용하는 경우가 많다.

먼저 설명한대로 웹서버의 역할이 정적 콘텐츠를 전달하는 것이라면 더 이상 직접 html, css, js 등을 다루지 않는 백엔드 API 구성에 nginx, apache가 포함될 필요가 없다. 그럼에도 웹서버는 반드시 WAS와 함께 사용하는데, 그 이유는 다음과 같다.

게이트웨이로서의 웹서버

게이트웨이는 네트워크나 시스템 설계에서 두 개의 서로 다른 환경을 연결하는 관문 역할을 하는 구성 요소로 통신을 중개하고 프로토콜을 변환해주기도 한다.

현대 백엔드 구조에서 웹서버는 단순히 HTML, CSS, JS 파일을 전달하기보다는 모든 외부 요청이 통과하는 API 게이트웨이 역할을 하며 사용자의 요청이 WAS나 백엔드 애플리케이션에 닿기 전에 보안, 라우팅, 캐싱, 압축 등을 처리하는 레이어로 역할한다.

리버스 프록시 (Reverse Proxy)

‘대리인’을 뜻하는 단어에서 유래한 프록시(Proxy)는 네트워크 통신에서 클라이언트와 서버 사이에 위치하여 중계 역할을 하는 시스템이다. 프록시의 주요 역할은 보안 강화, 웹 트래픽 관리, 개인 정보 보호, 캐싱을 통한 성능 향상 등이 있다.

포워드 프록시(Forward Proxy)는 클라이언트 측에 위치하며 사용자가 인터넷 상에 존재하는 서버들과 연결할 때 이를 대신 연결하여 사용자의 IP 주소를 숨겨 보안을 강화하고 익명성을 제공하는 등의 역할을 한다.

이와 반대되는 리버스 프록시(Reverse Proxy)는 서버 측에 위치하여 외부에서 오는 요청을 처리하는 것으로 서버 내부 네트워크 구조가 노출되지 않도록 대리로 요청을 받아 처리한다.

로드 밸런싱

대용량 트래픽 처리를 위해 물리적 서버를 여러개로 구성한 경우 특정 서버에 트래픽이 몰리지 않도록 하기 위한 별도 로직을 구현하지 않아도 nginx나 apache를 통해 트래픽을 분산 시킬 수 있다.

이를 통해 WAS에 직접 연결하지 않아도 수평 확장이 쉬워지고 다운된 서버를 자동으로 감지하여 관리할 수도 있다.

보안 (Security Layer)

HTTPS(SSL/TLS) 프로토콜 실행을 웹서버가 담당하여 이후 WAS는 HTTPS 처리에 관여하지 않도록 할 수 있다. 또한 특정 IP 차단, 요청 제한(Rate Limiting), CORS 제어 등도 웹서버에서 처리가 가능하다.

성능 최적화

요청을 Gzip으로 압축하여 전송하거나 HTTP/2, Keep-Alive, Connection 재사용 지원, 캐싱 등을 통해 성능 최적화를 진행할 수도 있다.

다른 기능들을 포함하여 결과적으로 웹서버는 WAS가 비즈니스 로직에만 집중하도록 도와주는 보조 장치로서의 역할을 한다.

결론

정적 파일 서빙이 웹서버의 최초 역할이었으나 이후 기능들이 추가되면서 요청을 관리, 보호, 분배하는 역할을 더 중점적으로 하게 되면서 웹서버는 여전히 백엔드를 구성하는 프로그램로서 필수적으로 사용되고 있다. 또한 웹서버는 백엔드에서만 사용되지 않고 프론트엔드 서버에서도 사용되며 정정 콘텐츠 제공을 위한 기존 역할 역시 수행중이다.