Tiny 웹 서버 확장성과 실전 응용
이번 편에서는 CGI를 활용한 동적 콘텐츠 처리와 함께, Tiny 서버가 실제 환경에서 어떻게 확장될 수 있는지 살펴볼 예정인데요. 이제 단순한 정적 파일 제공을 넘어서, 사용자 요청에 따라 동적으로 HTML을 생성해 응답하는 구조까지 이해할 수 있는 능력을 키워 보는 시간을 가져보도록 하겠습니다.
CGI 프로그램 흐름 복습하기
Tiny는 CGI(Common Gateway Interface)를 통해 동적 콘텐츠를 처리합니다. 예를 들어, /cgi-bin/adder?15000&213
요청이 오면, adder.cgi
라는 프로그램이 실행되어 두 숫자를 더해 결과를 HTML로 출력합니다.
서버 측 처리 흐름 (serve_dynamic)
fork()
로 자식 프로세스 생성setenv("QUERY_STRING", cgiargs, 1)
로 환경 변수 설정dup2()
로 표준 출력을 소켓으로 리다이렉션execve()
로 CGI 프로그램 실행
이렇게 하면 CGI 프로그램의 printf()
결과가 그대로 클라이언트로 전송됩니다.
adder.cgi 내부 예시
char *buf = getenv("QUERY_STRING");
int n1, n2;
sscanf(buf, "%d&%d", &n1, &n2);
printf("<html><body>%d + %d = %d</body></html>", n1, n2, n1+n2);
참고로, CGI는 '입출력을 텍스트로 주고받는 간단한 방식'이기 때문에, 복잡한 프레임워크 없이도 충분히 구현이 가능합니다.
Tiny 서버 확장 포인트 정리
지금까지 살펴본 Tiny는 교육용으로 설계된 최소한의 웹 서버이지만, 실제 서비스에 적용하려면 다음과 같은 확장이 필요합니다.
(1) MIME 타입 다양화
- 기존: .html, .jpg, .png 정도만 지원
- 확장: .css, .js, .json, .svg, .pdf, .mp4 등 추가 가능
- get_filetype() 함수만 수정하면 됨
(2) 에러 처리 개선
- 기존:
clienterror()
는 단순 텍스트 전송 - 확장:
404.html
,403.html
같은 템플릿 기반 HTML 반환 - 사용자 친화적인 오류 페이지 제공
(3) 병렬 처리 (동시성)
Tiny는 반복적(Iterative) 서버로 동작합니다. 하지만 실제 웹 서비스는 수십~수천 개의 클라이언트를 동시에 처리해야 하죠.
이를 위한 확장 옵션은 다음과 같습니다:
- fork() 기반 멀티프로세싱: 요청마다 자식 프로세스를 생성 (비용 큼)
- pthread 기반 멀티스레딩: 요청마다 스레드를 생성 (효율 좋지만 동기화 주의)
- select()/epoll 기반 I/O 멀티플렉싱: 이벤트 기반 처리를 통해 수천 개의 연결을 단일 스레드로 처리
이때, 병렬 처리 방식의 선택 기준은 트래픽 특성, 시스템 자원, 개발 난이도에 따라 달라집니다.
4) 보안 이슈 대응
- 디렉토리 트래버설 차단:
../../etc/passwd
접근 방지 - HTTP 보안 헤더 추가: Content-Security-Policy, X-Content-Type-Options 등
- CGI 프로그램 제한: 외부 프로그램에 대한 리소스 제한, 샌드박스 실행 등
5) 기타 실전 대응
- HTTP/1.1
Keep-Alive
지원 - POST 방식 처리 및 입력 바디 파싱
- HTTPS 적용 (OpenSSL 연동)
- 요청 로그 기록 (IP, 응답 코드, URI 등)
마치면서
Tiny 웹 서버는 단순한 예제지만, 그 안에는 웹의 핵심 원리가 다 들어있습니다. 요청 파싱, 정적 파일 전송, 동적 프로그램 실행, MIME 타입 처리, 응답 코드 관리, 그리고 소켓을 통한 통신 구조까지 말이죠.
이제 여러분은 단순히 main → doit → serve_static/dynamic
을 따라가는 수준이 아니라, 확장성, 성능, 보안, 유연성까지 고민할 수 있는 눈을 갖게 되셨을 것이라는 생각이 드는데요. 그리고 무엇보다 이 Tiny를 완전히 이해한 후라면, Node.js, Flask, Nginx 같은 실전 웹 서버의 구조도 놀랍도록 친숙하게 느껴질 겁니다. CSAPP의 진짜 힘은 코드와 원리가 하나로 연결될 때 나타나기 때문이지요.
'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글
[CSAPP 12장 골라읽기] 12.3 스레드를 이용한 동시성 프로그래밍 빠삭하게 이해하기 (0) | 2025.05.05 |
---|---|
[CSAPP 10장 골라읽기] 10.5 안정적인 읽기와 쓰기를 위한 RIO 패키지 완전정복 (0) | 2025.05.05 |
[CSAPP 11장 완전 정복] 11.5~11.6(Part 2) Tiny 웹 서버 구조 뜯어보기 (1) | 2025.05.03 |
[CSAPP 11장 완전 정복] 11.5~11.6(Part 1) 웹 서버의 세계로 한 걸음, Tiny는 왜 필요한가? (0) | 2025.05.03 |
CSAPP 11.5~11.6 rawdata 공유 (전체 학습 목표, 학습 정리 자료) (0) | 2025.05.03 |