웹 서버(Web Server)와 WAS(Web Application Server)는 자주 함께 사용되지만, 각자의 역할, 기능, 처리 계층, 그리고 기술적 구성에서 차이를 갖고 있습니다.
정의 및 기본 역할
| 구분 | Web Server | WAS (Web Application Server) |
|---|
| 정의 | 클라이언트(주로 브라우저)로부터의 HTTP 요청을 받아 정적인 콘텐츠(HTML, CSS, JS, 이미지 등)를 반환하는 서버 | 웹 서버의 기능에 더해, 동적인 로직 처리 (비즈니스 로직, DB 연동 등)를 담당하는 애플리케이션 서버 |
| 목적 | 정적인 웹 리소스를 빠르게 전달 | 클라이언트 요청에 따라 동적으로 처리하고 결과를 반환 |
주요 기능 비교
| 항목 | Web Server | WAS |
|---|
| 정적 콘텐츠 처리 | 매우 뛰어남 (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 Server | Apache HTTP Server, Nginx, Microsoft IIS, LiteSpeed 등 |
| WAS | Apache Tomcat, Jetty, JBoss/WildFly, GlassFish, WebLogic, WebSphere 등 |
Tomcat은 WAS지만 자체 내장 Web Server를 가지고 있어서 단독 운영도 가능하지만, 대규모 트래픽을 감당하거나 보안/성능 최적화를 위해 보통 Nginx + Tomcat 조합으로 구성됩니다.
RESTful API의 경우
왜 RESTful API에서도 Nginx를 쓰는가?
- Reverse Proxy (역방향 프록시)
- REST API 서버(Spring Boot 등)를 직접 외부에 노출시키지 않고, Nginx가 대신 요청을 받아서 내부 WAS로 전달합니다.
- 외부 ↔ Nginx (공개)
- Nginx ↔ WAS(Spring Boot) (비공개)
location /api/ {
proxy_pass http://localhost:8080/;
}
- SSL 종료 (TLS Termination)
- Nginx가
HTTPS 요청을 받고 HTTP로 내부에 전달
- WAS는 SSL 처리를 안 해도 됨 → 단순화 & 성능 향상
listen 443 ssl;
ssl_certificate /etc/ssl/cert.pem;
ssl_certificate_key /etc/ssl/key.pem;
- 로드 밸런싱 (Load Balancing)
upstream spring_backend {
server 127.0.0.1:8081;
server 127.0.0.1:8082;
}
location /api/ {
proxy_pass http://spring_backend;
}
- 보안 (IP 제한, Rate Limiting, WAF)
- 특정 IP만 허용하거나
- 너무 많은 요청을 보내는 클라이언트는 차단
- 기본적인 Web Application Firewall 역할도 가능
limit_req zone=api burst=10 nodelay;
deny 123.456.789.000;
- 정적 리소스 처리 & 캐싱
- 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 Proxy | Nginx, 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