본문 바로가기

CS(ComputerScience)

tiny 웹서버 구현

728x90

tiny 웹서버 구현

  • HTTP 프로토콜 지원
  • 정적 & 동적 콘텐츠 전달
  • 버퍼사용한 동기 I/O
  • 다양한 오류 처리
tiny web server mp4 파일 삽입

간단한 web server 구현해보는 과제!
AWS 포트 번호를 열어줘야 했다.
[인스턴스] - [인바운드 규칙 편집]

AWS port 열어주기 출처 : [스파르타코딩클럽 : 웹개발종합반]

DB연결은 해줄 필요 없으니, 8080 포트랑 HTTP 포트만 열어주면 된다.


🔎 HTTP1.1버전을 client가 보내지만, tiny는 HTTP1.0버전을 채택한 이유는?

HTTP 버전 관리

일부 오래도니 서버나 proxysms HTTP/1.1을 지원하지 않아 더 안정적으로 서비스를 지원하기 위해 1.0버전 채택!
낮은 버전을 채택함으로서 오버헤드를 줄일 수 있다.
 

🔎 HTTP/1.0과 HTTP/1.1 차이점

HTTP/1.0 : 1996년부터 사용되고 있는 초기의 보다 간단한 버전이다. 1 GET / 1 Connection
HTTP/1.1 :  캐싱과 보안, 클라이언트와 서버가 동일한 지속적인 연결 위에 다중 트랜잭션을 수행할 수 있도록 하는 메커니즘 같은 고급 기능들을 지원하는 추가적인 헤더를 정의하고 있다. N GET / 1 Connection
 


🔎 QUERY STRING

키 - 값 쌍 집합으로 서버에 전달되는 데이터를 포함하는 URL(Uniform Resource Locator)의 일부
클라이언트와 웹 서버간에 데이터를 전달하는 데 사용되며 일반적으로 검색기능, 결과 필터링, 매개변수 전달에 사용된다.

qeury string

(Query String, GET 요청, key(news) = Value(11))
http://example/data/topic?news=11 
 
( param값 이용, path 인자 방식, key(news) = Value(11)) → 단순 하나 조회
http://example/data/topic/news/11
 
 

🔎 CGI란? 

Common Gateway Interface
웹 서버에서 동적인 웹 페이지를 생성하기 위한 방법 중 하나로, 웹 서버와 웹 애플리케이션 또는 스크립트 간에 데이터를 주고 받을 수 있도록 지원해 준다.

CGI

📄 tiny.c

/* 동적 콘텐츠을 처리하여 클라이언트에게 응답을 보내는 함수 */
void serve_dynamic(int fd, char *filename, char *cgiargs, int method_flag)
{
  char buf[MAXLINE], *emptylist[] = { NULL };

  /* Return first part of HTTP response */
  sprintf(buf,"HTTP/1.0 200 OK\r\n");
  Rio_writen(fd, buf, strlen(buf));
  sprintf(buf, "Server: Tiny Web Server\r\n");
  Rio_writen(fd, buf, strlen(buf));

  /* fork() 새로운 프로세스를 생성하는 시스템 호출 함수 */
  if (Fork() == 0) { /* Child */
    /* Real server would set all CGI vars here */
    if (method_flag) setenv("REQUEST_METHOD", cgiargs, 1); /* 환경 변수 설정 */
    setenv("QUERY_STRING", cgiargs, 1);

    Dup2(fd, STDOUT_FILENO); /* Redirect stdout to client */
    Execve(filename, emptylist, environ); /* Run CGI program */
  }
  Wait(NULL); /* Parent waits for and reaps child */
}

🔎 HEAD method란?

리소스 요청 전, 리소스의 메타 데이터를 검사하고자 할 때 유용.
GET method와 유사하지만, Server는 응답 본문을 반환하지 않고 오직 상태 헤더만 반환!
Client는 Server로 부터 리소스의 메타데이터를 얻을 수 있지만, 실제 컨텐츠는 전송되지 않음.
실제 리소스를 다운로드하지 않아도 되기 때문에 대역폭이 절약된다.
사용자가 대량의 데이터를 다운로드 하기 전에 먼저 해당 데이터가 존재하고 적절한 크기를 가지고 있는지 확인할 수 있는 도구.
 

🔎 Telnet이란?

어플리케이션 계층으로, HTTP 통신할때 클라이언트 프로그램을 구현하기 전에 테스트를 위해 사용!
telnet을 이용해 원격 시스템에 접속해 HTTP 요청 메세지를 수동으로 보내고 응답을 확인하는 것이 유용.
 
Telnet : GET method

telnet GET

 
Telnet : HEAD method

telnet HEAD

 

'CS(ComputerScience)' 카테고리의 다른 글

Pintos File System  (0) 2023.05.31
Pintos, Virtual Memory  (0) 2023.05.23
Network, 통신 Model  (0) 2023.04.19
명시적 가용 리스트 Explicit Free List  (0) 2023.04.13
묵시적 가용 리스트 Implicit Free List  (1) 2023.04.12