{{위키데이터 속성 추적}}
[[파일:CGI common gateway interface.svg|섬네일]]
'''공용 게이트웨이 인터페이스'''({{llang|en|Common Gateway Interface}}; '''CGI''')는 [[웹 서버]] 상에서 사용자 [[컴퓨터 프로그램|프로그램]]을 동작시키기 위한 조합이다. 존재하는 많은 웹 서버 프로그램은 CGI의 기능을 이용할 수 있다.

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

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

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

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

== 역사 ==
1993년 [[NCSA]] 팀은 www-talk 메일링 리스트의 명령 줄 실행 파일을 호출하는 사양을 작성하였으나<ref>[http://1997.webhistory.org/www.lists/www-talk.1993q4/0485.html ''Server Scripts'', by Rob McCool, ''www-talk'' mailing list, Sun, 14 Nov 1993 19:24:47 -0600]</ref> NCSA는 더 이상 이 사양을 호스팅하지 않고 있다.<ref>{{인용 |title=The Common Gateway Interface |url=http://hoohoo.ncsa.uiuc.edu/cgi/ |archiveurl=https://web.archive.org/web/20100127161358/http://hoohoo.ncsa.illinois.edu/cgi/ |archivedate=2010-01-27}}</ref><ref>[http://www.w3.org/CGI/ CGI: Common Gateway Interface] at w3.org</ref> 기타 웹 서버 개발자들이 이를 수용하였고 그 이후로 웹 서버의 표준으로 자리잡고 있다. [[Ken Coar]]가 주도하는 워크 그룹이 1997년 11월 시작되어 CGI의 NCSA 정의가 공식적으로 확립되었다.<ref>{{웹 인용 |url=http://ken.coar.org/cgi/ |title=Common Gateway Interface RFC Project Page |archiveurl=https://web.archive.org/web/20130825202222/http://ken.coar.org/cgi/ |archivedate=2013-08-25}}</ref> 이를 통해 RFC 3875 사양이 탄생되었으며 이는 CGI 버전 1.1을 기술한다.

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

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

== 사양 ==
CGI의 사양은 [[NCSA]]에 의해 최초로 정의 ([[NCSA HTTPd]]에 있음) 되어, 현재의 최신판은 CGI1.1이다.<ref>{{웹 인용 |url=http://hoohoo.ncsa.uiuc.edu/cgi/interface.html |제목=보관된 사본 |확인날짜=2007년 8월 9일 |보존url=https://web.archive.org/web/20070809114039/http://hoohoo.ncsa.uiuc.edu/cgi/interface.html |보존날짜=2007년 8월 9일 |url-status=dead }}</ref> 2004년에[[Request for Comments|RFC]] 3875이 되었다.<ref>{{웹 인용 |url=http://www.ietf.org/rfc/rfc3875.txt |제목=보관된 사본 |확인날짜=2009-07-16 |보존url=https://web.archive.org/web/20090529081353/http://www.ietf.org/rfc/rfc3875.txt |보존날짜=2009-05-29 |url-status=dead }}</ref>

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을 출력하는 경우가 압도적으로 많다.
** 영상 데이터 등을 출력하는 것도 있다. (이것은 [[엑세스 카운터]] 등을 조작할 때에 사용된다.)

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

<syntaxhighlight lang="perl">
#!/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};
}
</syntaxhighlight>

== 각주 ==
{{각주}}

== 외부 링크 ==
{{위키공용분류}}
* The [http://www.w3.org/CGI/ CGI standard] at w3.org.
* The [https://web.archive.org/web/20021003125844/http://hoohoo.ncsa.uiuc.edu/cgi/ CGI/1.1 specification].
* [https://web.archive.org/web/20070809114039/http://hoohoo.ncsa.uiuc.edu/cgi/interface.html The CGI Specification]
* [https://web.archive.org/web/20090529081353/http://www.ietf.org/rfc/rfc3875.txt RFC3875 The Common Gateway Interface (CGI) Version 1.1]
* [https://web.archive.org/web/20090531175328/http://www.ietf.org/rfc/rfc1630.txt RFC1630 Universal Resource Identifiers in WWW]
* [https://web.archive.org/web/20050703011719/http://www.ietf.org/rfc/rfc2616.txt RFC2616 Hypertext Transfer Protocol -- HTTP/1.1]

{{웹 인터페이스}}

{{전거 통제}}

[[분류:서버]]
[[분류:웹 기술]]
[[분류:월드 와이드 웹]]
[[분류:웹 1.0]]