À̸íÇå °æ¿µ ½ºÄð
HOME | TEXTBOOK | ARTICLE | CULTURE | TECH | FORUM | LIST | @ | JOIN |
[ÆÞ] CGIÀÇ ÀÇ¹Ì ¹× ÆÞÀ» ÀÌ¿ëÇÑ °£´ÜÇÑ CGI °³¹ß
CGIÀÇ °³³ä°ú ȯ°æº¯¼ö, ±×¸®°í CGI
À̸íÇå / 2002-6-20 /
Âü°í: À¥ ±â¹Ý º¹¸®°è»ê±â´Â º¹¸®°è»ê±â¸¦ Ŭ¸¯Çϼ¼¿ä.

CGI ¶õ?

cgi´Â "common gateway interface"ÀÇ ¾àÀÚÀÔ´Ï´Ù. °ÔÀÌÆ®¿þÀ̶õ ½á¹ö ÄÄÇ»ÅÍ¿¡´Â Á¸ÀçÇÏÁö¸¸ À¥½á¹ö ÇÁ·Î±×·¥À» ÅëÇØ¼­´Â Á¢±ÙÇÒ ¼ö ¾ø´Â ´Ù¸¥ ÇÁ·Î±×·¥À¸·ÎÀÇ ÀÔ±¸¸¦ ¶æÇÕ´Ï´Ù. ¿¹¸¦ µé¾î, ÀϹÝÀûÀÎ À¥ºê¶ó¿ìÁ®·Î À¥ ½á¹ö ÇÁ·Î±×·¥¿¡ Á¢¼ÓÇÑ °æ¿ì, ½á¹ö ÄÄÇ»ÅÍ¿¡ ÀÖ´Â mysql db¿¡´Â Àý´ë·Î Á÷Á¢ Á¢±ÙÇÒ ¼ö ¾ø½À´Ï´Ù. ÇÏÁö¸¸ mysql µ¥ÀÌŸ¸¦ ´Ù·ê ¼ö ÀÖ´Â cgi ÇÁ·Î±×·¥À» ÀÌ¿ëÇϸé À¥ºê¶ó¿ìÁ®¸¦ ÅëÇØ mysql µ¥ÀÌŸ¿¡ Á¢±ÙÇÒ ¼ö ÀÖ½À´Ï´Ù. Áï, cgi ÇÁ·Î±×·¥ÀÌ mysql db·ÎÀÇ 'gateway'¸¦ Á¦°øÇÏ´Â °ÍÀÔ´Ï´Ù. "common gateway interface"´Â ½á¹ö ÄÄÇ»ÅÍ¿¡ Á¸ÀçÇÏ´Â ¿©·¯ µ¥ÀÌŸ¿Í ÇÁ·Î±×·¥À¸·ÎÀÇ °øÅëµÈ(common) °ÔÀÌÆ®¿þÀ̸¦ ¸¸µé¾îÁÖ´Â ÀÎÅÍÆäÀ̽ºÀÎ °ÍÀÔ´Ï´Ù.

±×·¯¸é °ÔÀÌÆ®¿þÀ̸¦ ÅëÇØ¼­ ¹«¾ùÀÌ µé¾î°¡°í ¹«¾ùÀÌ ³ª¿Ã±î¿ä? ȸ¿øµî·Ï Æû(form)¿¡ °³ÀÎ Á¤º¸¸¦ ÀÔ·ÂÇÏ´Â °æ¿ì¸¦ »ý°¢ÇØ º¾½Ã´Ù. ȸ¿øµî·Ï ÆäÀÌÁö´Â À̸§, ÁÖ¼Ò, id, ÆÐ¾²¿öµå µîÀÇ Á¤º¸¸¦ ÀÔ·ÂÇÒ ¼ö ÀÖ´Â html ÆûÀ¸·Î ÀÌ·ïÁ® ÀÖ½À´Ï´Ù. »ç¿ëÀÚ´Â ÀÌ Æû¿¡ ÀÚ½ÅÀÇ À̸§, ÁÖ¼Ò µîÀÇ Á¤º¸¸¦ ÀÔ·ÂÇϰí "º¸³»±â"(submit) ¹öưÀ» Ŭ¸¯ÇÏ°Ô µË´Ï´Ù. ÀÌ ¶§ ÀÔ·ÂµÈ »ç¿ëÀÚ µ¥ÀÌŸ´Â ¾î¶² ¹æ½ÄÀ» °ÅÃļ­ À¥ ½á¹ö ÇÁ·Î±×·¥¿¡ µµÂøÇϰí, À¥ ½á¹ö¿¡¼­´Â ÀÌµé µ¥ÀÌŸ¸¦ ó¸®ÇÕ´Ï´Ù. 'ó¸®'´Â µ¥ÀÌŸ¸¦ ´Ü¼øÈ÷ ½á¹ö ÄÄÇ»ÅÍ¿¡ ÀúÀåÇÏ´Â °ÍÀÏ ¼öµµ ÀÖ°í, ½á¹ö ÄÄÇ»ÅÍ¿¡ Á¸ÀçÇÏ´Â ´Ù¸¥ ÇÁ·Î±×·¥À¸·Î ÇÁ·Î¼¼½ÌÇØ¼­ ´Ù¸¥ Ãâ·Â¹°À» ¸¸µé¾î ³»´Â °ÍÀÏ ¼öµµ ÀÖ½À´Ï´Ù. ¾î·µç »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ µ¥ÀÌŸ°¡ µé¾î°¡°í, ÀÌµé µ¥ÀÌŸ´Â cgi¶ó´Â ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ¼­ À¥ ½á¹ö ¶Ç´Â À¥ ½á¹ö¿Í ¿¬°áµÈ ´Ù¸¥ ÄÄÇ»ÅÍ¿¡ ÀÖ´Â ÇÁ·Î±×·¥À» ¸¸³ª°í, À̵é ÇÁ·Î±×·¥¿¡ ÀÇÇØ ó¸®µÈ °á°ú´Â ´Ù½Ã cgi¶ó´Â ÀÎÅÍÆäÀ̽º¸¦ ÅëÇØ¼­ ÁÖ »ç¿ëÀÚ ÂÊ(À¥ºê¶ó¿ìÁ®)À¸·Î º¸³»Áö´Â °ÍÀÔ´Ï´Ù.

CGI
(À§ ±×¸²Àº O'Reily Ã¥¿¡¼­ ¹ßÃéÇß½À´Ï´Ù.)
ÁÖ cgi ÇÁ·Î±×·¥ÀÌ ´Ü¼øÈ÷ »ç¿ëÀÚ¿Í ½á¹ö»çÀÌÀÇ µ¥ÀÌŸ Àü´Þ ¿ªÇÒ¿¡ ±×Ä¡Áö ¾ÊÀ» ¼öµµ ÀÖ½À´Ï´Ù. cgi ÇÁ·Î±×·¥ ÀÚ½ÅÀÌ »ç¿ëÀÚ µ¥ÀÌŸ³ª ½á¹ö Á¤º¸¸¦ º¹ÀâÇÏ°Ô °¡°øÇÒ ¼öµµ ÀÖ½À´Ï´Ù. ¿©·¯ µ¥ÀÌŸ°¡ À¯ÅëµÉ ¼ö ÀÖ´Â ÀÎÅÍÆäÀ̽º¸¦ ÅëÄªÇØ¼­ cgi¶ó ÇÑ´Ù°í ÀÌÇØÇÏ¸é µË´Ï´Ù.

À¥ ½á¹ö·Î µé¾î °¡´Â Á¤º¸¿¡´Â ¾î¶² °ÍÀÌ ÀÖÀ»±î¿ä? Å©°Ô ¼¼ °¡ÁöÀÔ´Ï´Ù.

  1. Ŭ¶óÀÌ¾ðÆ® Á¤º¸, ½á¹ö Á¤º¸, »ç¿ëÀÚ Á¤º¸
  2. »ç¿ëÀÚ°¡ Æû¿¡ ÀÔ·ÂÇÑ Á¤º¸
  3. ºÎ°¡ÀûÀÎ ÆÐ¾²(path) Á¤º¸

¸¶Áö¸· ºÎ°¡Àû ÆÐ¾²Á¤º¸´Â º°·Î Áß¿äÇÏÁö ¾Ê°í À§ÀÇ µÎ °¡Áö°¡ Áß¿äÇÕ´Ï´Ù. ù ¹øÂ°¿¡ ³ª¿À´Â, Ŭ¶óÀ̾ðÆ®, ½á¹ö, »ç¿ëÀÚ Á¤º¸´Â ÇöÀç »ç¿ëÀÚ°¡ ¾î¶² ºê¶ó¿ìÁ®¸¦ »ç¿ëÇÏ´ÂÁö, ¾î¶² ½ÎÀÌÆ®¸¦ °ÅÃļ­ ÀÌ À¥½á¹ö¿¡ Á¢¼ÓÇϰí ÀÖ´ÂÁö, »ç¿ëÀÚÀÇ ip ÁÖ¼Ò´Â ¹«¾ùÀÎÁö, ¶Ç ½á¹ö ÂÊ¿¡¼­ ¾î¶² À¥ ½á¹ö ÇÁ·Î±×·¥À» ¾²°í ÀÖ´ÂÁö, DocumentRootÀÇ path´Â ¾î¶»°Ô µÇ´ÂÁö µîÀ» ÀǹÌÇÕ´Ï´Ù. ÀÌ·± Á¤º¸´Â »ç¿ëÀÚ°¡ Æû¿¡ Á÷Á¢ ÀÔ·ÂÇÑ µ¥ÀÌŸ¿Í ÇÔ²² http header¿¡ ´ã°Ü¼­ ½á¹ö¿¡ Àü´ÞµË´Ï´Ù. (http·Î ³ª´©´Â ´ëÈ­¸¦ ÀÐ¾î º¸¼¼¿ä.) À̸¦Å×¸é °Ô½ÃÆÇ¿¡ ±ÛÀ» ¿Ã¸®´Â °æ¿ì¸¦ »ý°¢ÇØ º¾½Ã´Ù. °Ô½ÃÆÇ ±Û¾²±â Æû¿¡ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ ±Û°ú ÇÔ²², ÇöÀç »ç¿ëÀÚ°¡ ¾î¶² À¥ºê¶ó¿ìÁ®¸¦ ¾²°í ÀÖ°í, ip ÁÖ¼Ò°¡ ¹«¾ùÀÎÁö µîÀÇ Á¤º¸°¡ ÇÔ²² À¥ ½á¹ö¿¡ Àü´ÞµÇ´Â °ÍÀÔ´Ï´Ù. ±×·¯¸é ÀÌ Àü´ÞµÈ Á¤º¸´Â ¾îµð¿¡ ÀúÀåµÉ±î¿ä?

ȯ°æ º¯¼ö (Environment Variables)

À¥½á¹öÀÇ È¯°æº¯¼ö(Environment Variable)¿¡ Àü´ÞµÈ Á¤º¸°¡ ÀúÀåµË´Ï´Ù. CGI´Â ÀÌ È¯°æº¯¼ö¿¡ Á¢±ÙÇØ¼­ Ŭ¶óÀÌ¾ðÆ® ÄÄÇ»ÅÍ Á¤º¸³ª »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ µ¥ÀÌŸ¸¦ °¡Á®¿À´Â °ÍÀÔ´Ï´Ù. ȯ°æº¯¼ö¿¡´Â ´ÙÀ½°ú °°Àº °ÍÀÌ ÀÖ½À´Ï´Ù. ÀÌ·± °ÍÀÌ ÀÖ´Ù´Â Á¤µµ·Î¸¸ ¿ì¼± ÆÄ¾ÇÇÏ¸é µË´Ï´Ù.

SERVER_NAME ½á¹öÀÇ È£½ºÆ®³×ÀÓ°ú ip ÁÖ¼Ò
SERVER_SOFTWARE ½á¹ö ¼ÒÇÁÆ¡¾îÀÇ ¹öÀü°ú À̸§
SERVER_PROTOCOL »ç¿ëÀÚ ¿äûÀ» ó¸®ÇÏ´Â ÇÁ·ÎÅäÄÝÀÇ ¹öÀü°ú À̸§
SERVER_PORT ½á¹ö°¡ µ¿ÀÛÇϰí ÀÖ´Â Æ÷Æ® ³Ñ¹ö (Æ÷Æ®¿¡ °üÇÑ ¼³¸íÀº TCP/IP ¹× ³×Æ®¿÷ ÇÁ·ÎÅäÄÝ ¼³¸í Ŭ¸¯)
REQUEST_METHOD ¿äû ¹æ½Ä
PATH_INFO cgi ÇÁ·Î±×·¥¿¡ Àü´ÞµÈ ºÎ°¡Àû ÆÐ¾² Á¤º¸
DOCUMENT_ROOT À¥¹®¼­ÀÇ ·çÆ® µð·ºÅ丮
QUERY_STRING »ç¿ëÀÚ°¡ Æû¿¡ ÀÔ·ÂÇÑ Á¤º¸
REMOTE_HOST »ç¿ëÀÚÀÇ È£½ºÆ®³×ÀÓ
REMOTE_ADDR »ç¿ëÀÚÀÇ IP ÁÖ¼Ò
CONTENT_TYPE ¸¶ÀÓ (MIME) ŸÀÔ
CONTENT_LENGTH Ç¥ÁØÀÔ·ÂÀ» ÅëÇØ CGI ÇÁ·Î±×·¥¿¡ Àü´ÞµÇ´Â µ¥ÀÌŸÀÇ ±æÀÌ
HTTP_REFERER »ç¿ëÀÚ°¡ CGI ÇÁ·Î±×·¥¿¡ Á¢±ÙÇϱâ Àü¿¡ ¸Ó¹°´ø ¹®¼­ÀÇ ÁÖ¼Ò
HTTP_USER_AGENT »ç¿ëÀÚ°¡ »ç¿ëÇÏ´Â ºê¶ó¿ìÁ®ÀÇ Á¾·ù

À¥ ºê¶ó¿ìÁ®·Î cgi ÇÁ·Î±×·¥¿¡ Á¢±ÙÇÏ´Â ¼ø°£ À§ Á¤º¸°¡ À¥ ½á¹öÀÇ È¯°æº¯¼ö¿¡ ´ã±â°Ô µÇ´Â °ÍÀÔ´Ï´Ù. ÆÞÀ» ÀÌ¿ëÇØ¼­ À̵é Á¤º¸¿¡ Á¢±ÙÇÏ´Â °æ¿ì %ENV ÇØ½¬¸¦ ÅëÇØ¼­ Á¢±ÙÇÒ ¼ö ÀÖ½À´Ï´Ù. °¢°¢ÀÇ È¯°æº¯¼ö´Â $ENV{'ȯ°æº¯¼ö'}ÀÇ ÇüÅ·Π´Ù·ç¸é µË´Ï´Ù. À̾߱⸦ ´õ ÁøÇà½Ã۱â Àü¿¡ ¿ì¼± HTTP Çì´õ(header)¿¡ °üÇØ¼­ ¾Ë°í ÀÖ¾î¾ß ÇÕ´Ï´Ù. ¾ÆÁ÷±îÁö http·Î ³ª´©´Â ´ëÈ­¸¦ ÀÐÁö ¾Ê¾ÒÀ¸¸é ÀÐ°í ¿À¼¼¿ä.

¸µÅ©¿¡¼­ ¼³¸íÇÑ °Íó·³, À¥ ½á¹ö°¡ »ç¿ëÀÚ À¥ ºê¶ó¿ìÁ®·Î ¿äûµÈ ¹®¼­¸¦ º¸³¾ ¶§ http ¸®½ºÆÇ½º Çì´õ¿Í ÇÔ²² Àü´ÞÇÕ´Ï´Ù. ±×¸®°í ±× Çì´õ¿¡´Â ´ÙÀ½°ú °°Àº Á¤º¸°¡ ´ã°Ü ÀÖ½À´Ï´Ù.


HTTP/1.0 200 Found
Date: Mon, 10 Feb 1997 23:48:22 GMT
Server: Apache/1.2
Content-type: text/html
Last-Modified: Tues, 11 Feb 2000 22:45:55 GMT

À̰ÍÀÌ http ¸®½ºÆÇ½º Çì´õÀÔ´Ï´Ù. ½á¹ö¿¡¼­ ¿äûµÈ µ¥ÀÌŸ¸¦ º¸³» ÁÖ´Â http ÇÁ·ÎÅäÄÝ ¹öÀü, status code (200 Found; ¿äûÇÑ ¹®¼­°¡ ÀÖ´õ¶ó.), º¸³» ÁÖ´Â ³¯Â¥, À¥ ½á¹öÀÇ ¹öÀü, º¸³» ÁÖ´Â ÆÄÀÏÀÇ ¸¶ÀÓŸÀÔ, ¸¶Áö¸· º¯ÇüµÈ ³¯Â¥ µîÀÌ À¥ ½á¹ö·ÎºÎÅÍ Å¬¶óÀÌ¾ðÆ® ÂÊÀ¸·Î Àü´ÞµÇ´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù.

±×·¸´Ù¸é Çì´õ¿Í Ŭ¶óÀ̾ðÆ®ÀÇ ¿äû¿¡ µû¶ó º¸³» ÁÖ´Â µ¥ÀÌŸ »çÀÌÀÇ ±¸ºÐÀº ¾î¶»°Ô ÇÒ±î¿ä? ½á¹ö¿¡¼­ Ŭ¶óÀÌ¾ðÆ®¿¡ http¶ó´Â ÇÁ·ÎÅäÄÝÀ» ÅëÇØ º¸³»ÁÖ´Â µ¥ÀÌŸ Áß °ú¿¬ ¾îµð±îÁö°¡ http Çì´õÀÌ°í ¾îµð¼­ºÎÅÍ ¿äûµÈ µ¥ÀÌŸÀÎÁö¸¦ ±¸ºÐÇÏ´Â ¹æ¹ýÀÌ ÀÖ¾î¾ß ÇÏÁö ¾Ê°Ú½À´Ï±î?

http ÇÁ·ÎÅäÄÝÀÇ °æ¿ì 'ºó ÁÙ Çϳª°¡ ¶ç¿öÁø ´ÙÀ½ºÎÅͰ¡ ¿äûµÈ µ¥ÀÌŸ'·Î ¾à¼ÓµÇ¾î ÀÖ½À´Ï´Ù. Áï, À§¿Í °°Àº Çì´õ Á¤º¸°¡ ³ª¿Â ´ÙÀ½ ºó ÁÙ ÇÑ ÁÙÀÌ ³ª¿À¸é Çì´õ´Â ³¡³ª°í µ¥ÀÌŸ°¡ ½ÃÀ۵ȴٰí À¥ ºê¶ó¿ìÁ®¿¡¼­ ÀνÄÇÏ´Â °ÍÀÔ´Ï´Ù. http ¸®½ºÆÇ½º Çì´õ Áß ´ëºÎºÐÀº À¥½á¹ö¿¡¼­ ¾Ë¾Æ¼­ ¼³Á¤ÇØÁֹǷΠ(¹°·Ð Á÷Á¢ ¼³Á¤ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.) ½á¹ö ¹öÀüÀ̳ª httpÀÇ ¹öÀü, status ÄÚµå µîÀº ±»ÀÌ ¿ì¸®°¡ ÀÛ¼ºÇÏÁö ¾Ê¾Æµµ µË´Ï´Ù. ¿ì¸®´Â Àü´ÞµÇ´Â µ¥ÀÌŸÀÇ ¸¶ÀÓŸÀÔÀ» °¡¸£Å°´Â Content-type¸¸ ÁöÁ¤ÇØ ÁÖ¸é µË´Ï´Ù. ´ÙÀ½ÀÇ Äڵ带 º¸¼¼¿ä.


#!/usr/bin/perl

print "Content-type: text/html\n\n";
print "<html><head></head><body>";
print "¼­¹öÀ̸§: $ENV{'SERVER_NAME'}<br />";
print "¼­¹ö Æ÷Æ®: $ENV{'SERVER_PORT'}<br />";
print "ÇÁ·ÎÅäÄÝ: $ENV{'SERVER_PROTOCOL'}<br />";
print "»ç¿ëÀÚ À¥ºê¶ó¿ìÁ®: $ENV{'HTTP_USER_AGENT'}<br />";
print "»ç¿ëÀÚ IP ÁÖ¼Ò: $ENV{'REMOTE_ADDR'}";
print "</body></html>";

Á¦ÀÏ Áß¿äÇÑ ºÎºÐÀº ù ÁÙÀÔ´Ï´Ù. º¸¸é, Content-type: text/html ´ÙÀ½¿¡ ºó ÁÙ ÇÑ ÁÙÀ» ¸¸µé°í ÀÖ´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù. (\n\n)
Content-typeÀº º¸³»ÁÙ ¹®¼­ÀÇ ¸¶ÀÓŸÀÔÀ» ÁöÁ¤ÇÑ °ÍÀÔ´Ï´Ù. ¾î·µç ºó ÁÙÀÌ ³ª¿ÔÀ¸¹Ç·Î ÀÌÁ¦ http Çì´õ´Â ³¡³µ´Ù°í º¸°í, ±× ´ÙÀ½ ³ª¿À´Â ³»¿ëºÎÅÍ À¥ ºê¶ó¿ìÁ®¿¡ ¶ç¿ö ÁÖ°Ô µÇ´Â °ÍÀÔ´Ï´Ù. (¶Ç´Â ¸¶ÀÓŸÀÔ¿¡ µû¶ó¼­ ¿¬°áµÈ ÇÁ·Î±×·¥À» ½ÇÇàÇÏ°Ô µË´Ï´Ù. ¿¹¸¦ µé¾î mp3 ÆÄÀÏÀ̶ó¸é À©¾ÚÇÁ°¡ ¶ß¸é¼­ mp3 ÆÄÀÏÀÌ ½ÇÇàµÇ´Â ½ÄÀÔ´Ï´Ù.) À§ÀÇ Äڵ带 º¸¸é, $ENV{'SERVER_NAME'}, $ENV{'REMOTE_ADDR'}ó·³ %ENV ÇØ½¬¸¦ ÀÌ¿ëÇØ¼­ ȯ°æº¯¼ö¿¡ Á¢±ÙÇϰí ÀÖ´Â °ÍÀ» ¾Ë ¼ö ÀÖ½À´Ï´Ù.

ÀÌ Äڵ带 Àû´çÇÑ À̸§À¸·Î ÀúÀåÇϰí (¿¹: env.pl) ÆÛ¹Ì¼ÇÀ» 755·Î ÁØ´ÙÀ½ (chmod 755 env.pl) À¥ ºê¶ó¿ìÁ®¿¡¼­ ¶ç¿ö º¸¸é (http://½á¹öÀ̸§/env.pl) ´ÙÀ½°ú ºñ½ÁÇÑ °á°ú°¡ Ãâ·ÂµÉ °ÍÀÔ´Ï´Ù.


¼­¹öÀ̸§: abc.com
¼­¹ö Æ÷Æ®: 80
ÇÁ·ÎÅäÄÝ: HTTP/1.1
»ç¿ëÀÚ À¥ºê¶ó¿ìÁ®: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
»ç¿ëÀÚ IP ÁÖ¼Ò: 61.77.173.220

ÆÛ¹Ì¼ÇÀÌ 755ÀÎ ¹®¼­´Â ±× ¹®¼­¸¦ À¥ ºê¶ó¿ìÁ®·Î º¸³» ÁÖ´Â °ÍÀÌ ¾Æ´Ï¶ó À¥ ½á¹ö¿¡¼­ ½ÇÇà(execution)ÇÕ´Ï´Ù. Áï, cgi ÇÁ·Î±×·¥ÀÌ À¥ ºê¶ó¿ìÁ®¿¡ ÀÇÇØ ¿äûµÇ´Â °æ¿ì ÀÏ¹Ý html ¹®¼­Ã³·³ À¥ ºê¶ó¿ìÁ®·Î º¸³»¼­ ±×´ë·Î º¸¿© ÁÖ´Â °ÍÀÌ ¾Æ´Ï¶ó À¥ ½á¹ö¿¡¼­ ¹Ù·Î ½ÇÇàÀ» ÇØ¾ß ÇÕ´Ï´Ù. ±×·¡¼­ ÆÛ¹Ì¼ÇÀ» 755·Î ¼ÂÆÃÇÕ´Ï´Ù. (Permission 755´Â -rwxr-xr-xÁÒ? r Àº read, w ´Â write, x ´Â execute)

¸ðµç ȯ°æº¯¼ö¸¦ ´Ù Ãâ·ÂÇØ º¸°í ½Í´Ù¸é ´ÙÀ½°ú °°ÀÌ ÇÒ ¼ö ÀÖ½À´Ï´Ù.


#!/usr/bin/perl

print "Content-type: text/html\n\n";
print "<html><head></head><body>";
foreach $name (sort keys %ENV) {
print "<b>$name : </b> $ENV{$name} <br />"
}
print "</body></html>";

Àû´çÇÑ À̸§À¸·Î ÀúÀåÇÑ ´ÙÀ½ ÆÛ¹Ì¼ÇÀ» 755·Î Çϰí À¥ ºê¶ó¿ìÁ®¿¡¼­ ½ÇÇàÇØ º¸¸é ¸ðµç ȯ°æº¯¼ö¸¦ ´Ù º¼ ¼ö ÀÖ½À´Ï´Ù.

°°Àº ±â´ÉÀ» ÇÏ´Â, Á¶±Ý ´õ 'ÆÞ ½ºÅ¸ÀÏ'¿¡ °¡±î¿î ÄÚµå´Â ÀÌ·¸½À´Ï´Ù.


#!/usr/bin/perl

print "Content-type: text/html\n\n";
print "<html><head></head><body>";
print qq($_ : $ENV{$_}<br />) foreach sort keys %ENV;
print "</body></html>";

ÆÞÀÇ default variableÀÎ $_À» Ȱ¿ëÇØ¼­ foreach ±¸¹®À» ÇÑ ÁÙ·Î ÁÙ¿© ³õÀº °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù. qq( )´Â Å« µû¿ÈÇ¥·Î °ýÈ£¾ÈÀ» ¹­¾î Áشٴ ÀǹÌÀ̱¸¿ä. Å« µû¿ÈÇ¥ ¾È¿¡¼­ ¶Ç Å« µû¿ÈÇ¥¸¦ »ç¿ëÇÒ¶§µµ Å»Ãâ \"À» ÇÒ Çʿ䰡 ¾ø±â ¶§¹®¿¡ ÀÚÁÖ ¾²ÀÌ´Â °ÍÀÔ´Ï´Ù. ¿¹¸¦ µé¾î,


print "À̰ÍÀº \"ÆÞ\" ÇÁ·Î±×·¥ ÀÔ´Ï´Ù";
print qq(À̰ÍÀº "ÆÞ" ÇÁ·Î±×·¥ ÀÔ´Ï´Ù);

µÑÀº ¶È°°Àº °ÍÀÔ´Ï´Ù. qq( )°¡ ¾ÆÁÖ Æí¸®ÇÏÁÒ?

À§ÀÇ È¯°æ º¯¼ö Ãâ·Â ÇÁ·Î±×·¥Àº Å͹̳ο¡¼­ ÇÑ ÁÙ·Î ÀÔ·ÂÇÒ ¼öµµ ÀÖ½À´Ï´Ù.

perl -e 'print qq($_ : $ENV{$_}\n) foreach sort keys %ENV'

perl -e ' '´Â Å͹̳ο¡¼­ ÇÑ Á٠¥¸® ÆÞ Äڵ带 ¹Ù·Î ½ÇÇàÇÒ ¶§ »ç¿ëÇÏ´Â °ÍÀÔ´Ï´Ù. ÀÌ·¸°Ô ¿©·¯ ÁÙÀÌ µÉ ¼ö ÀÖ´Â °ÍÀ» Ãà¾àÇØ¼­ ÇÑ ÁÙ·Î ¸¸µå´Â µ¥ ÆÞÀÇ ¹¦¹Ì°¡ ÀÖ½À´Ï´Ù. À¯´Ð½º ±ã½º´Â ÀÌ·± 'ÇÑ ÁÙ'¿¡ ¾à°£ ÁýÂøÇϱ⵵ ÇÕ´Ï´Ù. ¿µ¾î·Î´Â "one-liner"¶ó°í ÇÕ´Ï´Ù. ÆÄÀÌÇÁ ¹®ÀÚ¸¦ ÀÌ¿ëÇØ¼­ º¹ÀâÇÑ ±â´ÉÀ» ÇÑ ÁÙ·Î ¸ÚÁö°Ô ¸¸µé¾î ³»´Â °ÍÀ» ´Ü¼øÇÏ°í ¾Æ¸§´ä´Ù¶ó°í »ý°¢ÇÏ´Â À¯´Ð½º ±ã½º°¡ »ó´ç¼ö ÀÖ½À´Ï´Ù. ÆÞÀÌ À¯´Ð½º »ç¿ëÀÚ¿¡°Ô ¾îÇÊÇÑ ¿©·¯ ÀÌÀ¯ Áß Çϳª°¡ ÆÞÀÇ "simple and elegant"ÇÑ ÄÚµù ½ºÅ¸ÀÏÀÌ À¯´Ð½º ½ºÅ¸Àϰú Àß ¾î¿ï¸°´Ù´Â °ÍÀÔ´Ï´Ù.

cgi ÇÁ·Î±×·¥Àº ÆÛ¹Ì¼Ç¸¸ 755·Î ¼³Á¤Çß´Ù¸é ±»ÀÌ À¥ ºê¶ó¿ìÁ®¸¦ ½ÇÇàÇÏÁö ¾Ê¾Æµµ È®ÀÎÇØ º¼ ¼ö ÀÖ½À´Ï´Ù. À§ÀÇ env.plÀÇ °æ¿ì, ÇÁ·Î±×·¥ÀÌ ÀÖ´Â µð·ºÅ丮·Î cdÇØ¼­ À̵¿ÇÑ ´ÙÀ½, ./env.pl¶ó°í ÀÔ·ÂÇϸé Å͹̳Πâ¿¡¼­ ½ÇÇàÇÒ ¼ö ÀÖ½À´Ï´Ù. cgi¸¦ µð¹ö±ëÇÒ ¶§ À¥ ºê¶ó¿ìÁ® »ó¿¡¼­ Çϱâ´Â Á¶±Ý °ï¶õÇÕ´Ï´Ù. ¿¡·¯¸¦ ºê¶ó¿ìÁ®·Î ¶ç¿öÁÙ ¼ö ÀÖ°Ô ÄÚµùÇÒ ¼öµµ ÀÖÁö¸¸ ¹ø°Å·Ó½À´Ï´Ù. cgi ÇÁ·Î±×·¥¿¡ Å« ¹ö±×°¡ ¾ø´ÂÁö °£´ÜÇÏ°Ô È®ÀÎÇÏ´Â ¹æ¹ýÀÌ Å͹̳Πâ¿¡¼­ ¹Ù·Î ½ÇÇàÇØ º¸´Â °ÍÀÔ´Ï´Ù.

ÆÞÀ» ÀÌ¿ëÇØ¼­ ¾î¶»°Ô ȯ°æº¯¼ö¿¡ Á¢±ÙÇÏ´ÂÁö´Â ÀÌÇØ°¡ µÇÁÒ? »ç¿ëÀÚ°¡ Æû¿¡ ÀÔ·ÂÇÑ Á¤º¸¿¡ Á¢±ÙÇÏ´Â ¹æ¹ýÀº ÈξÀ ´õ º¹ÀâÇϹǷΠ´ÙÀ½ ±Û, "ÆÞÀ» ÀÌ¿ëÇÑ º¹¸®°è»ê±â ¸¸µé±â"¿¡¼­ ÀÚ¼¼ÇÏ°Ô ¼³¸íÇÕ´Ï´Ù.

À̹ø¿¡´Â À¥ ½á¹ö¿¡¼­ cgi¸¦ °ÅÃÄ ¹ÛÀ¸·Î ³ª°¥ ¼ö ÀÖ´Â °ÍÀº ¹¹°¡ ÀÖ´ÂÁö ¾Ë¾Æº¾½Ã´Ù. ´ÙÀ½°ú °°Àº °ÍÀÌ ³ª°¡°Ô µË´Ï´Ù.

  1. ¹ÙÀ̳ʸ® µ¥ÀÌŸµé (±×·¡ÇÈ ÆÄÀÏ, ..)
  2. º¸³» ÁÖ´Â ¹®¼­¸¦ ij½¬¿¡ ÀúÀåÇÒ °ÍÀΰ¡¸¦ ÁöÁ¤
  3. Ưº°ÇÑ http status code

¹ÙÀ̳ʸ® ÆÄÀÏÀº ´Ü¼øÇÑ ±×·¡ÇÈ ÆÄÀÏÀÏ ¼öµµ ÀÖ°í À¥ ½á¹ö»óÀÇ ´Ù¸¥ ÇÁ·Î±×·¥(µ¥ÀÌŸº£À̽º ÇÁ·Î±×·¥,...)¿¡¼­ ó¸®ÇÑ °á°ú¹°ÀÏ ¼öµµ ÀÖ½À´Ï´Ù. ±×·± ¹ÙÀ̳ʸ® ÆÄÀÏÀÌ cgi¸¦ °ÅÃļ­ »ç¿ëÀÚ ÄÄÇ»ÅÍ ÂÊÀ¸·Î °¥ ¼ö ÀÖ½À´Ï´Ù. ±Û ¼­µÎ¿¡ ¾ê±âÇÑ °Íó·³ ½á¹ö(¶Ç´Â ½á¹ö¿Í ¿¬°áµÈ ´Ù¸¥ ÄÄÇ»ÅÍ)¿¡ ÀÖ´Â DB ÇÁ·Î±×·¥À¸·Î ó¸®ÇÑ µ¥ÀÌŸ°¡ »ç¿ëÀÚ ÂÊÀ¸·Î °Ç³Ê°¥ ¼ö ÀÖ´Â °ÍÀÔ´Ï´Ù.

µÎ¹øÂ°, ¼¼¹øÂ°¿¡ °üÇØ¼­´Â Á¶±Ý ÀÖ´Ù°¡ »ìÆì º¸°í ¿ì¼± http Çì´õ¿¡ ´ëÇØ¼­ Á¶±Ý ´õ ¾ê±â¸¦ ÇØ º¾½Ã´Ù.

»ç¿ëÀÚ°¡ ¸µÅ©¸¦ Ŭ¸¯ÇÏ´Â ¼ø°£ ¸¸µé¾îÁö´Â http ¸®Äù½ºÆ® Çì´õ¿¡´Â Accept°¡ ÀÖ½À´Ï´Ù. '³ª´Â ÀÌ·± ¸¶ÀÓŸÀÔÀÇ ÆÄÀÏÀ» ó¸®ÇÒ ¼ö ÀÖ´Ù'´Â °ÍÀ» À¥ ½á¹ö¿¡ ¾Ë·Á ÁÖ´Â °ÍÀÔ´Ï´Ù. º¸ÅëÀº */*, Áï ÀÓÀÇÀÇ ¸ðµç ¸¶ÀÓŸÀÔÀ» ´Ù ó¸®ÇÒ ¼ö ÀÖ°Ô µÇ¾î ÀÖ½À´Ï´Ù. À¥ ºê¶ó¿ìÁ®¿¡ ÀÇÇØ º¸³»Áø Accept Á¤º¸´Â À¥ ½á¹ö ȯ°æº¯¼ö Áß $ENV{'HTTP_ACCEPT'}¿¡ ÀúÀåµË´Ï´Ù.

ÇÑÆí À¥ ½á¹ö¿¡¼­ ¾î¶² ¹®¼­(¶Ç´Â ±×·¡ÇÈ, ½Î¿îµå..)¸¦ º¸³» ÁÙ ¶§µµ '´ÙÀ½ÀÇ µ¥ÀÌŸ´Â ÀÌ·± ¸¶ÀÓŸÀÔÀÌ´Ù.'¶ó°í ¾Ë·ÁÁÖ´Â ºÎºÐÀÌ ÀÖ½À´Ï´Ù. ±×°ÍÀÌ http ¸®½ºÆÇ½º Çì´õ Áß Content-typeÀÔ´Ï´Ù. À§¿¡¼­ º» ¿¹ÀÇ °æ¿ì, Content-typeÀ» text/html·Î ÁöÁ¤Çؼ­ "ºó ÁÙ ÇÑ ÁÙÀÌ ³ª¿Â ´ÙÀ½ÀÇ ³»¿ëÀº html ÅØ½ºÆ®À̹ǷΠ±× °É·Î ó¸®Çضó"°í ¾ê±âÇϰí ÀÖ´Â °ÍÀÔ´Ï´Ù. µû¶ó¼­ ÀÌ Çì´õ¸¦ Àü´Þ ¹ÞÀº À¥ ºê¶ó¿ìÁ®´Â ¿î¿µÃ¼°è¿¡¼­ text/htmlÀ» ó¸®Çϵµ·Ï ÁöÁ¤µÈ ÇÁ·Î±×·¥(ÀÌ °æ¿ì¿¡´Â À¥ºê¶ó¿ìÁ® ÀÚ½Å)À» ½ÇÇàÇØ¼­ Àü´Þ¹ÞÀº µ¥ÀÌŸ¸¦ ó¸®ÇÏ°Ô µË´Ï´Ù. (¸¶ÀÓŸÀÔ(Mime Type)À» ÀÐ¾î º¸¼¼¿ä.)

ÀÌ¿Í ºñ½ÁÇÑ °ÍÀ¸·Î Content-lengthµµ ÀÖ½À´Ï´Ù. À̰ÍÀº ³ª°¡´Â µ¥ÀÌŸ°¡ ¾î´À Á¤µµÀÇ ±æÀ̶ó´Â °ÍÀ» ¾Ë·ÁÁÖ´Â ºÎºÐÀÔ´Ï´Ù. ÀÌó·³ À¥ ½á¹ö¿¡¼­ Ŭ¶óÀÌ¾ðÆ®·Î º¸³»´Â ¸®½ºÆÇ½º Çì´õ¸¦ cgi ÇÁ·Î±×·¥À» ÀÌ¿ëÇØ¼­ °¢°¢ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. À§¿¡¼­ Content-typeÀ» ÁöÁ¤ÇÑ °Í󷳿ä.

Çì´õ Á¤º¸ Áß¿¡´Â ij½¬¸¦ ÇÒ °ÍÀΰ¡¸¦ ÁöÁ¤ÇÏ´Â ºÎºÐÀÌ ÀÖ½À´Ï´Ù. À¥ ºê¶ó¿ìÁ®´Â À¥ ½á¹ö·ÎºÎÅÍ ¹ÞÀº ¹®¼­³ª ±×·¡ÇÈ µîÀ» Çϵåµð½ºÅ© ³»¿¡ ij½¬¶ó´Â ÇüÅ·ΠÀúÀåÇÕ´Ï´Ù. ±×·¡¼­ ºê¶ó¿ì¡ ¼Óµµ¸¦ ºü¸£°Ô ÇÏ´Â °ÍÀÔ´Ï´Ù. ±× ij½¬¿¡ Áö±Ý º¸³»´Â ³»¿ëÀ» ÀúÀåÇÒ °ÍÀΰ¡ ¾È ÇÒ °ÍÀΰ¡¸¦ http ¸®½ºÆÇ½º Çì´õÀÇ Expires, Pragma¸¦ ÅëÇØ ÁöÁ¤ÇÒ ¼ö ÀÖ½À´Ï´Ù. ¿¹¸¦ µé¾î text/html ¹®¼­¸¦ º¸³»¸é¼­ »ç¿ëÀÚ ÄÄÇ»ÅÍ¿¡ ij½¬·Î ÀúÀåµÇ±â¸¦ ¿øÄ¡ ¾Ê´Â °æ¿ì¿¡´Â,


#!/usr/bin/perl
print "Content-type: text/html\n";
print "Pragma: no-cache\n\n";
print "<html> .. .";
.. .. .

Content-type : text/html ´ÙÀ½¿¡ ºó ÁÙÀ» ¸¸µéÁö ¾Ê°í ±×³É ÁÙ ¹Ù²Þ¸¸ Çϰí ÀÖ´Â °ÍÀ» º¼ ¼ö ÀÖ½À´Ï´Ù.(\n ÇÑ °³) µû¶ó¼­ ¾ÆÁ÷Àº Çì´õ°¡ ³¡³ªÁö ¾ÊÀº °ÍÀ̰í, ±× ´ÙÀ½ ÁÙ Pragma ¿¡¼­ ij½¬¿¡ ÀúÀåÇÏÁö ¾Ê´Â °ÍÀ¸·Î ÁöÁ¤ÇÑ ´ÙÀ½ ºó ÁÙÀ» Çϳª ¸¸µé°í (\n µÎ °³), ÀÌÁ¦ Çì´õ°¡ ³¡³µÀ¸¹Ç·Î, Àü´ÞµÉ µ¥ÀÌŸ°¡ ³ª¿À°í ÀÖ½À´Ï´Ù.

¸¶Âù°¡Áö·Î ³¯Â¥¸¦ ÁöÁ¤ÇÒ ¼öµµ ÀÖ½À´Ï´Ù.


#!/usr/bin/perl
print "Content-type: text/html\n";
print "Expires: Wednesday, 27-Dec-99 05:13:10 GMT\n\n";
.. .. .

Áö±Ý±îÁö °øºÎÇØ º» ³»¿ëÀ» ¹ÙÅÁÀ¸·Î À¥ ±â¹Ý º¹¸®°è»ê±â¸¦ ¸¸µé¾î º¾½Ã´Ù. ±× °úÁ¤À» ÅëÇØ¼­ »ç¿ëÀÚ°¡ ÀÔ·ÂÇÑ µ¥ÀÌŸ¸¦ ¾î¶»°Ô ó¸®ÇÏ´ÂÁö ÀÚ¼¼È÷ ¼³¸íÇÕ´Ï´Ù. ´ÙÀ½ ±ÛÀº ÆÞÀ» ÀÌ¿ëÇÑ º¹¸®°è»ê±â ¸¸µé±â¸¦ Ŭ¸¯Çϼ¼¿ä.

Áö±Ý °è½Å °÷Àº: TECH > [ÆÞ] CGIÀÇ ÀÇ¹Ì ¹× ÆÞÀ» ÀÌ¿ëÇÑ °£´ÜÇÑ CGI °³¹ß