웹 서버의 세계로 한 걸음, Tiny는 왜 필요한가?
이번 포스트에서는 CSAPP 11장 중 11.5절의 상단부 핵심을 중심으로 Tiny 웹 서버의 존재 이유와 구조에 대해 정리해 보겠습니다. 여기서 중요한 건 단순히 '웹 서버는 클라이언트의 요청을 받고 응답을 준다'의 개념을 넘어서, '왜 그렇게 동작하는가?'에 대한 철학적 구조를 파악하는 것이죠.
HTTP의 요청과 응답은 어떻게 구성되어 있을까?
웹 서버를 이해하려면 먼저 HTTP 프로토콜의 동작 방식을 알아야 합니다.
1. HTTP 요청 메시지 (Client → Server)
- 요청 줄 (Request Line): METHOD URI VERSION (ex.
GET /index.html HTTP/1.1
) - 요청 헤더들: Host, User-Agent, 등
- 빈 줄: 헤더의 끝을 표시
- 선택적 본문 (Body): POST일 경우 포함
2. HTTP 응답 메시지 (Server → Client)
- 상태 줄 (Status Line): VERSION STATUS-CODE STATUS-MESSAGE (ex.
HTTP/1.1 200 OK
) - 응답 헤더들: Content-Type, Content-Length 등
- 빈 줄: 헤더 종료
- 본문 (Body): 요청된 실제 데이터
여기서 중요한 건 HTTP는 '텍스트 기반'이라는 점입니다. 즉, 우리가 터미널로도 직접 쿼리를 보낼 수 있단 뜻이지요.
Tiny 웹 서버는 무엇을 위해 존재할까?
Tiny는 단순한 예제가 아닙니다. 그것은 웹 서버의 핵심 구조를 최소한으로 구현한, 실전 학습용 웹 서버입니다.
- GET 메서드만 지원한다. (POST, PUT, DELETE 등은 무시)
- 정적 콘텐츠 (HTML, 이미지 등)와 동적 콘텐츠 (CGI) 를 모두 처리한다.
- 분기 로직(if (is_static) ... else ...)이 핵심이며, 이것이 어떻게 콘텐츠 유형에 따라 다른 동작을 이끌어내는지가 관건
정적 콘텐츠 vs 동적 콘텐츠
정적 콘텐츠
- HTML, CSS, 이미지처럼 고정된 파일
serve_static()
함수에서 처리mmap()
으로 파일을 메모리에 매핑하여 성능을 끌어올림
동적 콘텐츠
- adder.cgi 같은 CGI 프로그램의 실행 결과
fork() + execve()
로 자식 프로세스를 생성하여 동작QUERY_STRING
환경 변수로 클라이언트의 요청 값을 전달
URI는 어떻게 파일 경로로 변환될까?
Tiny는 parse_uri()를 통해 URI를 실제 파일 경로로 바꿉니다. 예시를 들면 아래와 같은데요.
(1) /home.html → ./home.html
(2) /images/pic.jpg → ./images/pic.jpg
(3) / → ./home.html
다만, 보안상의 이유로 ../ 같은 경로 우회는 반드시 막아야 하지만, Tiny에는 학습 목적 상 해당 로직이 생략되어 있습니다.
마치면서, 우리는 왜 Tiny를 배우는가?
책의 line-by-line 분석에 들어가기 전에, 우리가 하고 있는 게 '단순히 파일을 읽고 전송하는 게 아니라', 클라이언트의 요청을 분석해서 거기에 맞는 응답을 동적으로 구성하는 구조라는 걸 이해하는 것이 중요합니다.
Tiny는 단순함 속에 웹 서버의 본질을 담고 있는데요. 그 철학과 구조를 이해하면, 어떤 서버 코드도 쉽게 읽을 수 있을 것입니다. 다음 편에서는 Tiny의 doit()
, serve_static()
, serve_dynamic()
을 자세히 파헤쳐보며, 실제 코드 흐름을 단계별로 분석해 보겠습니다. 감사합니다!
'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글
[CSAPP 11장 완전 정복] 11.5~11.6(Part3) Tiny 웹 서버 확장성과 실전 응용 (1) | 2025.05.03 |
---|---|
[CSAPP 11장 완전 정복] 11.5~11.6(Part 2) Tiny 웹 서버 구조 뜯어보기 (1) | 2025.05.03 |
CSAPP 11.5~11.6 rawdata 공유 (전체 학습 목표, 학습 정리 자료) (0) | 2025.05.03 |
[CSAPP 11장 완전 정복] 11.4(Part 2) addrinfo, sockaddr 구조체부터 변환 함수까지 한 번에 정리하기 (0) | 2025.05.02 |
[CSAPP 11장 완전 정복] 11.4(Part 1) 소켓 함수 흐름 완전정복, 클라이언트-서버 연결의 모든 것 (0) | 2025.05.02 |