실무에서 흔히 Nginx와 Spring 혹은 Node.js 서버를 함께 사용한다. 이 둘은 어떤 역할을 나눠서 담당하고 있을까?

핵심 정의

  • 웹서버(Web Server): HTTP 요청을 받아 정적 콘텐츠를 빠르게 응답하는 서버다. Nginx, Apache가 대표적이다.
  • WAS(Web Application Server): 동적 콘텐츠를 생성하고 비즈니스 로직을 처리하는 서버다. Spring Boot, Node.js, Tomcat이 대표적이다.

역할 분리의 이유

1. 서버 부하 방지

WAS는 DB 조회, 인증, 계산 등 복잡한 로직을 처리한다. 정적 파일(HTML, CSS, JS, 이미지)까지 WAS가 처리하면 부하가 커지고 동적 요청의 응답 속도가 느려진다. 웹서버가 정적 콘텐츠를 앞단에서 빠르게 처리하면 WAS는 비즈니스 로직에 집중할 수 있다.

2. 보안 강화

WAS는 데이터베이스와 직접 통신하며 중요한 비즈니스 로직을 처리한다. 외부에 직접 노출되면 공격 표면이 넓어진다. 웹서버를 앞단에 배치하면 다음과 같은 보안 이점이 있다.

  • WAS의 실제 IP 주소를 숨길 수 있다
  • SSL 인증서를 웹서버에서 관리하여 암복호화를 집중 처리한다
  • 악성 요청을 웹서버에서 필터링하여 WAS까지 도달하지 못하게 한다

3. 장애 극복 (Failover)

대규모 서비스에서는 여러 WAS 인스턴스를 운영한다. 웹서버가 로드밸런서 역할을 하면서 특정 WAS에 장애가 발생해도 다른 WAS로 요청을 전달할 수 있다. 사용자는 장애를 느끼지 못하고 서비스를 이용할 수 있다.

4. 확장성

웹서버와 WAS가 분리되면 각각 독립적으로 확장할 수 있다. 트래픽 증가 시 WAS만 수평 확장(Scale-out)하거나, 정적 콘텐츠 요청이 많으면 CDN과 연동하여 웹서버 부하를 줄일 수 있다.

역할 비교

구분웹서버 (Nginx)WAS (Spring, Node.js)
역할요청/응답 처리, 정적 파일 제공동적 요청 처리, 비즈니스 로직 수행
예시HTML, CSS, JS, 이미지 응답로그인, 결제, DB 조회
특징빠르고 가벼움, 이벤트 기반자원 소모 큼, 멀티스레드
프로토콜HTTP/HTTPS, HTTP/2HTTP, RMI, RPC 등
확장수평 확장 용이수평/수직 확장 모두 필요

웹서버의 주요 기능

리버스 프록시

클라이언트 요청을 받아 적절한 백엔드 서버로 전달한다. 클라이언트는 WAS의 존재를 알 필요가 없다.

location /api {
    proxy_pass http://backend:8080;
}

로드밸런싱

여러 WAS 인스턴스로 요청을 분산한다. Round Robin, Least Connections 등 다양한 알고리즘을 지원한다.

upstream backend {
    server was1:8080;
    server was2:8080;
    server was3:8080;
}

SSL 종료 (SSL Termination)

SSL 암복호화를 웹서버에서 처리한다. WAS는 암호화 연산 부담 없이 비즈니스 로직에 집중할 수 있다. 인증서 관리도 웹서버 한 곳에서 처리하면 된다.

정적 파일 캐싱

자주 요청되는 정적 파일을 메모리에 캐싱하여 빠르게 응답한다. CDN과 연동하면 전 세계 사용자에게 빠른 응답을 제공할 수 있다.

구조 예시

사용자 → Nginx (웹서버) → Spring/Node.js (WAS) → DB, 외부 API
         ├─ 정적 파일 직접 응답
         ├─ SSL 종료
         ├─ 로드밸런싱
         └─ 동적 요청만 WAS로 전달

실무 시나리오

시나리오: 이벤트 페이지 트래픽 폭증

문제: 이벤트 시작과 동시에 사용자가 몰리면서 WAS CPU 사용률 100% 도달

해결 방안:

  1. 정적 이벤트 페이지는 Nginx에서 직접 응답하도록 설정
  2. WAS를 수평 확장하고 Nginx에서 로드밸런싱
  3. CDN을 연동하여 이미지, CSS, JS 요청을 분산

결과: WAS는 당첨 로직, DB 조회 등 핵심 로직에만 집중할 수 있다.

주의사항

  • 웹서버가 단일 장애 지점(SPOF)이 될 수 있다. 고가용성이 필요하면 웹서버도 이중화한다.
  • SSL 종료 후 내부 네트워크 통신이 평문(HTTP)이면 보안에 취약하다. 필요시 내부 통신도 암호화(Re-encryption)를 고려한다.
  • Keepalive 연결을 설정하지 않으면 매 요청마다 TCP 핸드셰이크가 발생하여 성능이 저하된다.

웹서버와 WAS를 분리하면 보안, 성능, 확장성, 장애 대응 모든 측면에서 이점을 얻을 수 있다.