[CSAPP 11장 완전 정복] 11.5~11.6(Part3) Tiny 웹 서버 확장성과 실전 응용

2025. 5. 3. 21:56·크래프톤 정글/컴퓨터구조(CSAPP)

Tiny 웹 서버 확장성과 실전 응용

이번 편에서는 CGI를 활용한 동적 콘텐츠 처리와 함께, Tiny 서버가 실제 환경에서 어떻게 확장될 수 있는지 살펴볼 예정인데요. 이제 단순한 정적 파일 제공을 넘어서, 사용자 요청에 따라 동적으로 HTML을 생성해 응답하는 구조까지 이해할 수 있는 능력을 키워 보는 시간을 가져보도록 하겠습니다.

 

 

CGI 프로그램 흐름 복습하기

Tiny는 CGI(Common Gateway Interface)를 통해 동적 콘텐츠를 처리합니다. 예를 들어, /cgi-bin/adder?15000&213 요청이 오면, adder.cgi라는 프로그램이 실행되어 두 숫자를 더해 결과를 HTML로 출력합니다.

서버 측 처리 흐름 (serve_dynamic)

  1. fork()로 자식 프로세스 생성
  2. setenv("QUERY_STRING", cgiargs, 1)로 환경 변수 설정
  3. dup2()로 표준 출력을 소켓으로 리다이렉션
  4. 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
'크래프톤 정글/컴퓨터구조(CSAPP)' 카테고리의 다른 글
  • [CSAPP 12장 골라읽기] 12.3 스레드를 이용한 동시성 프로그래밍 빠삭하게 이해하기
  • [CSAPP 10장 골라읽기] 10.5 안정적인 읽기와 쓰기를 위한 RIO 패키지 완전정복
  • [CSAPP 11장 완전 정복] 11.5~11.6(Part 2) Tiny 웹 서버 구조 뜯어보기
  • [CSAPP 11장 완전 정복] 11.5~11.6(Part 1) 웹 서버의 세계로 한 걸음, Tiny는 왜 필요한가?
그냥사람_
그냥사람_
IT 관련 포스팅을 합니다. 크래프톤 정글 8기 정경호
  • 그냥사람_
    그냥코딩
    그냥사람_
  • 전체
    오늘
    어제
    • 글 전체보기 N
      • 크래프톤 정글 N
        • 로드 투 정글(입학시험)
        • CS기초(키워드, 개념정리)
        • 컴퓨터구조(CSAPP)
        • Code 정글(C언어)
        • Equipped in 정글(나만무) N
        • 마이 정글(WIL, 에세이)
      • 자료구조&알고리즘
        • 자료구조
        • 알고리즘
      • 일상
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.3
그냥사람_
[CSAPP 11장 완전 정복] 11.5~11.6(Part3) Tiny 웹 서버 확장성과 실전 응용
상단으로

티스토리툴바