Categories: Network

웹 서버(Web Server)와 WAS(Web Application Server) 알아보기

서론

현대 웹 애플리케이션 아키텍처에서 웹 서버(Web Server)웹 애플리케이션 서버(WAS, Web Application Server) 의 역할을 명확히 이해하는 것은 고성능·고가용성 시스템을 설계·운영하는 데 필수적입니다. 두 서버는 종종 함께 사용되지만, 그 내부 기능과 책임 범위에는 분명한 차이가 있습니다. 본 글에서는 웹 서버와 WAS의 정의·구조·주요 기능·실제 구성 예시를 살펴보고, 어떤 상황에서 각각을 선택·조합해야 하는지에 대해 안내합니다.

웹 서버(Web Server)

정의
  • 웹 서버는 HTTP(S) 프로토콜을 통해 들어오는 요청을 처리하고, 주로 정적 콘텐츠(HTML, CSS, JavaScript, 이미지 등)를 클라이언트에 전달하는 서버 소프트웨어입니다.
  • 전통적으로 정적 파일 서비스, 로드 밸런싱, SSL 종료(SSL termination) 등이 주요 기능입니다.
주요 기능
  1. 정적 컨텐츠 서비스
    • 파일 시스템 상의 리소스를 직접 읽어 HTTP 응답 본문으로 반환
    • 캐시 설정(Expires, Cache-Control) 및 압축(Gzip) 지원
  2. SSL/TLS
    • 클라이언트와의 암호화 통신(HTTPS)을 처리
    • 인증서 관리 및 갱신(AutoSSL, Let’s Encrypt 연동 등)
  3. 로드 밸런싱 & 리버스 프록시
    • 다수의 백엔드 서버(WAS 등)로 트래픽 분산
    • 요청 URL·헤더 기반 라우팅
  4. 정책 기반 접근 제어
    • IP 화이트/블랙리스트
    • 요청 크기·시간 제한
대표 소프트웨어 및 아키텍처
  • Apache HTTP Server
    • 모듈 기반 구조(apache2 모듈)
    • Multi-Processing Module(MPM) 선택 가능
  • Nginx
    • 이벤트 기반 비동기 모델(Worker 프로세스 + Event Loop)
    • 낮은 메모리·CPU 사용으로 고성능
  • Microsoft IIS
    • Windows 통합 관리
    • .NET 애플리케이션과 호환성

Nginx 이벤트 모델 예시

Nginx
worker_processes auto;
events {
    worker_connections 1024;
}
http {
    sendfile on;
    gzip on;
    server {
        listen 80;
        server_name example.com;
        root /var/www/html;
    }
}
Nginx

웹 애플리케이션 서버(WAS)

정의
  • WAS는 서버측에서 실행되는 동적 애플리케이션 로직(서블릿, JSP, EJB, Spring Bean 등)을 처리하고, 비즈니스 로직·데이터베이스 연동·트랜잭션 관리 기능을 제공하는 서버 환경입니다.
  • HTTP 요청을 받아 내부 로직을 수행한 뒤, 결과를 웹 서버 혹은 클라이언트로 반환합니다.
주요 기능
  1. 서블릿/컨테이너 기능
    • Java EE 기준의 Servlet, JSP 스펙 준수
    • 서블릿 라이프사이클 관리(init(), service(), destroy())
  2. 비즈니스 로직 실행
    • EJB(Enterprise JavaBeans), CDI, Spring Framework 등 컴포넌트 실행
  3. 데이터베이스 커넥션 풀
    • javax.sql.DataSource 인터페이스 기반 커넥션 풀 제공
  4. 트랜잭션 관리
    • JTA(Java Transaction API) 연동
    • 선언적 트랜잭션(@Transactional)
  5. 세션 관리
    • HTTP 세션 클러스터링 및 세션 복제
  6. 보안 관리
    • 인증·인가(폼 인증, BASIC, OAuth2)
    • 역할 기반 접근 제어(RBAC)
대표 소프트웨어 및 아키텍처
  • Apache Tomcat
    • 경량 서블릿 컨테이너
    • Spring Boot 기본 내장 서버로도 사용
  • Jetty
    • 임베디드 모드에 최적화
    • 컴팩트한 구조
  • WildFly (구 JBoss AS), Oracle WebLogic, IBM WebSphere
    • 풀 스택 Java EE 서버
    • 클러스터링·관리 콘솔·운영 툴 제공

Tomcat 서버.xml 예시 (Connector 설정)

XML
<Connector port="8080"
           protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443"
           maxThreads="200"
           minSpareThreads="25"
           enableLookups="false" />
XML

웹 서버 vs WAS 비교

구분웹 서버WAS
처리 대상정적 콘텐츠동적 콘텐츠(비즈니스 로직)
프로토콜 핸들링HTTP(S)HTTP(S) + 서블릿/JSP 스펙
주요 기능파일 서비스, SSL, 로드밸런싱서블릿 컨테이너, 트랜잭션, 세션, 보안
성능 특성낮은 리소스, 높은 동시 처리로직 실행 비용, JVM·스레드 풀 관리 필요
확장성가볍게 수평 확장 쉬움클러스터링·세션 복제로 수평 확장 가능
구성 예시Nginx → 정적 리소스 직접 전달Nginx → WAS 프록시 → 동적 처리 수행

실제 인프라 구성 예시: Nginx + Tomcat 연동

  1. Nginx: 외부 요청 수신, SSL 종료, 정적 파일 서비스, 프록시 전달
  2. Tomcat: 동적 요청(예: /app/*) 처리, 비즈니스 로직 실행
Nginx
server {
    listen 80;
    server_name www.example.com;

    # 정적 리소스 처리
    location ~* \.(jpg|png|css|js|html)$ {
        root /var/www/html;
        expires 7d;
    }

    # 동적 요청 프록시
    location /app/ {
        proxy_pass http://127.0.0.1:8080/app/;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_buffering off;
    }
}
Nginx

Tomcat 쪽에는 server.xml 의 Connector 설정만으로 포트 8080을 열어두고, 애플리케이션을 배포하면 됩니다.

선택 가이드

  1. 정적 콘텐츠가 대부분일 때
    • Nginx, Apache와 같은 웹 서버 단독 운영
    • CDN (Content Delivery Network) 활용 권장
  2. 복잡한 비즈니스 로직·데이터베이스 연동이 필요할 때
    • WAS 기반 애플리케이션 서버 도입
    • Spring, Jakarta EE 스펙 활용
  3. 대규모 트래픽 환경
    • 웹 서버와 WAS를 분리하여 역할 분담
    • 웹 서버 앞단에서 캐싱·SSL·로드밸런싱 처리
    • WAS 클러스터링으로 세션·트랜잭션 안정성 확보
  4. 운영·유지보수 고려
    • 경량화된 구조를 원하면 Tomcat + Jetty
    • 엔터프라이즈 기능(관리 콘솔·클러스터링 등)이 필요하면 WildFly·WebLogic

결론

웹 서버는 정적 컨텐츠에 특화된 가볍고 빠른 처리 엔진이며, WAS는 동적 비즈니스 로직 실행·트랜잭션 관리 등 애플리케이션 실행 환경을 제공합니다. 대부분의 실무 환경에서는 두 서버를 적절히 조합(예: Nginx + Tomcat)하여, 정적 자원 서비스와 동적 로직 처리를 효율적으로 분리·최적화함으로써 높은 성능과 안정성을 달성합니다. 본 블로그의 구성 예시와 선택 가이드를 참고하여, 여러분의 시스템 요구사항에 맞는 최적의 서버 구성을 설계하시길 바랍니다.

suover

Recent Posts

HTTP 헤더(Header)란 무엇인가?

HTTP 헤더(Header)란? HTTP(Header)는 클라이언트와 서버 간에 교환되는 메타데이터로, 요청(Request)과 응답(Response)에 부가적인 정보를 실어 나르는 역할을…

1개월 ago

인프런 워밍업 클럽 스터디 3기 – 백엔드 클린 코드, 테스트 코드 후기

Readable Code: 읽기 좋은 코드를 작성하는 사고법Practical Testing: 실용적인 테스트 가이드 강의와 함께한 인프런 워밍업 클럽…

2개월 ago

인프런 워밍업 클럽 스터디 3기 – 백엔드 클린 코드, 테스트 코드 4주차 회고

Readable Code: 읽기 좋은 코드를 작성하는 사고법Practical Testing: 실용적인 테스트 가이드 강의와 함께한 인프런 워밍업 클럽…

2개월 ago

실용적인 테스트 가이드: @Mock, @MockBean, @Spy, @SpyBean, @InjectMocks

테스트 시 의존성 주입(Dependency Injection)과 Mockito Spring 애플리케이션을 개발하다 보면, 테스트 코드에서 실제 빈(Bean)을 사용하지…

2개월 ago

실용적인 테스트 가이드: Layered Architecture 레이어드 아키텍처

들어가며 스프링 기반 프로젝트에서 좋은 설계 구조와 테스트 전략은 소프트웨어 품질과 유지보수성에 직결됩니다. 최근 학습한…

2개월 ago

인프런 워밍업 클럽 스터디 3기 – 백엔드 클린 코드, 테스트 코드 3주차 회고

Readable Code: 읽기 좋은 코드를 작성하는 사고법Practical Testing: 실용적인 테스트 가이드 강의와 함께한 인프런 워밍업 클럽…

2개월 ago