이전 강의에서는 CGI 프로그램의 기능을 소개했습니다. 오늘 우리는 CGI 프로그래밍의 개념인 2부로 들어갑니다. 본 강의의 내용은 CGI 프로그램에 대한 심층적인 이해를 위한 기초가 됩니다.
이 강의 시리즈에서는 델파이를 사용하여 CGI 프로그램을 작성합니다. 이 내용을 위해 델파이가 클래스에 포함되어 있습니다. 이 강의가 불필요하다고 생각할 수도 있습니다. 하지만 CGI의 장점 중 하나는 사용 가능한 개발 언어가 많다는 점과(이 문제는 아래에서 언급함), 이 강의의 내용은 모든 프로그래밍 언어(델파이 포함)에서 사용할 수 있다는 점이라고 생각합니다. 그러므로 CGI를 활용하기 위해서는 이 강의의 내용이 여전히 필요하며, 게다가 이 강의의 내용은 CGI 프로그램에 대한 심층적인 이해의 기초가 됩니다.
2. CGI 사양:
일반적으로 WEB 서버는 강력한 컴퓨터이지만 모든 처리 능력을 활용하는 것은 불가능합니다. CGI의 출현으로 사람들은 웹 서버의 처리 능력을 활용하여 흥미롭고 역동적인 콘텐츠를 원격 클라이언트에 제공할 수 있게 되었습니다. CGI 사양은 WEB 서버와 WEB에서 실행되는 애플리케이션에 적용됩니다. 이는 HTTP 프로토콜의 일부는 아니지만 NCSA httpd, CERN httpd, Apache httpd, IIS 및 우리가 사용하는 OmniHTTPD와 같은 대부분의 웹 서버는 이 사양을 지원합니다.
2.1, CGI 개요
CGI는 웹 서버, 브라우저 및 응용 프로그램 간의 상호 운용에서 따르는 일련의 규칙을 정의합니다. 예를 들어 웹 브라우저를 통해 원격 데이터베이스 시스템을 쿼리합니다.
2.2. 언어:
CGI 프로그램은 웹 서버에서 실행될 수 있는 모든 언어로 작성될 수 있습니다. 귀하는 현재 업무에 가장 익숙하고 가장 적합한 언어를 선택해야 합니다. 예를 들어 Perl 언어는 문자열 및 파일 처리에 적합하고 C는 크고 복잡한 프로그램에 더 적합하며 Visual Basic 및 Delphi는 데이터베이스 처리에 적합합니다. 다음은 일반적으로 사용되는 CGI 프로그래밍 언어입니다.
기음
C++
펄
Tcl
파이썬
쉘 스크립트
비주얼 베이직
델파이
애플스크립트
2.3, CGI 방법:
CGI를 호출하는 방식을 CGI 메소드라고 합니다. 세 가지 주요 CGI 방법이 있습니다.
2.3.1, GET 방식:
GET 메소드는 브라우저가 WEB 서버에 요청을 하기 위해 사용하는 메소드입니다. 이 방법을 사용할 때 CGI 프로그램은 환경 변수 QUERY_STRING에서 데이터를 얻습니다. 입력 매개변수를 얻으려면 CGI 프로그램이 이 환경 변수를 분석해야 합니다. 전송할 데이터의 길이가 매우 긴 경우에는 POST 방식을 사용해야 합니다.
2.3.2, POST 방식:
POST 메서드를 사용할 때 CGI 프로그램은 stdin(표준 입력)에서 입력 데이터를 가져옵니다. 입력 데이터 끝에 EOF(End Of File)가 없기 때문에 CGI 프로그램은 입력 데이터를 올바르게 읽으려면 환경 변수 CONTENT_LENGTH 값을 사용해야 합니다. 이 방식을 사용하면 많은 양의 데이터를 전송할 수 있다는 것이 가장 큰 장점인 반면, GET 방식은 URL 길이의 제한(일반적으로 1024바이트 이하)으로 인해 많은 양의 데이터를 전송할 수 없다는 점이다. 현재로서는 POST 메서드가 유일한 옵션입니다.
2.3.3, HEAD 방법:
HEAD 방식은 WEB 서버에서 브라우저로 데이터를 전송한다는 점만 제외하면 기본적으로 GET 방식과 동일합니다. 또한 HTTP 헤더 정보만 전송됩니다.
2.4. 인터페이스 사양:
다음은 웹 서버가 CGI 프로그램과 통신하는 네 가지 주요 방법인 환경 변수, 명령줄, 표준 입력 및 표준 출력을 소개합니다. (CGI 버전 1.1 기준)
2.4.1. 환경 변수:
AUTH_TYPE: 서버가 승인을 지원하고 스크립트가 보호되는 경우 승인 유형을 제공합니다.
CONTENT_LENGTH: POST 메서드를 사용하여 전송된 데이터의 길이를 바이트 단위로 제공합니다. GET 메소드를 사용할 때 변수는 비어 있습니다.
CONTENT_TYPE: POST 메소드를 사용할 때 전송되는 데이터의 MINE 유형을 제공합니다. GET 메소드를 사용할 때 변수는 비어 있습니다. 예: application/x-www-form-urlencoded.
GETWAY_INTERFACE: CGI/1.1과 같은 CGI 사양 이름과 버전 번호를 제공합니다.
PATH_INFO: URL의 CGI 프로그램 이름 뒤에 추가 경로 정보를 제공합니다.
PATH_TRANSLATED: CGI 프로그램의 실제 경로, 일반적으로 WEB 루트 디렉터리, 스크립트 이름 및 추가 경로 정보입니다.
QUERY_STRING: URL에서 "?" 문자 뒤의 정보입니다. 이 환경 변수는 GET 메서드를 사용할 때 입력 데이터를 제공합니다.
REMOTE_ADDR: 요청을 하는 원격 컴퓨터의 IP입니다.
REMOTE_HOST: 요청을 수행하는 원격 컴퓨터의 이름입니다.
REMOTE_IDENT: RFC 931에 정의된 사용자 이름을 제공합니다.
참고: RFC 931은 TCP 연결에서 사용자 식별을 확인하는 방법을 설명하는 권위 있는 인터넷 문서입니다. 문서: http://sunsite.auc.dk/RFC/rfc/rfc931.html.
REMOTE_USER: 요청하는 클라이언트의 승인된 사용자 이름을 제공합니다.
REQUEST_METHOD: 요청을 수행하는 방법으로 GET, HEAD 및 POST가 가능합니다.
SCRIPT_NAME: CGI 프로그램을 실행하기 위한 가상 경로(예: /cgi-bin/query.cgi).
SERVER_NAME: www.chinabyte.com과 같은 웹 서버 소프트웨어를 실행하는 컴퓨터의 도메인 이름 또는 IP 주소입니다.
SERVER_PORT: 웹 서버의 포트 번호, 기본값은 80입니다.
SERVER_PROTOCOL: 웹 서버에서 사용하는 프로토콜 이름 및 버전 번호(예: HTTPD/1.0).
SERVER_SOFTWARE: CGI 프로그램을 실행하는 웹 서버의 이름입니다. 형식은 "서버 이름/버전 번호"입니다(예: NCSA/1.5b5).
HTTP_ACCEPT: 클라이언트가 처리할 수 있는 MIME 유형에 해당하는 "Acccpect: 헤더 라인"(예: */*, image/ 등 "유형/하위 유형, 유형/하위 유형 등" 형식) gif, 이미지/jpeg.
HTTP_REFERER: 예 Referer: http://www.chinabyte.com/register.form과 같이 CGI 요청 시 양식(Form)의 URL을 포함하는 헤더 라인의 디렉토리입니다.
HTTP_USER_AGENT: 요청을 수행한 클라이언트 브라우저의 이름입니다(예: Mozilla/1.2N(Windows;I;32bit)).
이전 강의의 데모 프로그램을 이용하여 위의 환경변수를 확인할 수 있습니다.
2.4.2, 명령줄:
CGI 명령줄은 ISINDEX로 쿼리할 때만 사용됩니다. ISINDEX 쿼리는 <ISINDEX>와 <BASE HREP=".."> 사이에 포함된 특수 쿼리입니다. 명령줄에는 여러 매개변수를 사용할 수 있습니다.
2.4.3. 표준 입력:
POST 메서드를 사용할 때 CGI 프로그램은 stdin에서 전송된 데이터를 가져옵니다. 앞서 언급한 것처럼 CONTENT_TYPE, CONTENT_LENGTH 환경변수 값을 사용해야 합니다. 주목해야 할 점은 공백이 더하기 기호로 대체되거나 ~가 %7E로 대체되는 등 데이터의 URL이 인코딩된다는 것입니다.
2.4.4. 표준 출력:
CGI 프로그램은 표준 출력이나 웹 서버에서 해석할 수 있는 명령을 통해 브라우저에 데이터를 보냅니다. CGI 프로그램은 WEB 서버를 통해 브라우저와 통신할 수 있으며 해당 프로그램 이름은 분석되지 않은 헤더 정보를 나타내는 "nph-"로 시작해야 합니다. CGI 프로그램은 브라우저에 반환된 HTTP 헤더 정보의 정확성을 담당합니다.
nph-프로그램을 사용하지 않을 때 서버는 CGI가 반환할 수 있는 세 가지 특수 헤더를 찾습니다.
Content-type: 다음과 같은 MIME 유형 헤더 정보입니다. HTML을 입력할 때 "Content-type:text/html"이 일반적으로 사용됩니다.
위치: 다른 문서를 가리키고 있음을 서버에 알립니다. 서버는 URL이 전체 경로인지 상대 경로인지에 따라 클라이언트를 리디렉션하거나 문서 콘텐츠를 보냅니다.
상태: 서버에서 클라이언트로 보낸 상태 줄입니다. 형식은 nnnXXXXX이고 nnn은 3자리 코드이며 XXXXX는 해당 설명 텍스트입니다.