공용 게이트웨이 인터페이스

공용 게이트웨이 인터페이스(; CGI)는 웹 서버 상에서 사용자 프로그램을 동작시키기 위한 조합이다. 존재하는 많은 웹 서버 프로그램은 CGI의 기능을 이용할 수 있다.

웹 서버 프로그램의 기능의 주체는 미리 준비된 정보를 이용자(클라이언트)의 요구에 응답해 보내는 것이다. 그 때문에 서버 프로그램 그룹에서는 정보를 그 장소에서 동적으로 생성하고 클라이언트에 송신하려하는 조합을 작성하는 것이 불가능했다. 서버 프로그램에서 다른 프로그램을 불러내고, 그 처리 결과를 클라이언트에 송신하는 방법이 고안되었다. 이를 실현하기 위한 서버 프로그램과 외부 프로그램과의 연계법을 정한 것이 CGI이다.

CGI는 환경변수나 표준입출력을 다룰 수 있는 프로그램 언어에서라면 언어의 구별을 묻지 않고 확장하여 이용하는 것이 가능하나, 실행속도나 텍스트 처리의 용이함 등의 균형에 의해 펄이 사용되는 경우가 많았다. 최근에는 펄뿐 아니라 파이썬, 루비 등도 널리 쓰이고 있다.

대표적인 애플리케이션에는 전자게시판, 접속 카운터, 위키나 블로그 시스템 등이 있다.

근래에는 웹 서버의 프로세스로서 인터프리터를 상주시킴으로써, CGI로부터 프로그램을 호출해 부하를 줄임으로써 성능을 개선한 자바 서블릿이나 mod perl, mod php, FastCGI 등도 공개되었다.

역사 
1993년 NCSA 팀은 www-talk 메일링 리스트의 명령 줄 실행 파일을 호출하는 사양을 작성하였으나 NCSA는 더 이상 이 사양을 호스팅하지 않고 있다. 기타 웹 서버 개발자들이 이를 수용하였고 그 이후로 웹 서버의 표준으로 자리잡고 있다. Ken Coar가 주도하는 워크 그룹이 1997년 11월 시작되어 CGI의 NCSA 정의가 공식적으로 확립되었다. 이를 통해 RFC 3875 사양이 탄생되었으며 이는 CGI 버전 1.1을 기술한다.

CGI에 관한 자주 있는 오해 
이름에서 알 수 있듯이, CGI는 어디까지나 인터페이스이며, 특정 플랫폼에 의존하지 않고, 웹 서버 등으로부터 외부 프로그램을 호출하는 조합을 가리킨다.

그러므로 그 조합을 사용하여 기동되는 프로그램 본체를 CGI로 호칭하는 것은 잘못된 것이다. 또, 1990년대 후반의 CGI를 사용한 프로그램은 펄이 대부분인 까닭에 CGI와 펄, 또는 그것에 속하는 특정 언어라는 인식도 널리 퍼져 있으나, 이것도 잘못된 인식이다.

사양 
CGI의 사양은 NCSA에 의해 최초로 정의 (NCSA HTTPd에 있음) 되어, 현재의 최신판은 CGI1.1이다. 2004년에RFC 3875이 되었다.

CGI는 전형적으로는 아래와 같은 동작이 기대된다. CGI를 경유해 실행되는 프로그램을 CGI 프로그램이라고 부른다.

 CGI 프로그램은 웹 서버가 클라이언트로부터 요청에 응답해 동작한다.
 전형적으로는 웹 서버의 공개 영역에 설치된 프로그램에 대응하는 URI으로 요청이 있으면, 서버는 그 프로그램을 CGI의 결정에 따라 호출한다.
 CGI 프로그램으로의 정보 입력은 명령줄 인수, 환경변수, 표준입력에 의해 이루어진다.
 웹 서버가 프로그램을 호출하는 시점에서 얼마의 환경변수를 정의하는 것이 결정된다.
 특히, 클라이언트가 서버에 요구한 URI의 안, 검색문자열(Query String)이 환경변수 QUERY_STRING 에 설정되기 때문에, 그것은 HTML 폼에서 GET 메서드로 입력을 받는 것이 편리하다.
 QUERY_STRING에 문자'='가 포함되어 있지 않은 경우에, 서버는 QUERY_STRING의 내용을 커맨드라인 인수로서 CGI 프로그램을 넘긴다. 이것은 HTML의 ISINDEX 요소를 이용하여 송신된 정보를 다루는데 편리하다.
 클라이언트에서의 HTTP요청 BODY부분은 CGI 프로그램 표준입력에 들어간다. 또, 그 입력의 길이가 환경변수 CONTENT_LENGTH에 설정되어 있다. 그것은 HTML 폼에서 POST메서드로 입력을 받는 것이 편리하다.
 CGI 프로그램에 대응하는 가상 패스 후에, 더욱이 여분의 패스가 계속 이어진 경우 그 정보는 환경변수 PATH_INFO에 격납(格納)되어 PATH_INFO를 웹 서버의 가상 패스로 해석한 때에 대응해야 하는 물리 패스가 환경변수 PATH_TRANSLATED 에 격납된다. 이 방식도 CGI 프로그램에 사용자 측으로부터 변수를 전하는 목적에 자주 사용된다.
 프로그램이 표준입력에 출력된 데이터는 웹 서버를 경우한 클라이언트에 보내진다. 이 데이터는 정당한 HTTP헤더로 시작하지 않으면 안 된다.
 단, 몇 개의 특별한 헤더 필드는「서버 디렉티브」로 해석되어, 웹 서버의 거동 (상태 코드 등) 에 환경을 부여한다. 그 밖의 모든 헤더 필드는 그 상태 그대로 클라이언트에 송신된다.
 현재의 WWW에서는 HTML이 중심적인 역할을 하고 있어, CGI 프로그램은 HTML을 출력하는 경우가 압도적으로 많다.
 영상 데이터 등을 출력하는 것도 있다. (이것은 엑세스 카운터 등을 조작할 때에 사용된다.)

예 
다음의 펄 프로그램은 웹 서버로 전달되는 모든 환경 변수를 보여준다:

#!/usr/bin/perl

=head1 DESCRIPTION

printenv — 환경을 출력만 하는 CGI 프로그램

=cut
print "Content-type: text/plain\n\n";

for my $var ( sort keys %ENV ) {
 printf "%s = \"%s\"\n", $var, $ENV{$var};
}

각주

외부 링크 
 The CGI standard at w3.org.
 The CGI/1.1 specification.
 The CGI Specification
 RFC3875 The Common Gateway Interface (CGI) Version 1.1
 RFC1630 Universal Resource Identifiers in WWW
 RFC2616 Hypertext Transfer Protocol -- HTTP/1.1

서버
웹 기술
월드 와이드 웹
웹 1.0