HTTP(Hypertext Transfer Protocol)
웹에서 웹 클라이언트(브라우저)와 웹 서버가 서로 정보를 주고 받을 수 있는 응용 계층의 프로토콜 중 하나로 TCP/IP 프로토콜을 이용한다. 이때, HTTP는 이미지, 텍스트, 오디오 등 여러 가지 유형의 데이터들을 주고 받을 수 있는데, 이런 웹 컨텐츠는 MIME 타입으로 인코딩된다.
MIME타입(Multipurpose Internet Mail Extensions)
웹 서버에서 전송되는 여러 종류의 컨텐츠 유형들을 전달하기 위해 필요한 매커니즘이다. 다음과 같은 역할을 한다.
- 바이너리 파일의 송수신 : 웹은 텍스트 파일 뿐만 아니라 여러 바이너리 파일(오디오, 이미지, 비디오 등)을 전송하기도 한다. 이런 바이너리 파일들을 문제없이 전달하기 위해 파일을 MIME 타입 텍스트파일로 인코딩한다.
- 데이터의 유형 명시(Content-type) : 클라이언트와 서버는 주고받는 데이터 본체의 MIME 타입을 통해 데이터가 어떤 유형인지 파악하고, 어떻게 데이터를 해석할지를 결정한다.
- Content-Type : HTTP 요청, 응답 메시지의 헤더중에는 MIME 타입으로 표현된 Content-Type 헤더라는 것이 있다. 이 HTTP 메시지의 바디 데이터를 상대가 어떤 MIME 타입으로 해석해야 할지를 알려준다.
HTTP Transaction
웹 클라이언트와 서버는 요청과 응답의 형태로 리소스를 주고받는다. 이런 요청과 응답은 HTTP 메시지라는 형식을 통해 이루어진다.
HTTP 요청
<method><uri><version>의 형태를 가진다.
- method : 서버가 어떤 동작을 해야 하는지를 정해준다. 예를들어, GET method는 서버에서 클라이언트로 지정한 리소스를 보내라는 뜻이다.
- uri : 브라우저가 컨텐츠를 요청할 때 해당 리소스의 URL 뒤의 suffix
- version : 요청이 어떤 HTTP version으로 포맷되어 있을지를 말해준다.
요청 헤더는 host 서버의 도메인 네임이 포트를 포함하여 나타나는 부분이다.
HTTP 응답
응답 라인과 응답 헤더로 나뉜다.
응답 라인은 <version><status code><status message>의 형태를 가지고, 응답 헤더는 Conten-Type과 Content-length를 알려준다.
동적 컨텐츠의 처리
클라이언트가 요청을 보낼 때, 어떤 인자를 서버에 같이 보내면 서버가 그 인자에 맞는 응답을 할 수 있는데, 이를 동적 컨텐츠라고 한다.
CGI(Common Gateway Interface)
CGI는 웹 서버에서 동적인 페이지를 보여주기 위한 임의의 자식 프로세스를 실행할 수 있게 해준다. 즉, 본래 웹 서버는 서버에 저장되어 있는 고정된 문서를 보여주는 정적 컨텐츠 방식으로만 동작한다. 하지만 데이터베이스 조회, 정보 기록, 로직 처리 등의 요청을 수행하기 위해서는 웹 서버만으로는 할 수 없었다. 대신에 웹 서버가 특정 URL로 들어가서 클라이언트의 요청을 특정한 프로그램에 넘겨줘서 이런 작업들을 수행할 수 있게 되었는데, 이 기술이 바로 CGI이다.
작동 방식
클라이언트가 서버에 프로그램 인자를 전달하는 방법
GET 요청을 위한 인자들을 URI의 ?과 &로 전달한다. 예를들면, GET /cgi-bin/adder?15000&213 HTTP/1.1과 같은 형태이다.
서버가 이 인자들을 임의의 프로세스에 전달하는 방법
- 요청을 받으면 fork() 시스템 콜을 통해서 자식 프로세스를 생성한다.
- 자식 프로세스가 CGI 환경변수 QUERY_STRING을 인자 "15000&213"으로 설정한다.
- 서버가 execve() 시스템 콜을 호출해서 /cgi-bin/adder 프로그램을 자식 프로세스의 컨텍스트에서 실행한다.
- adder 프로그램이 런타임에 getenv()를 사용해서 그 환경 변수의 값을 참조한다.
서버가 자식 프로세스에 정보를 전달하는 방법
자식 프로그램이 실행될 때, 환경 변수에 값이 지정되어 있어야 한다.
자식 프로세스가 출력을 내보내는 방법
CGI 프로그램은 자신의 컨텐츠를 표준 출력으로 내보낸다.
- dup2 함수를 이용해서 CGI 프로세스의 표준 출력으로 클라이언트와 연결된 서버의 소켓 연결 식별자를 지정한다. 그러면 표준 출력으로 CGI가 쓰는 것들이 모두 클라이언트로 가게 된다.
- 자식 프로세스가 응답 헤더의 Content-type과 Content-length, 헤더 종료 빈칸까지 만들어준다.
'컴퓨터 사이언스 > Network' 카테고리의 다른 글
proxy 서버 만들기 (0) | 2023.11.21 |
---|---|
tiny 서버 만들기 (0) | 2023.11.20 |
호스트와 서비스 변환 (0) | 2023.11.19 |
echo 클라이언트와 서버 (0) | 2023.11.19 |
소켓 인터페이스를 위해 도움을 주는 함수들 (0) | 2023.11.19 |