웹 서버(Web Server)와 WAS(Web Application Server)의 차이

Jerry·2025년 8월 5일

웹 서버(Web Server)WAS(Web Application Server)는 자주 함께 사용되지만, 각자의 역할, 기능, 처리 계층, 그리고 기술적 구성에서 차이를 갖고 있습니다.

정의 및 기본 역할

구분Web ServerWAS (Web Application Server)
정의클라이언트(주로 브라우저)로부터의 HTTP 요청을 받아 정적인 콘텐츠(HTML, CSS, JS, 이미지 등)를 반환하는 서버웹 서버의 기능에 더해, 동적인 로직 처리 (비즈니스 로직, DB 연동 등)를 담당하는 애플리케이션 서버
목적정적인 웹 리소스를 빠르게 전달클라이언트 요청에 따라 동적으로 처리하고 결과를 반환

주요 기능 비교

항목Web ServerWAS
정적 콘텐츠 처리매우 뛰어남 (HTML, CSS, JS, 이미지 등)가능은 하지만 비효율적
동적 콘텐츠 처리 (JSP, Servlet, API)불가능 (혹은 처리 위임)가능 (JSP/Servlet, Spring, JavaEE 기반 등)
비즈니스 로직 수행불가가능
DB 연결 및 처리불가가능
Session 관리제한적고급 수준의 세션 관리 가능

아키텍처 및 계층 구조

[ Client (Browser) ]
        ↓
[ Web Server (Nginx, Apache) ]  ← 정적 리소스 처리
        ↓
[ WAS (Tomcat, JBoss, Jetty, WebLogic) ]  ← 동적 로직 처리
        ↓
[ DB Server (MySQL, Oracle, etc.) ]
  • 웹 서버는 WAS 앞단에서 요청을 필터링하고 정적 리소스를 직접 응답
  • 동적인 요청만 WAS로 넘겨 부하 분산 및 성능 최적화 역할을 함 (리버스 프록시 또는 로드밸런서로 동작 가능)

예시로 이해하기

www.example.com/user/123에 접속했다고 가정

  • Web Server만 있는 경우: index.html 같은 정적 파일만 응답할 수 있으며, /user/123 요청에 대해선 처리 불가.
  • WAS가 있는 경우:
    • Web Server가 먼저 요청을 받음.
    • /user/123은 동적 URI이므로 WAS에 포워딩.
    • WAS에서는 UserController.getUserById(123)과 같은 비즈니스 로직 실행 → DB 조회 → JSON 반환.

사용 기술

역할주요 기술
Web ServerApache HTTP Server, Nginx, Microsoft IIS, LiteSpeed 등
WASApache Tomcat, Jetty, JBoss/WildFly, GlassFish, WebLogic, WebSphere 등

Tomcat은 WAS지만 자체 내장 Web Server를 가지고 있어서 단독 운영도 가능하지만, 대규모 트래픽을 감당하거나 보안/성능 최적화를 위해 보통 Nginx + Tomcat 조합으로 구성됩니다.

RESTful API의 경우

왜 RESTful API에서도 Nginx를 쓰는가?

  1. Reverse Proxy (역방향 프록시)
    • REST API 서버(Spring Boot 등)를 직접 외부에 노출시키지 않고, Nginx가 대신 요청을 받아서 내부 WAS로 전달합니다.
      • 외부 ↔ Nginx (공개)
      • Nginx ↔ WAS(Spring Boot) (비공개)
    location /api/ {
        proxy_pass http://localhost:8080/;
    }
  2. SSL 종료 (TLS Termination)
    • Nginx가 HTTPS 요청을 받고 HTTP로 내부에 전달
    • WAS는 SSL 처리를 안 해도 됨 → 단순화 & 성능 향상
    listen 443 ssl;
    ssl_certificate     /etc/ssl/cert.pem;
    ssl_certificate_key /etc/ssl/key.pem;
  3. 로드 밸런싱 (Load Balancing)
    upstream spring_backend {
        server 127.0.0.1:8081;
        server 127.0.0.1:8082;
    }
    location /api/ {
        proxy_pass http://spring_backend;
    }
  4. 보안 (IP 제한, Rate Limiting, WAF)
    • 특정 IP만 허용하거나
    • 너무 많은 요청을 보내는 클라이언트는 차단
    • 기본적인 Web Application Firewall 역할도 가능
    limit_req zone=api burst=10 nodelay;
    deny 123.456.789.000;
  5. 정적 리소스 처리 & 캐싱
    • Swagger UI, static docs, 파일 다운로드 등 정적 콘텐츠는 Nginx가 더 빠르게 처리
    • GZIP 압축, 캐시 헤더 설정 등으로 API 응답을 최적화
    gzip on;
    gzip_types application/json;

Spring Boot REST API와 Nginx 조합 예시

Client
   ↓
[Nginx]
   - SSL 처리
   - REST API로 proxy
   - 캐싱, 보안 등
   ↓
[Spring Boot App]
   - REST Controller
   - 비즈니스 로직
   - DB 연동
   ↓
[Database]
환경구조
마이크로서비스각 서비스는 개별 포트에서 REST API 제공 + Nginx가 API Gateway
CI/CD 환경Nginx는 하나, Spring Boot 인스턴스는 계속 새로 배포됨
클라우드Nginx는 Docker 컨테이너, WAS는 Kubernetes Pod
보안 정책외부는 443 포트만 열고, 내부 WAS는 완전 비공개

Reverse Proxy

정의

클라이언트를 대신해서 서버로 요청을 전달하고, 그 결과를 다시 클라이언트에게 반환해주는 중간 서버

프록시(Proxy)와의 비교

구분Forward Proxy (정방향 프록시)Reverse Proxy (역방향 프록시)
위치클라이언트 앞서버 앞
목적클라이언트의 요청을 숨김 (ex. 사내 인터넷 차단 우회)서버를 보호하고 분산 (ex. Nginx, API Gateway)
대표 사례VPN, Squid ProxyNginx, Apache, AWS ALB, Cloudflare

Reverse Proxy가 하는 일들

기능설명
요청 전달클라이언트의 HTTP 요청을 내부 서버에 전달
SSL 처리HTTPS 요청을 받아 내부는 HTTP로 처리 (SSL Termination)
URI 라우팅/api/는 Spring으로, /admin/은 다른 서버로
캐싱정적 파일 응답을 캐시하여 성능 향상
보안 강화서버의 실제 IP/포트를 감추고, 보안 필터 적용 가능
로드밸런싱여러 서버에 트래픽을 분산
모니터링요청 로그 및 성능 측정 가능 (접속 IP, 응답 시간 등)

실전 예시: Nginx 리버스 프록시

server {
    listen 80;
    server_name myapi.com;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}
  • 브라우저가 http://myapi.com으로 요청을 보내면
  • Nginx가 그 요청을 대신 받아
  • 내부의 localhost:8080 (Spring Boot 등)으로 요청을 보내고
  • 그 결과를 다시 클라이언트에 전달합니다

AWS EC2에 배포한다면?

아키텍처 개요 (Spring Boot + Nginx + EC2)

클라이언트 (,, etc)
        ↓
    [AWS EC2 Public IP / Domain]
        ↓
    [Nginx (Reverse Proxy, SSL, 보안)]
        ↓
    [Spring Boot App (내장 Tomcat)]
        ↓
    [RDS or Local DB]
  • Nginx: 80/443 포트 열림 (외부 접근 허용)
  • Spring Boot: 8080 (내부에서만 사용)
  • EC2: Amazon Linux 2 또는 Ubuntu, 보안 그룹 설정 필수
  • SSL 인증서: Let's Encrypt + Certbot 또는 AWS ACM

Reference

profile
Backend engineer

0개의 댓글