<!DOCTYPE html SYSTEM "about:legacy-compat">
<html lang="ko"><head><META http-equiv="Content-Type" content="text/html; charset=EUC-KR">
<meta content="width=device-width, initial-scale=1" name="viewport">
<!--
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
              This file is generated from xml source: DO NOT EDIT
        XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
      -->
<title>아파치 투토리얼: CGI를 사용한 동적 페이지 생성 - Apache HTTP Server Version 2.4</title>
<link href="../style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet">
<link href="../style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size">
<link href="../style/css/manual-print.css" rel="stylesheet" media="print" type="text/css"><link rel="stylesheet" type="text/css" href="../style/css/prettify.css">
<script src="../style/scripts/prettify.min.js">
</script>

<link href="../images/favicon.png" rel="shortcut icon"></head>
<body id="manual-page"><div id="page-header">
<p class="menu"><a href="../mod/">모듈</a> | <a href="../mod/quickreference.html">지시어들</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">FAQ</a> | <a href="../glossary.html">용어</a> | <a href="../sitemap.html">사이트맵</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Report a bug</a></p>
<p class="apache">Apache HTTP Server Version 2.4</p>
<img alt="" src="../images/feather.png"></div>
<div class="up"><a href="./"><img title="<-" alt="<-" src="../images/left.gif"></a></div>
<div id="path">
<a href="https://www.apache.org/">Apache</a> &gt; <a href="https://httpd.apache.org/">HTTP Server</a> &gt; <a href="https://httpd.apache.org/docs/">Documentation</a> &gt; <a href="../">Version 2.4</a> &gt; <a href="./">How-To / Tutorials</a></div><div id="page-content"><div id="preamble"><h1>아파치 투토리얼: CGI를 사용한 동적 페이지 생성</h1>
<button aria-label="Toggle language list" class="lang-toggle"><svg xmlns="http://www.w3.org/2000/svg" stroke-width="2" stroke="currentColor" fill="none" viewBox="0 0 24 24" height="16" width="16"><circle r="10" cy="12" cx="12"/><line y2="12" x2="22" y1="12" x1="2"/><path d="M12 2a15.3 15.3 0 0 1 4 10 15.3 15.3 0 0 1-4 10 15.3 15.3 0 0 1-4-10 15.3 15.3 0 0 1 4-10z"/></svg></button>
<div class="toplang">
<p><span>가능한 언어: </span><a href="../en/howto/cgi.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="../es/howto/cgi.html" hreflang="es" rel="alternate" title="Espa&ntilde;ol">&nbsp;es&nbsp;</a> |
<a href="../fr/howto/cgi.html" hreflang="fr" rel="alternate" title="Fran&ccedil;ais">&nbsp;fr&nbsp;</a> |
<a href="../ja/howto/cgi.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
<a href="../ko/howto/cgi.html" title="Korean">&nbsp;ko&nbsp;</a></p>
</div>
<div class="outofdate">이 문서는 최신판 번역이 아닙니다.
            최근에 변경된 내용은 영어 문서를 참고하세요.</div>
</div>
<div id="quickview"><ul id="toc"><li><img alt="" src="../images/down.gif"> <a href="#intro">소개</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#configuring">CGI를 허용하도록 아파치 설정하기</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#writing">CGI 프로그램 작성하기</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#troubleshoot">그러나 아직 동작하지 않아요!</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#behindscenes">뒤에서는 무슨 일이 벌어지는가?</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#libraries">CGI 모듈/라이브러리</a></li>
<li><img alt="" src="../images/down.gif"> <a href="#moreinfo">더 많은 정보...</a></li>
</ul></div>
<div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="intro">소개 <a title="Permanent link" href="#intro" class="permalink">&para;</a></h2>
    

    <table class="related"><tr><th>관련된 모듈</th><th>관련된 지시어</th></tr><tr><td><ul><li><code class="module"><a href="../mod/mod_alias.html">mod_alias</a></code></li><li><code class="module"><a href="../mod/mod_cgi.html">mod_cgi</a></code></li></ul></td><td><ul><li><code class="directive"><a href="../mod/mod_mime.html#addhandler">AddHandler</a></code></li><li><code class="directive"><a href="../mod/core.html#options">Options</a></code></li><li><code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code></li></ul></td></tr></table>

    <p>CGI (Common Gateway Interface)는 웹서버가 보통 CGI 프로그램
    혹은 CGI 스크립트라고 부르는, (웹페이지 내용을 만드는) 외부
    프로그램과 통신하는 방법을 정의한다. 웹사이트에서 동적인
    페이지를 만드는 가장 흔하고 간단한 방법이다. 이 문서는 아파치
    웹서버에 CGI를 구성하는 방법을 소개하고, CGI 프로그램을
    작성해본다.</p>
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="configuring">CGI를 허용하도록 아파치 설정하기 <a title="Permanent link" href="#configuring" class="permalink">&para;</a></h2>
    

    <p>CGI 프로그램이 올바로 동작하려면 CGI 실행이 가능하도록
    아파치를 설정해야 한다. 설정하는 방법은 여러가지다.</p>

    <h3 id="scriptalias">ScriptAlias</h3>
      

      <p><code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
      지시어를 사용하면 아파치는 특정 디렉토리를 CGI 프로그램용으로
      둔다. 아파치는 이 디렉토리에 있는 모든 파일이 CGI
      프로그램이라고 가정하여 클라이언트가 자원을 요청하면 자원을
      실행하려고 시도한다.</p>

      <p><code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>
      지시어는 다음과 같이 사용한다.</p>

      <div class="example"><p><code>
        ScriptAlias /cgi-bin/ /usr/local/apache2/cgi-bin/
      </code></p></div>

      <p>위 예제는 아파치를 기본 장소에 설치한 경우
      <code>httpd.conf</code> 설정파일에 있는 내용이다. <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code> 지시어는 <code class="directive"><a href="../mod/mod_alias.html#alias">Alias</a></code> 지시어와 같이 URL
      앞부분을 특정 디렉토리로 대응한다.
      <code class="directive">Alias</code>와
      <code class="directive">ScriptAlias</code>는 보통 <code class="directive"><a href="../mod/core.html#documentroot">DocumentRoot</a></code> 디렉토리 밖에 있는
      디렉토리에 사용한다. <code class="directive">Alias</code>와
      <code class="directive">ScriptAlias</code>의 차이점은
      <code class="directive">ScriptAlias</code>가 추가로 URL 앞부분으로
      시작하는 모든 파일을 CGI 프로그램으로 취급하는 점이다.
      그래서 위의 설정은 아파치에게 <code>/cgi-bin/</code>으로
      시작하는 자원을 요청하면
      <code>/usr/local/apache2/cgi-bin/</code> 디렉토리에서
      찾아서 CGI 프로그램으로 처리하라고 알린다.</p>

      <p>예를 들어, URL
      <code>http://www.example.com/cgi-bin/test.pl</code>을
      요청하면 아파치는
      <code>/usr/local/apache2/cgi-bin/test.pl</code> 파일을
      실행하여 결과를 반환한다. 물론 파일이 존재하고 실행가능하며
      어떤 방법으로든 출력을 해야 한다. 그렇지 않으면 아파치는
      오류문을 보낸다.</p>
    

    <h3 id="nonscriptalias">ScriptAlias 디렉토리 밖에 있는 CGI</h3>
      

      <p>보통 보안상 이유때문에 CGI 프로그램은 <code class="directive"><a href="../mod/mod_alias.html#scriptalias">ScriptAlias</a></code>한 디렉토리에
      한정한다. 그래서 관리자는 누가 CGI 프로그램을 사용할 수
      있는지 엄격히 감독할 수 있다. 그러나 적당한 보안조치를
      취했다면 아무 디렉토리에서나 CGI 프로그램을 실행하지 않을
      이유가 없다. 예를 들어, <code class="directive"><a href="../mod/mod_userdir.html#userdir">UserDir</a></code> 지시어를 사용하여
      사용자가 자신의 홈디렉토리에 웹페이지를 가지는 경우를
      가정하자. 사용자가 자신의 CGI 프로그램을 사용하고 싶은데
      <code>cgi-bin</code> 디렉토리에 접근권한이 없다면, 다른
      곳에서라도 CGI 프로그램을 실행하고 싶을 것이다.</p>

      <p>아무 디렉토리에서나 CGI 실행을 허용하려면 두 과정이
      필요하다. 먼저, <code class="directive"><a href="../mod/mod_mime.html#addhandler">AddHandler</a></code>나 <code class="directive"><a href="../mod/core.html#sethandler">SetHandler</a></code> 지시어를 사용하여
      <code>cgi-script</code> 핸들러를 작동해야 한다. 두번째로,
      <code class="directive"><a href="../mod/core.html#options">Options</a></code> 지시어에
      <code>ExecCGI</code>를 지정해야 한다.</p>
    

    <h3 id="options">Options를 사용하여 명시적으로 CGI 실행을 허용하기</h3>
      

      <p>서버의 주설정파일에 직접 <code class="directive"><a href="../mod/core.html#options">Options</a></code> 지시어를 사용하여 특정
      디렉토리에서 CGI 실행을 허용할 수 있다.</p>

      <div class="example"><p><code>
        &lt;Directory /usr/local/apache2/htdocs/somedir&gt;<br>
        <span class="indent">
          Options +ExecCGI<br>
        </span>
        &lt;/Directory&gt;
      </code></p></div>

      <p>위 지시어로 아파치는 CGI 파일의 실행을 허용한다. 어떤
      파일이 CGI 파일인지도 서버에게 알려야 한다. 다음 <code class="directive"><a href="../mod/mod_mime.html#addhandler">AddHandler</a></code> 지시어는 서버에게
      확장자가 <code>cgi</code>나 <code>pl</code>인 파일은 모두
      CGI 프로그램이라고 알린다.</p>

      <div class="example"><p><code>
        AddHandler cgi-script .cgi .pl
      </code></p></div>
    

    <h3 id="htaccess">.htaccess 파일</h3>
      

      <p><a href="htaccess.html"><code>.htaccess</code> 투토리얼</a>은
      <code>httpd.conf</code>에 접근권한이 없는 경우에 CGI 프로그램을
      사용할 수 있는 방법을 알려준다.</p>
    

    <h3 id="userdir">사용자 디렉토리</h3>
      

      <p>아래 설정을 사용하면 사용자 디렉토리에서 <code>.cgi</code>로
      끝나는 파일을 CGI 프로그램으로 실행한다.</p>

      <div class="example"><p><code>
      &lt;Directory /home/*/public_html&gt;<br>
      <span class="indent">
        Options +ExecCGI<br>
        AddHandler cgi-script .cgi<br>
      </span>
      &lt;/Directory&gt;
      </code></p></div>

      <p>다음을 사용하면 사용자 디렉토리의 <code>cgi-bin</code>
      하위디렉토리에 있는 모든 파일을 CGI 프로그램으로 인식한다.</p>

      <div class="example"><p><code>
      &lt;Directory /home/*/public_html/cgi-bin&gt;<br>
      <span class="indent">
        Options ExecCGI<br>
        SetHandler cgi-script<br>
      </span>
      &lt;/Directory&gt;
      </code></p></div>

    

  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="writing">CGI 프로그램 작성하기 <a title="Permanent link" href="#writing" class="permalink">&para;</a></h2>
    

    <p>``일반적인'' 프로그래밍과 CGI 프로그래밍 사이에는 두가지
    주된 차이점이 있다.</p>

    <p>첫번째 차이는 CGI 프로그램은 다른 출력을 하기전에 먼저
    MIME-type 헤더를 출력해야 한다는 점이다. HTTP 헤더는
    클라이언트에게 클라이언트가 어떤 내용을 받게될지 미리 알린다.
    보통 다음과 같다.</p>

    <div class="example"><p><code>
      Content-type: text/html
    </code></p></div>

    <p>두번째 차이는 HTML 혹은 브라우저가 보여줄 수 있는 형식으로
    출력해야 한다는 점이다. 대부분의 경우 HTML을 출력하지만,
    때때로 gif 그림과 같이 HTML이 아닌 내용을 출력하는 CGI
    프로그램을 작성하는 경우도 있다.</p>

    <p>두가지를 제외하고는 CGI 프로그램 작성은 이미 만들어 보았을
    다른 프로그램들과 매우 비슷하다.</p>

    <h3 id="firstcgi">처음으로 만든 CGI 프로그램</h3>
      

      <p>다음은 브라우저에 한 줄을 찍는 CGI 프로그램 예제다.
      그대로 <code>first.pl</code>이라는 파일에 저장하고,
      <code>cgi-bin</code> 디렉토리에 복사한다.</p>

      <div class="example"><p><code>
        #!/usr/bin/perl<br>
        print "Content-type: text/html\n\n";<br>
        print "Hello, World.";
      </code></p></div>

      <p>Perl에 익숙하지 않더라도 무슨 일이 일어나는지 알 수
      있다. 첫번째 줄은 아파치(혹은 사용하는 쉘)에게
      <code>/usr/bin/perl</code> 위치에 있는 인터프리터을 사용하여
      이 프로그램 파일을 실행하라고 알린다. 두번째 줄은 방금
      말한 content-type 선언을 출력하고 carriage-return 줄바꿈을
      두번 출력한다. 그러면 헤더 뒤에 HTTP 헤더의 끝을 뜻하는
      빈줄이 생기고, 본문이 시작한다. 세번째 줄은 "Hello, World."
      문자열을 출력한다. 이것으로 끝이다.</p>

      <p>브라우저를 실행하고 주소를 입력한다</p>

      <div class="example"><p><code>
        http://www.example.com/cgi-bin/first.pl
      </code></p></div>

      <p>파일 장소를 입력하면, 브라우저창에 <code>Hello, World.</code>
      한 줄이 보인다. 흥분되지는 않지만, 한번 동작하는 것을
      보았으니 이제 다른 것을 시도해 볼 수 있다.</p>
    
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="troubleshoot">그러나 아직 동작하지 않아요! <a title="Permanent link" href="#troubleshoot" class="permalink">&para;</a></h2>
    

    <p>웹에서 CGI 프로그램에 접근할때 브라우저에 나올 수 있는
    내용은 기본적으로 네가지다.</p>

    <dl>
      <dt>CGI 프로그램의 출력</dt>
      <dd>좋다! 모든 것이 잘 동작한다는 뜻이다. 출력은 정확하지만
      브라우저가 올바로 처리하지 못한다면, CGI 프로그램에서
      올바른 <code>Content-Type</code>을 설정하였는지 확인한다.</dd>

      <dt>CGI 프로그램 소스코드 혹은 "POST Method Not Allowed"
      문구</dt>
      <dd>CGI 프로그램을 실행하도록 아파치를 적절히 설정하지
      않았다는 뜻이다. <a href="#configuring">아파치 설정하기</a>
      절을 다시 읽고 빼먹은 부분이 있는지 찾아봐라.</dd>

      <dt>"Forbidden"으로 시작하는 문구</dt>
      <dd>권한 문제가 있다는 뜻이다. <a href="#errorlogs">아파치
      오류 로그</a>와 아래 <a href="#permissions">파일권한</a>
      절을 확인하라.</dd>

      <dt>"Internal Server Error"라는 문구</dt>
      <dd><a href="#errorlogs">아파치 오류 로그</a>를 보면 아마도
      CGI 프로그램이 출력한 오류문과 함께 "Premature end of
      script headers"가 보일 것이다. 이 경우 아래 내용들을 하나씩
      확인하여 어떤 이유로 CGI 프로그램이 적절한 HTTP 헤더를
      출력하지 못했는지 알아본다.</dd>
    </dl>

    <h3 id="permissions">파일권한</h3>
      

      <p>서버는 당신과 동일한 계정으로 동작하지 않음을 명심하라.
      즉, 서버가 시작하면 서버는 비특권 사용자 권한(보통
      <code>nobody</code>나 <code>www</code>)으로 동작한다.
      그래서 당신이 소유한 파일을 실행하려면 권한이 필요하다.
      파일에 <code>nobody</code>가 실행하기에 충분한 권한을
      주기위해 보통 모두에게 파일의 실행 권한을 준다.</p>

      <div class="example"><p><code>
        chmod a+x first.pl
      </code></p></div>

      <p>또, 프로그램이 다른 파일을 읽거나 쓴다면 이 파일에도
      적절한 권한이 필요하다.</p>

    

    <h3 id="pathinformation">경로 정보와 환경</h3>
      

      <p>명령행에서 프로그램을 실행하면 자동으로 어떤 정보가
      쉘로 전달된다. 예를 들어, <code>PATH</code>는 쉘에게 당신이
      말한 파일을 찾을 장소를 알려준다.</p>

      <p>웹서버가 프로그램을 CGI 프로그램으로 실행할때는
      <code>PATH</code>가 다를 수 있다. (예를 들어,
      <code>sendmail</code> 같이) CGI 프로그램 안에서 실행하는
      명령어는 완전한 경로로 명시해야 쉘이 명령어를 찾을 수
      있다.</p>

      <p>경로 문제는 다음과 같이 CGI 프로그램 첫번째 줄에 나오는
      스크립트 인터프리터 (보통 <code>perl</code>) 경로에서
      자주 발생한다.</p>

      <div class="example"><p><code>
        #!/usr/bin/perl
      </code></p></div>

      <p>실제로 인터프리터의 경로인지 확인한다.</p>

      <p>또, CGI 프로그램이 다른 <a href="#env">환경변수</a>를
      사용한다면 아파치가 이 변수들을 프로그램에게 전달해야
      한다.</p>

    

    <h3 id="syntaxerrors">프로그램 오류</h3>
      

      <p>CGI 프로그램이 실패하는 경우 대부분 프로그램 자체
      문제때문이다. 특히 위의 두가지 실수를 하지 않았고 이 글을
      계속 보고 있다면 더더욱 그렇다. 먼저 웹서버에서 실행하기
      전에 명령행에서 프로그램을 실행해본다. 예를 들어, 다음과
      같이 실행한다.</p>

      <div class="example"><p><code>
      cd /usr/local/apache2/cgi-bin<br>
      ./first.pl
      </code></p></div>

      <p>(<code>perl</code> 인터프리터를 실행하지 마라. 쉘과
      아파치는 스크립트 첫번째 줄에 있는 <a href="#pathinformation">경로 정보</a>를 사용하여 인터프리터를
      찾아야 한다.)</p>

      <p>프로그램은 제일 먼저 <code>Content-Type</code>을 포함한
      HTTP 헤더들을 출력하고 빈 줄을 출력해야 한다. 다른 것을
      출력한다면 웹서버에서 실행할 경우 아파치는 <code>Premature
      end of script headers</code>를 반환한다. 자세한 내용은
      위의 <a href="#writing">CGI 프로그램 작성하기</a>를 참고하라.</p>
    

    <h3 id="errorlogs">오류 로그</h3>
      

      <p>오류 로그는 당신 편이다. 무언가 잘못되면 오류 로그에
      문구가 생긴다. 오류 로그를 제일 먼저 살펴봐야 한다. 웹사이트를
      호스팅하는 곳에서 오류 로그를 보지 못하게 한다면, 아마도
      다른 업체를 알아봐야 한다. 오류 로그를 보는 방법을 익히면,
      대부분의 문제를 빨리 파악하여 해결할 수 있다.</p>
    

    <h3 id="suexec">Suexec</h3>
      

      <p><a href="../suexec.html">suexec</a> 지원 프로그램을
      사용하면 어떤 가상호스트 혹은 어떤 사용자 디렉토리에 있는지에
      따라 CGI 프로그램을 다른 사용자 권한으로 실행할 수 있다.
      Suexec는 매우 엄격하게 권한을 검사하며, 검사를 하나라도
      통과하지 못하면 CGI 프로그램을 실행하지 않고 <code>Premature
      end of script headers</code>를 반환한다.</p>

      <p>suexec를 사용하고 있는지 알려면 <code>apachectl -V</code>를
      실행하여 <code>SUEXEC_BIN</code> 위치를 확인한다. 아파치가
      시작할때 그 장소에서 suexec 실행파일을 발견하면, suexec를
      사용할 수 있다.</p>

      <p>suexec를 완전히 이해하지 못했다면 사용해서는 안된다.
      suexec를 사용하지 않으려면 <code>SUEXEC_BIN</code> 위치에
      있는 <code>suexec</code> 실행파일을 지우고 (혹은 파일명을
      바꾸고) 서버를 재시작하면 된다. <a href="../suexec.html">suexec</a>에 대해 읽은 다음 그래도
      사용하고 싶다면, <code>suexec -V</code>를 실행하여 suexec
      로그파일 위치를 알아내고 로그파일에서 당신이 어떤 규칙을
      어기고 있는지 찾는다.</p>
    
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="behindscenes">뒤에서는 무슨 일이 벌어지는가? <a title="Permanent link" href="#behindscenes" class="permalink">&para;</a></h2>
    

    <p>CGI 프로그래밍에 익숙해질수록 뒤에서 벌어지는 일을 이해하면
    도움이 된다. 구체적으로 브라우저와 서버가 서로 통신하는
    방법을 말하는 것이다. 몰라도 "Hello, World."를 출력하는
    프로그램을 작성할 수 있지만 이런 프로그램은 별로 쓸모가
    없기때문이다.</p>

    <h3 id="env">환경변수</h3>
      

      <p>환경변수는 당신이 컴퓨터를 사용하는 동안 당신 주위를
      떠다니는 값이다. 환경변수는 path (컴퓨터가 당신이 입력한
      명령어에 해당하는 실제 파일을 찾는 장소), 사용자명, 터미널
      종류와 같이 유용한 정보다. 일반적인 환경변수를 모두 보려면
      명령행 프롬프트에서 <code>env</code>를 입력한다.</p>

      <p>CGI를 실행할때도 서버와 브라우저는 각자의 환경변수를
      서로 교환한다. 이 정보에는 브라우저 종류 (Netscape, IE,
      Lynx), 서버 종류 (아파치, IIS, WebSite), 실행하는 CGI
      프로그램명 등이 있다.</p>

      <p>CGI 프로그래머는 이런 변수들을 사용할 수 있고,
      환경변수는 클라이언트-서버 통신에는 일부분을 차지한다.
      전체 필수 변수 목록은 <a href="http://hoohoo.ncsa.uiuc.edu/cgi/env.html">http://hoohoo.ncsa.uiuc.edu/cgi/env.html</a>에 있다.</p>

      <p>아래 간단한 Perl CGI 프로그램은 자신에게 전달된 모든
      환경변수를 보여준다. 아파치 배포본의 <code>cgi-bin</code>
      디렉토리에 이와 비슷한 프로그램이 두개 있다. 몇몇 변수는
      필수이고 나머지는 선택적이다. 그래서 공식 목록에 없는
      변수도 보인다. 또, 아파치는 기본적으로 제공하는 환경변수
      외에 여러가지 방법으로 <a href="../env.html">직접 환경변수를
      추가할 수 있다</a>.</p>

      <div class="example"><p><code>
        #!/usr/bin/perl<br>
        print "Content-type: text/html\n\n";<br>
        foreach $key (keys %ENV) {<br>
        <span class="indent">
          print "$key --&gt; $ENV{$key}&lt;br&gt;";<br>
        </span>
        }
      </code></p></div>
    

    <h3 id="stdin">STDIN과 STDOUT</h3>
      

      <p>또, 서버와 클라이언트는 표준입력(<code>STDIN</code>)과
      표준출력(<code>STDOUT</code>)으로 통신한다. 일상적인 경우
      <code>STDIN</code>은 키보드나 프로그램이 처리하는 파일을
      나타내고, <code>STDOUT</code>은 보통 콘솔이나 화면을 뜻한다.</p>

      <p>CGI 프로그램에게 웹 양식(form)을 <code>POST</code>하면
      양식에 입력한 자료를 특별한 형식으로 묶어서 CGI 프로그램의
      <code>STDIN</code>으로 전달한다. 그러면 프로그램은 키보드나
      파일에서 얻은 자료를 처리하듯이 자료를 처리할 수 있다.</p>

      <p>"특별한 형식"은 매우 간단하다. 항목 이름과 값을 등호(=)로
      연결하고, 항목 이름과 값의 쌍들을 서로 앤퍼샌드(&amp;)로
      연결한다. 공백, 앰퍼샌드, 등호 같은 부자연스러운 문자는
      혼동하지 않도록 16진수로 변환한다. 완전한 자료 문자열은
      다음과 같이 생겼다.</p>

      <div class="example"><p><code>
        name=Rich%20Bowen&amp;city=Lexington&amp;state=KY&amp;sidekick=Squirrel%20Monkey
      </code></p></div>

      <p>종종 URL 뒤에서 이런 문자열을 보게 된다. 이 경우 서버는
      문자열을 <code>QUERY_STRING</code>이라는 환경변수에 저장한다.
      이를 <code>GET</code> 요청이라고 한다. <code>FORM</code>
      태그의 <code>METHOD</code> 속성을 지정하여 HTML 양식(form)이
      자료를 <code>GET</code>할지 <code>POST</code>할지 결정한다.</p>

      <p>이제 프로그램은 이런 문자열을 유용한 정보로 쪼개야
      한다.  다행히도 이런 자료 처리를 돕고 CGI 프로그램의 다른
      여러 면을 살피는 라이브러리와 모듈들이 있다.</p>
    
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="libraries">CGI 모듈/라이브러리 <a title="Permanent link" href="#libraries" class="permalink">&para;</a></h2>
    

    <p>CGI 프로그램을 작성할때 지루한 작업을 대신해주는 코드
    라이브러리 혹은 모듈을 사용할지 고려해봐야 한다. 이런 것을
    사용하면 버그가 줄고 더 빨리 프로그램을 개발할 수 있다.</p>

    <p>Perl로 CGI 프로그램을 작성한다면 <a href="http://www.cpan.org/">CPAN</a>에서 관련 모듈들을 찾을
    수 있다. CGI 개발에 가장 널리 사용되는 모듈은
    <code>CGI.pm</code>이다. 대부분의 프로그램에 충분한 최소
    기능을 구현한 <code>CGI::Lite</code>도 고려해 볼 수 있다.</p>

    <p>C로 CGI 프로그램을 작성한다면 선택의 여지가 많다. 이중
    하나가 <a href="http://www.boutell.com/cgic/">http://www.boutell.com/cgic/</a>에
    있는 <code>CGIC</code> 라이브러리다.</p>
  </div><div class="top"><a href="#page-header"><img alt="top" src="../images/up.gif"></a></div>
<div class="section">
<h2 id="moreinfo">더 많은 정보... <a title="Permanent link" href="#moreinfo" class="permalink">&para;</a></h2>
    

    <p>웹에 매우 많은 CGI 정보가 있다. 뉴스그룹 <a href="news:comp.infosystems.www.authoring.cgi">comp.infosystems.www.authoring.cgi</a>에서 여러 사람들과
    CGI 문제를 논의할 수 있다. HTML Writers Guild의 -servers
    메일링리스트는 질문에 대한 답을 찾기에 훌륭한 장소다. <a href="http://www.hwg.org/lists/hwg-servers/">http://www.hwg.org/lists/hwg-servers/</a>에서 더 많은 것을
    알 수 있다.</p>

    <p>그리고 물론 CGI 프로그램 동작에 대한 모든 내용을 설명한
    CGI 규약을 읽어야 할지도 모른다. <a href="http://hoohoo.ncsa.uiuc.edu/cgi/interface.html">NCSA</a>에
    원본 문서가 있고, 수정한 초안은 <a href="http://web.golux.com/coar/cgi/">Common Gateway Interface
    RFC 프로젝트</a>에 있다.</p>

    <p>메일링리스트나 뉴스그룹에 현재 격고 있는 CGI 문제에 대해
    질문할때는 발생한 현상과 원래 기대한 결과, 실제로 발생한
    현상이 어떻게 다른지, 사용하는 서버, CGI 프로그램을 작성한
    언어, 가능하면 해당 코드를 자세히 적어라. 그러면 해결책을
    찾기 쉬워진다.</p>

    <p>아파치 소스코드가 잘못되었다고 확신하지 않는 한 CGI 질문을
    아파치 버그 데이터베이스에 올리면 <strong>절대로</strong>
    안된다.</p>
  </div></div>
<div class="bottomlang">
<p><span>가능한 언어: </span><a href="../en/howto/cgi.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
<a href="../es/howto/cgi.html" hreflang="es" rel="alternate" title="Espa&ntilde;ol">&nbsp;es&nbsp;</a> |
<a href="../fr/howto/cgi.html" hreflang="fr" rel="alternate" title="Fran&ccedil;ais">&nbsp;fr&nbsp;</a> |
<a href="../ja/howto/cgi.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
<a href="../ko/howto/cgi.html" title="Korean">&nbsp;ko&nbsp;</a></p>
</div><div id="footer">
<p class="apache">Copyright 2026 The Apache Software Foundation.<br>Licensed under the <a href="https://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
<p class="menu"><a href="../mod/">모듈</a> | <a href="../mod/quickreference.html">지시어들</a> | <a href="https://cwiki.apache.org/confluence/display/httpd/FAQ">FAQ</a> | <a href="../glossary.html">용어</a> | <a href="../sitemap.html">사이트맵</a> | <a href="https://bz.apache.org/bugzilla/enter_bug.cgi?product=Apache%20httpd-2">Report a bug</a></p></div><script><!--//--><![CDATA[//><!--
if (typeof(prettyPrint) !== 'undefined') {
    prettyPrint();
}
var langToggle = document.querySelector('.lang-toggle');
var topLang = document.querySelector('.toplang');
if (langToggle && topLang) {
    langToggle.addEventListener('click', function() { topLang.classList.toggle('open'); });
}
var qv = document.getElementById('quickview');
if (qv) {
    document.body.appendChild(qv);
    var qvBtn = document.createElement('button');
    qvBtn.className = 'qv-toggle';
    qvBtn.setAttribute('aria-label', 'Toggle page navigation');
    qvBtn.innerHTML = '&#9776;';
    document.body.appendChild(qvBtn);
    qvBtn.addEventListener('click', function() {
        var isOpen = qv.classList.toggle('open');
        if (isOpen) {
            qv.style.top = window.scrollY + 10 + 'px';
        }
    });
    window.addEventListener('scroll', function() { qv.classList.remove('open'); });
}
//--><!]]></script>
</body></html>