[TIL/크래프톤 정글] DAY 57

배재준·2025년 5월 5일

크래프톤 정글 - TIL

목록 보기
50/93
post-thumbnail

2025.05.05

TIL(TODAY I LEARN)


  • 오늘한 내용 : CS - 네트워크 프로그래밍 - 11.5 ~ 11.7

  • WEEK08: BSD소켓, IP, TCP, HTTP, file descriptor, DNS


11.5 – Web Servers

  • 네트워크 프로그래밍 개념(socket, TCP, IP 등)을 활용해 작고 간단하지만 기능적인 웹 서버를 구현해보는 게 이 절의 목표
  • 지금까지는 에코 서버 기반의 단순 TCP 통신을 다뤘고,
  • 이 절에서는 이 기반을 활용해 HTTP 웹 서버를 직접 만들어본다.

11.5.1 웹 기초

  • 웹 클라이언트와 서버는 HTTP(Hypertext Transfer Protocol)를 통해 통신한다.
  • HTTP는 텍스트 기반 프로토콜이며, 요청-응답 트랜잭션으로 동작한다:
    1. 클라이언트가 서버와 연결을 맺고,
    2. HTTP 요청 메시지를 보낸다.
    3. 서버는 요청을 처리하고 응답 메시지를 되돌린다.
    4. 그 후 서버 또는 클라이언트가 TCP 연결을 종료한다.
  • 웹은 FTP와 달리 HTML을 사용한다. HTML은 하이퍼텍스트 문서를 구성하는 언어다.
    • 예: <b>bold</b> → 굵은 글씨
    • 예: <a href="http://cmu.edu">link</a> → 링크 클릭 시 다른 서버에 요청 전송
  • 웹 페이지는 이러한 하이퍼링크를 통해 다른 서버의 콘텐츠와 연결될 수 있다.

11.5.2 웹 컨텐츠

  • 웹 콘텐츠(Web content)는 크게 두 종류로 나뉜다:
    1. 정적 콘텐츠(static content)
      • HTML, 이미지, CSS 파일처럼 변하지 않는 파일
      • 클라이언트 요청 시, 서버는 파일 시스템에서 그대로 읽어서 반환
    2. 동적 콘텐츠(dynamic content)
      • 요청 시마다 서버가 실행 결과를 생성해서 반환함
      • 예: 현재 시간, 계산 결과, 사용자 입력에 따른 결과 등
      • 동적 콘텐츠는 외부 프로그램을 실행해 그 출력을 반환함 → 대표적으로 CGI(Common Gateway Interface) 방식
  • 웹 서버는 요청된 경로가 정적이면 파일로 처리하고, 동적이면 실행 파일로 처리해서 stdout 출력을 클라이언트에게 돌려준다.

MIME type

  • 클라이언트에게 "이 응답은 어떤 형식의 데이터야" 라고 알려주는 역할
Content-Type: text/html       // HTML 문서
Content-Type: text/plain      // 일반 텍스트
Content-Type: image/png       // PNG 이미지
Content-Type: application/json // JSON 데이터

URL의 구조 (/, ?)

  • /경로(path)
    • 서버의 리소스(파일 또는 프로그램) 경로
  • ?쿼리 문자열(query string)
    • 주로 동적 콘텐츠 요청 시 매개변수 전달에 사용됨
    • 서버는 ? 뒤에 있는 문자열을 프로그램에게 전달함 (환경변수 또는 stdin으로)

참고:

  • adder는 실행 파일
  • ?num1=3&num2=5는 파라미터
  • CGI에서는 QUERY_STRING 환경변수로 이 값을 전달받음
URL 예시의미처리 방식
/home.html정적 파일파일 시스템에서 읽기
/cgi-bin/adder?x=1&y=2동적 실행 + 파라미터 전달CGI 실행 후 stdout 결과 전송
/images/icon.png정적 이미지MIME image/png로 응답
/api/user?id=42보통 동적 (DB 조회 등)JSON 반환 + Content-Type: application/json

11.5.3 HTTP 트랜잭션

  • HTTP는 텍스트 기반 프로토콜
  • HTTP는 텍스트 줄(line)로 구성된 메시지를 주고받음
  • 각 줄은 \r\n (Carriage Return + Line Feed)로 끝나야 함
  • telnet 프로그램으로 직접 요청을 만들어 테스트할 수 있음 → 책에서는 AOL 웹서버와의 실제 거래 예제 사용
// 정적 콘텐츠 수행 예제
→ 서버에 요청 보냄
$ telnet www.aol.com 80
Trying 205.188.146.23...
Connected to aol.com.
GET / HTTP/1.1
Host: www.aol.com
<CRLF>

→ 서버가 응답 보냄:
HTTP/1.0 200 OK
Content-Type: text/html
...
<html> ... </html>

HTTP 요청

필드설명
요청 라인GET / HTTP/1.1 – 메서드, URI, 프로토콜 버전
헤더Host는 HTTP/1.1에서 필수
빈 줄헤더 종료 의미

HTTP 응답

필드설명
응답 라인HTTP 버전, 상태 코드, 상태 메시지
헤더MIME 타입, 콘텐츠 길이 등 포함
본문HTML 파일 내용 등
  • HTTP 주요상태 코드
코드의미설명
200 OK성공요청된 콘텐츠 반환됨
404 Not Found실패요청한 파일 없음
500 Internal Server Error서버 오류CGI 실행 실패 등
301 Moved Permanently리다이렉트주소 영구 변경됨

11.5.4 동적 컨텐츠의 처리

CGI(Common Gateway Interface)

  • 웹 서버가 동적 콘텐츠를 생성하기 위해 외부 프로그램을 실행하는 방식
  • CGI는 서버가 대신 실행해주고, 프로그램은 stdout만 알면 된다.
  • 요청이 오면 웹 서버는:
    1. fork()로 자식 프로세스를 만들고
    2. execve()로 CGI 프로그램 실행
    3. 환경변수 설정을 통해 인자 전달
    4. stdout을 소켓으로 리디렉션해서 결과를 클라이언트에게 전송
      1. dup2(fd, STDOUT_FILENO);

        기존의 1번 파일 디스크립터(STDOUT)지금 열려 있는 fd가 가리키는 곳(예: 클라이언트 소켓)으로 바꾼다

인자 전달 방법 (GET 방식 기준)

  • URL의 ? 뒤가 인자 문자열
    • 예: /cgi-bin/adder?15000&213
  • 서버는 QUERY_STRING 환경 변수에 이 값을 저장

CGI 프로그램의 출력 방식

  • CGI 프로그램은 표준 출력(stdout) 으로 응답을 생성
  • 이 출력은 HTTP 응답 헤더 + 본문 형태로 구성되어야 함
printf("Content-type: text/html\r\n\r\n");
printf("<html> ... </html>");

전체적 흐름 정리?

TCP/IP 통신 구조

계층역할대표 프로토콜
응용 계층내용의 규약 정의 (메시지 의미)HTTP, FTP, SSH
전송 계층데이터를 안정적으로 전송TCP, UDP
인터넷 계층호스트 주소 지정, 경로 결정IP
링크 계층물리적 홉 간 전송Ethernet, Wi-Fi
  • TCP는 바이트 스트림만 신경 씀
  • HTTP는 “그 바이트가 어떤 의미를 가지냐”를 정한 프로토콜

read() / write()는 바이트 단위 추상화

  • read() / write()는 모든 입출력을 바이트 단위로 추상화한 유니버설 인터페이스다.

HTTP, FTP, SMTP 등은 의미 규약

프로토콜의미형식역할
HTTP웹 요청/응답텍스트 기반브라우저-서버
FTP파일 전송명령어 + 데이터 연결파일 업/다운
SMTP이메일 전송텍스트 + 헤더메일 중계
DNS이름 해석바이너리이름 → IP 변환
SSH원격 접속암호화된 명령터미널 접속
  • 응용 계층 프로토콜은 “어떤 데이터를 어떤 형식으로 해석할지”에 대한 규율

11.7 요약

1. 네트워크 애플리케이션의 공통 구조

  • 모든 네트워크 애플리케이션은 클라이언트-서버 모델 기반
  • 서버는 자원을 관리하고, 클라이언트 요청에 따라 자원을 조작하고 응답
  • 기본 단위는 트랜잭션(transaction):
    1. 클라이언트가 요청 보냄
    2. 서버가 해석하고 자원 조작
    3. 서버가 응답 전송
    4. 클라이언트가 응답 처리

2. 클라이언트와 서버는 프로세스 수준에서 동작

  • 클라이언트와 서버는 “호스트”가 아니라 “프로세스” 단위
  • 같은 컴퓨터에 있을 수도 있고, 원격에 있을 수도 있음
  • 1개의 호스트에서 여러 클라이언트/서버가 동시 실행 가능

3. 서버 구현을 위한 기본 개념들

타이니 서버에서 배운 핵심 요소들:

요소역할
socket / bind / listen / acceptTCP 서버 소켓 설정
read / write바이트 단위 통신
fork + execveCGI 등 동적 콘텐츠 처리
dup2stdout 리디렉션 (CGI → 클라이언트로 직접 출력)
mmap정적 파일을 효율적으로 클라이언트로 전송
GETHTTP 요청 처리 (Tiny는 GET만 지원)

4. 정적 콘텐츠 vs 동적 콘텐츠

구분처리 방식
정적 콘텐츠파일을 읽어와서 HTTP 형식으로 응답
동적 콘텐츠자식 프로세스를 포크해서 CGI 실행, stdout을 응답으로 전송

5. CGI 표준 개요

  • CGI는 서버와 외부 프로그램(CGI 스크립트) 간의 데이터 교환 표준
  • 요청 정보는 환경 변수로 전달 (QUERY_STRING)
  • 출력은 stdout으로 → 클라이언트로 바로 전달됨

핵심 요약 3줄

  1. 클라이언트-서버 모델이 모든 네트워크 애플리케이션의 기본 구조다.
  2. 소켓, I/O, fork/exec, 환경 변수, HTTP 파싱이 실제 구현의 핵심이다.
  3. 정적 콘텐츠는 mmap, 동적 콘텐츠는 CGI + dup2 로 처리된다.

Tiny 서버는 최소한의 코드로 HTTP 서버의 구조, 시스템 호출, 소켓 통신, CGI를 전부 구현한 “축소판 리눅스 웹서버”다.

0개의 댓글