1. 웹 서버란

웹 서버(Web Server)는 HTTP 요청을 처리하고 응답을 반환하는 프로그램
클라이언트(브라우저)의 요청을 받아 HTML, 이미지, JSON 등 콘텐츠를 전달
웹 서버의 핵심 기능
- 요청(Request)을 수신
- 리소스(Resource)를 탐색하고 처리
- 응답(Response)을 반환
모든 웹 서버는 이 세 단계를 중심으로 작동
웹 애플리케이션 서버와의 차이?
웹 서버가 처리하지 못하는 동적인 요청을 처리하는 서버
데이터베이스 연결, 비즈니스 로직 수행, 세션 관리 등을 담당
핵심 역할
- Java, Python, Node.js 등으로 작성된 코드 실행
- 요청에 따라 동적 페이지 생성 (예: JSP, Servlet, Flask, Spring)
- DB와 연동하여 데이터를 조회하거나 수정
- 세션 및 트랜잭션 관리
2. 웹 서버 구성 요소
(1) 소프트웨어와 하드웨어
웹 서버는 HTTP + TCP 처리 기능을 구현한 소프트웨어
운영체제는 파일 시스템, 네트워크, 프로세스 제어를 담당
하드웨어는 데이터 입출력과 커넥션 관리 역할을 수행
(2) 대표적인 웹 서버
- Apache
- Nginx
- Microsoft IIS
현재는 Apache와 Nginx가 가장 널리 사용됨
(2-1) 대표적인 웹 애플리케이션 서버
- Tomcat
- JBoss
- WebLogic
- WebSphere
- Jeus
참고! WAS와 WAS 프레임워크
Tomcat, JBoss, WebLogic, WebSphere, Jeus는 WAS 엔진이고,
Spring Boot나 Django는 그 위에서 돌아가거나, 엔진을 자체 포함해 WAS처럼 동작하는 애플리케이션 프레임워크다.
(3) 임베디드 웹 서버
IoT 기기나 프린터 등 소형 하드웨어에 내장되어
웹 인터페이스를 통한 설정 및 제어를 가능하게 함
3. 웹 서버의 요청 처리 단계
웹 서버는 요청을 받으면 다음과 같은 7단계 HTTP 트랜잭션을 수행함
1. 커넥션 맺기
2. 요청 받기
3. 요청 처리
4. 리소스 접근
5. 응답 만들기
6. 응답 보내기
7. 로그 기록
4. 커넥션 관리

- Keep-Alive 연결이 존재하면 재활용
- 없으면 새 TCP 커넥션 생성
- 서버는 클라이언트의 IP를 호스트명으로 역변환(reverse DNS) 가능
- Ident 프로토콜로 사용자 확인도 가능하지만, 보안상 거의 사용되지 않음
5. 요청 메시지 수신 및 파싱
요청 메시지는 다음 순서로 처리됨
- 요청 라인 (method, URI, version)
- 헤더 (header)
- 본문 (body)
본문은 버퍼에 임시 저장 후 처리
파싱된 데이터는 내부 자료구조로 관리됨
6. I/O 아키텍처

- 단일 스레드 서버: 한 번에 하나의 요청만 처리, 단순하지만 비효율적
- 멀티스레드 / 멀티프로세스 서버: 병렬 처리 가능하지만 리소스 소모 큼
- 다중 I/O 서버: 비동기 이벤트 기반, 대규모 커넥션에 효율적 (Nginx, Node.js 구조)
7. 리소스 매핑과 접근

웹 서버는 리소스 서버임. HTML이나 JPG같은 미리 만들어진 정적 파일을 제공하며, 애플리케이션 서버에서 만들어진 동적 콘텐츠도 제공.
클라이언트에서 요청 메시지를 보내면 웹서버는 URI에 맞는 콘텐츠나 동적 파일을 웹 서버에서 찾아서 제공해야 함.
리소스 매핑 방법
1. DocRoot
웹 서버의 문서 루트 디렉터리
요청 URI를 docroot 경로 뒤에 붙여 실제 파일을 탐색
2. 가상 호스팅 (Virtual Hosting)
하나의 서버에서 여러 도메인 운영 가능
각 사이트는 독립된 DocRoot를 가짐
3. 사용자 홈 디렉터리 DocRoot
각 사용자가 자신의 개인 웹 사이트(public_html)를 가질 수 있음
4. 디렉터리 목록
웹 서버는, 경로가 파일이 아닌 디렉터리를 가리키는 URL에 대한 요청을 받을 수 있다.
디렉터리 URI 요청 시 서버는 다음 중 하나 수행
- 에러 반환
- index.html 반환
- 디렉터리 목록 페이지 반환
7-2. 동적 리소스 처리

- 동적 리소스는 요청 시점에 프로그램이 실행되어 결과를 생성
- 웹 서버는 특정 URI 요청을 프로그램 실행 결과와 매핑함
동작 흐름
1. 클라이언트가 동적 URI 요청
2. 웹 서버가 이 요청이 동적 처리 대상임을 인식
3.해당 스크립트나 애플리케이션을 서버 내부에서 실행
4. 실행 결과(HTML, JSON 등)를 HTTP 응답으로 변환해 클라이언트에게 전달
구현 방식
| CGI (Common Gateway Interface) | 요청마다 외부 프로그램 실행 | Perl, Python, PHP |
| 서블릿 / JSP | WAS 내부에서 스레드 단위로 실행 | Java 기반 (Tomcat 등) |
| Server-Side Includes (SSI) | HTML 내부에 스크립트를 삽입하여 서버가 처리 | <!--#include file="footer.html" --> |
| 모듈형 확장 (Module) | Apache 모듈, Nginx FastCGI 등으로 직접 연동 | mod_php, mod_wsgi |
주요 특징
- 요청에 따라 매번 다른 결과 생성 (예: 로그인 페이지, 상품 검색 결과 등)
- CGI는 프로세스 기반, 서블릿은 스레드 기반
- 현대 서버에서는 대부분 WAS나 프레임워크 기반 동적 처리로 대체됨 (예: Spring, Django 등)
8. 응답 만들기
응답은 상태 코드, 헤더, 본문으로 구성 됨
MIME 타입 결정 방식

- mime.types 파일 기반 (확장자 매핑)
- Magic typing (파일 내용 분석)
- Explicit typing (명시적 지정)
- Type negotiation (클라이언트 조건에 따라 최적 선택)
9 .로깅
트랜잭션 완료 후 서버는 요청 결과를 로그 파일에 기록.
로그는 성능 분석, 오류 추적, 보안 모니터링에 활용 됨
'CS > HTTP' 카테고리의 다른 글
| HTTP 엔터티와 인코딩 (0) | 2025.11.21 |
|---|---|
| 보안 HTTP (0) | 2025.11.14 |
| HTTP 캐시 (0) | 2025.10.31 |
| HTTP 커넥션 관리 (TCP/IP) (0) | 2025.10.10 |
| HTTP와 URL, 그리고 앱 커스텀 스킴 경험 (0) | 2025.09.15 |
댓글