°í±Þ CGI ÇÁ·Î±×·¡¹Ö
ÀÌÅðæ
¼¿ï½Ã °³²±¸ û´ãµ¿ 81-8 ¿ì¿øºôµù 5Ãþ
(ÁÖ)´ÙÀ½Ä¿¹Â´ÏÄÉÀÌ¼Ç °³¹ßÆÀ
E-mail : kyung@daum.co.kr
URL :
http://cezanne.daum.co.kr/~kyung/
- Abstract:
- WWW´Â ÇÏÀÌÆÛ¸µÅ©±â´É°ú Æí¸®ÇÑ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º·Î ÀÎÇÏ¿© »ç¿ëÀÚµéÀÌ ±ÞÁõÇϰí ÀÖ´Â Ãß¼¼ÀÌ´Ù.
ÀϹÝÀûÀÎ WWW ½Ã½ºÅÛÀº Á¤ÀûÀÎ ¹®¼¸¸À¸·Î ±¸¼ºµÇ¾î, Ŭ¶óÀ̾ðÆ®ÀÇ ´Ù¾çÇÑ ¿äûÀ» ó¸®Çϱâ À§Çؼ´Â
CGI¸¦ ÅëÇÑ ¹®¼ÀÇ µ¿ÀûÀÎ »ý¼ºÀÌ ÇÊ¿äÇÏ´Ù. ÇÏÁö¸¸ WWW ½Ã½ºÅÛÀº »óŸ¦ À¯ÁöÇÏÁö ¾Ê´Â Ư¼ºÀ» Áö´Ï°í
ÀÖ¾î¼ CGI ÇÁ·Î±×·¥ÀÇ Á¦ÀÛ¿¡ ¾î·Á¿òÀÌ ÀÖ´Ù.
º»°í¿¡¼´Â CGIÀÇ ÀÛµ¿¿ø¸®¿¡ ´ëÇØ Àü¹ÝÀûÀ¸·Î ¾Ë¾Æº¸°í, »õ·Î¿î ¹æ½ÄÀÎ dynamic document, ÈÀÏ ¾÷·Îµå¸¦ ¼³¸íÇÑ´Ù.
¶ÇÇÑ »óŸ¦ À¯ÁöÇÏÁö ¾Ê´Â ¹®Á¦Á¡À» ÇØ°áÇϱâ À§ÇÑ ¸ðµ¨À» Á¦½ÃÇϰí, »õ·Î¿î ¹æ½ÄÀÎ ÄíŰ¿¡
´ëÇØ ¼³¸íÇÑ´Ù.
- Keywords:
- WWW, CGI, Cookie, Client/Server, Form
1. ¼·Ð
WWW(World Wide Web) ½Ã½ºÅÛÀÌ µµÀԵǸ鼺ÎÅÍ, WWWÀÇ Æí¸®ÇÑ »ç¿ëÀÚ ÀÎÅÍÆäÀ̽º·Î ÀÎÇÏ¿© ÀϹݻç¿ëÀÚµéÀÇ
ÀÎÅÍ³Ý »ç¿ëÀÌ ±ÞÁõÇϰí ÀÖ´Â Ãß¼¼ÀÌ´Ù. ÇÏÁö¸¸ ±âÁ¸ÀÇ Á¤ÀûÀÎ ¹®¼¸¸À¸·Î´Â ´Ã¾î³ª´Â »ç¿ëÀÚµéÀÇ
´Ù¾çÇÑ ¿äûÀ» È¿°úÀûÀ¸·Î ó¸®ÇÏÁö ¸øÇϸç, À̸¦ À§Çؼ CGI¸¦ ÅëÇÑ ¹®¼ÀÇ µ¿ÀûÀÎ »ý¼ºÀÌ ÇÊ¿äÇÏ´Ù.
WWW ½Ã½ºÅÛÀº Ŭ¶óÀ̾ðÆ®/¼¹ö ¸ðµ¨¿¡ ±â¹ÝÀ» µÎ°í ÀÖÀ¸¸ç, »óŸ¦ À¯ÁöÇÏÁö ¾Ê´Â(stateless) Ư¼ºÀ»
Áö´Ï°í ÀÖ´Ù. ÀÌ´Â ¼¹öÀÇ ºÎÇϸ¦ ÁÙ¿©Áشٴ ÀåÁ¡À» °¡Áö°í ÀÖÀ¸³ª, »óŸ¦ À¯ÁöÇϱâ À§ÇØ
º°µµÀÇ ½Ã½ºÅÛÀÌ ÇÊ¿äÇÏ´Ù´Â ´ÜÁ¡À» ¾È°í ÀÖ´Ù. µû¶ó¼ º»°í¿¡¼´Â CGIÀÇ ÀϹÝÀûÀÎ ÀÛµ¿¿ø¸®¿¡ ´ëÇØ
»ìÆìº¸°í, NetscapeÀÇ »õ·Î¿î ¹æ½ÄÀÎ µ¿Àû¹®¼(dynamic document), ÈÀÏ ¾÷·Îµå¸¦ ¼³¸íÇϰí, »óŸ¦
À¯ÁöÇϱâ À§ÇÑ ¸ðµ¨À» Á¦½ÃÇϸç, »õ·Î¿î ¹æ½ÄÀÎ ÄíŰ¿¡ ´ëÇØ ¼³¸íÇÑ´Ù.
2. CGI
CGI(Common Gateway Interface)´Â ¼¹ö¿Í ¿ÜºÎ ÇÁ·Î±×·¥°úÀÇ ÀÎÅÍÆäÀ̽º¸¦ À§ÇÑ Ç¥ÁØÀÌ´Ù.
ÀϹÝÀûÀ¸·Î ¼¹ö°¡ ³Ñ°ÜÁÖ´Â ¹®¼´Â Á¤ÀûÀÎ ¹®¼ÀÌ´Ù. ÀÌ¿¡ ºñÇØ CGI¸¦ ÅëÇØ ¿ÜºÎ ÇÁ·Î±×·¥¿¡ Á¤º¸ ¿äûÀ» Çϰí
¿ÜºÎ ÇÁ·Î±×·¥ÀÌ ÀûÀýÇÑ ¹®¼¸¦ µ¿ÀûÀ¸·Î »ý¼º½Ãų ¼ö ÀÖ´Ù. ´ÙÀ½ ±×¸²Àº µ¿ÀûÀ¸·Î »ý¼ºµÈ ¹®¼ ¿¹ÀÌ´Ù.

±×¸² 1 : BBS¿¡¼ µ¿ÀûÀ¸·Î »ý¼ºµÈ »ç¿ëÀÚ ¸®½ºÆ®
2.1 ÀÛµ¿¿ø¸®
´ÙÀ½ ±×¸²°ú °°ÀÌ Å¬¶óÀÌ¾ðÆ®°¡ ¹®¼¸¦ ¿äûÇÏ¸é ¼¹ö´Â CGI ÇÁ·Î±×·¥¿¡ ÇÊ¿äÇÑ ÀμöµéÀ» Àü´ÞÇÏ¸ç ½ÇÇà½ÃŲ´Ù.
½ÇÇàµÈ °á°ú·Î ¹®¼°¡ µ¿ÀûÀ¸·Î »ý¼ºµÇ¸ç, ÀÌ ¹®¼´Â ¼¹ö¸¦ °ÅÃļ Ŭ¶óÀÌ¾ðÆ®¿¡°Ô·Î ³Ñ°ÜÁø´Ù.

±×¸² 2 : CGIÀÇ ÀÛµ¿¿ø¸®
CGI ÇÁ·Î±×·¥À» ÁöÁ¤ÇÏ´Â ¹æ¹ýÀº 1) URL¿¡¼ CGI ÇÁ·Î±×·¥°ú Àü´ÞÇÒ ÀμöµéÀ» ÁöÁ¤Çϰųª, 2) Æû¹®¿¡¼
CGI ÇÁ·Î±×·¥°ú Àü´ÞÇÒ Àμö(ÀÌÈÄ »ç¿ëÀÚ°¡ ÀÔ·Â)µéÀ» ÁöÁ¤ÇÏ´Â ¹æ¹ýÀÌ ÀÖ´Ù. ¶ÇÇÑ ÀμöµéÀ» CGI ÇÁ·Î±×·¥À¸·Î
Àü´ÞÇÏ´Â ¹æ½ÄÀº "GET" ¹æ½Ä°ú "POST" ¹æ½ÄÀÇ µÎ°¡Áö°¡ ÀÖ´Ù. "GET" ¹æ½ÄÀº
¸ðµç ÀμöµéÀ» ȯ°æº¯¼öµéÀ» ÅëÇØ¼ Àü´ÞÇÏ°Ô µÇ¸ç, "POST" ¹æ½ÄÀº ȯ°æº¯¼ö¿Í
"stdin"À» ÅëÇØ¼ ÀμöµéÀ» Àü´ÞÇÏ°Ô µÈ´Ù. URL¿¡¼ ÁöÁ¤ÇÏ´Â ¹æ¹ýÀº "GET" ¹æ½ÄÀ» ÀÌ¿ëÇϸç,
Æû¹®¿¡¼ ÁöÁ¤ÇÏ´Â ¹æ¹ýÀº "GET"°ú "POST&quuot; ¹æ½Ä µÎ°¡Áö ¸ðµÎ¸¦ ÀÌ¿ëÇÑ´Ù.
2.2 Æû¹® °ü·Ã ű×(Fill-Out Form Tag)
Æû¹®Àº ´ÙÀ½ ±×¸²°ú °°ÀÌ »ç¿ëÀڷκÎÅÍ ÇÊ¿äÇÑ ÇʵåµéÀ» ÀԷ¹޴ ¹æ½ÄÀÌ´Ù.

±×¸² 3 : BBS¿¡¼ ÀüÀÚ¿ìÆíÀ» ¾²°íÀÚ ÇÒ ¶§ ³ªÅ¸³ª´Â Æû¹®
Æû¹®ÀÇ ¹®¹ýÀº ´ÙÀ½°ú °°´Ù.
- <form> ... </form>
: HTML ¹®¼³»¿¡ Æû¹®À» ÁöÁ¤ÇÑ´Ù. ¾Æ·¡ÀÇ Å±׵éÀº ¸ðµÎ ÀÌ Å±׾ȿ¡ ¿À°Ô µÈ´Ù.
- action : CGI ÇÁ·Î±×·¥ÀÇ URL
- method : "GET" ¶Ç´Â "POST"
- enctype : ÀÎÄÚµå(encode) Çü½ÄÀ¸·Î¼ "POST" °æ¿ì¸¸ °¡´ÉÇÏ´Ù. ÀϹÝÀûÀ¸·Î "application/x-www-form-urlencoded"·Î
ÁöÁ¤µÇ¸ç, ÈÀÏ ¾÷·ÎµåÀÏ °æ¿ì¿¡´Â "multipart/form-data"·Î ÁöÁ¤µÈ´Ù.
- <input>
: ÀÔ·ÂÇʵåµéÀ» ÁöÁ¤ÇÑ´Ù.
- type : "text", "password", "checkbox", "radio", "submit", "reset" Áß Çϳª
- name : À̸§À» ÁöÁ¤ÇÑ´Ù.
- value : ÇʵåÀÇ °ªÀ» ÁöÁ¤ÇÑ´Ù.
- checked : "checkbox"¿Í "radio"¿¡¼ »ç¿ëÇÑ´Ù.
- size : ÇʵåÀÇ Å©±â¸¦ ÁöÁ¤ÇÑ´Ù.
- maxlength : ½ÇÁ¦ ÀÔ·ÂÇÒ ¼ö ÀÖ´Â ÃÖ´ë ¹®ÀÚ¼ö¸¦ ÁöÁ¤ÇÑ´Ù.
- <select> ... </select>
: ¿©·¯ Ç׸ñ ¸®½ºÆ® Áß¿¡¼ ¼±ÅÃÀ» ÁöÁ¤ÇÑ´Ù.
- name : À̸§À» ÁöÁ¤ÇÑ´Ù.
- size : Ç׸ñ ¼ö¸¦ ÁöÁ¤ÇÑ´Ù.
- multiple : ´ÙÁß ¼±ÅÃÀ» °¡´ÉÇÏ°Ô ÇÑ´Ù.
- <option>
: <select> ű׾ȿ¡ ¿À¸ç, °¢ Ç׸ñÀ» ³ªÅ¸³½´Ù.
- selected : ±âº»ÀûÀ¸·Î ¼±ÅÃµÇ°Ô ÇÑ´Ù.
- <textarea> ... </textarea>
: ´Ù¼öÀÇ ¶óÀÎÀ» °®´Â ÅØ½ºÆ® ÀÔ·ÂÇʵ带 ÁöÁ¤ÇÑ´Ù.
- name : À̸§À» ÁöÁ¤ÇÑ´Ù.
- rows : ÇàÀÇ Å©±â¸¦ ÁöÁ¤ÇÑ´Ù.
- cols : ¿ÀÇ Å©±â¸¦ ÁöÁ¤ÇÑ´Ù.
2.3 CGIÀÇ ÀÔ·Â
ÀμöµéÀº ´ÙÀ½°ú °°Àº ÇüÅ·Π³Ñ¾î¿Â´Ù.
NAME1=VALUE1&NAME2=VALUE2...
"GET" ¹æ½Ä¿¡¼´Â À§ÀÇ ÀμöµéÀÌ "QUERY_STRING"À̶ó´Â ȯ°æº¯¼ö¸¦
ÅëÇØ ³Ñ¾î¿À¸ç, "POST" ¹æ½Ä¿¡¼´Â À§ÀÇ ÀμöµéÀÌ "stdin"À» ÅëÇØ
³Ñ¾î¿À°Ô µÈ´Ù. ±×¿Ü ÇÊ¿äÇÑ Á¤º¸µéÀº ´Ù¸¥ ȯ°æº¯¼öµéÀ» ÅëÇØ ³Ñ¾î¿À°Ô µÈ´Ù. ³Ñ¾î¿À´Â
ÀμöµéÀº Ç¥ÁØ URL Çü½ÄÀ¸·Î ÀÎÄÚµåµÇ¾î ³Ñ¾î¿À¹Ç·Î ÀûÀýÈ÷ µðÄÚµå(decode)½Ãų Çʿ䰡 ÀÖ´Ù.
ÀÎÄÚµå Çü½ÄÀº °ø¹éÀº '+'·Î º¯È¯µÇ°í, Ư¼ö¹®ÀÚ´Â %XX(16Áø¼ö)·Î º¯È¯µÈ´Ù.
2.4 CGIÀÇ Ãâ·Â
CGI´Â ¼¼°¡ÁöÀÇ Çì´õ - Location, Content-type, Status - ¸¦ Á¤ÀÇÇϰí ÀÖ´Ù. ¼¹ö´Â CGIÀÇ Ãâ·ÂÀÎ ÀÌ
Çì´õÁ¤º¸¸¦ HTTP ÀÀ´äÇì´õ(HTTP response header)¿¡ ÀûÀýÈ÷ »ðÀÔÇÏ¿© Ŭ¶óÀÌ¾ðÆ®·Î ³Ñ°ÜÁØ´Ù.
- Location
: ÀÚ·áÀÚü¸¦ ³Ñ°ÜÁÖ´Â ´ë½Å¿¡ ÀÚ·á°¡ ÀÖ´Â À§Ä¡¸¦ ³Ñ°ÜÁØ´Ù.
¿¹)
Location: http://host.domain/index.html
- Content-type
: ³Ñ°ÜÁÙ ÀÚ·áÇü½ÄÀ» ÁöÁ¤Çϰí ÀڷḦ ³Ñ°ÜÁØ´Ù. ÀÚ·áÇü½ÄÀº MIME(Multipurpose Internet Mail Extensions -
http://www.graphcomp.com/info/specs/mime.html)
Çü½ÄÀ» µû¸£°Ô µÈ´Ù. MIME Çü½ÄÀº Çü½Ä/ºÎÇü½Ä°ú ÇÊ¿äÇÑ Àμöµé·Î Á¤ÀǵȴÙ.
¿¹)
Content-type: text/html
<html>
..
</html>
- Status
: °á°úÄڵ带 ÁöÁ¤ÇÑ´Ù.
¿¹)
Status: 500 Internal Server Error
- NPH(No-Parse Header)
: HTTP ÀÀ´äÇì´õ Àüü¸¦ CGI ÇÁ·Î±×·¥ÀÌ Ãâ·Â½ÃÄÑÁÖ´Â ÇüÅÂÀÌ´Ù.
¿¹)
HTTP/1.0 200 OK
Content-type: text/html
<html>
..
</html>
2.5 ÈÀÏ ¾÷·Îµå
ÈÀÏ ¾÷·Îµå´Â Netscape 2.0 À̻󿡼 Áö¿øµÇ¸ç, ¾÷·ÎµåÇϰíÀÚ ÇÏ´Â ÈÀÏÀ»
´ëÈ»óÀÚ¿¡¼ ¼±ÅÃÇÏ¿© ¼¹öÂÊÀ¸·Î Àü¼Û½ÃŲ´Ù. ´ÙÀ½ ±×¸²Àº ÈÀÏ ¾÷·Îµå¸¦
ÀÌ¿ëÇÏ¿© ¿¹ÀÌ´Ù.

±×¸² 4 : BBS¿¡¼ °ø°³ÀÚ·á½Ç¿¡ ¾÷·ÎµåÇϰíÀÚ ÇÒ ¶§ ³ªÅ¸³ª´Â ´ëÈ»óÀÚ
ÈÀϾ÷·Îµå¸¦ À§Çؼ´Â "type"ÀÌ "file"ÀÎ "<input>" ű׸¦ ÀÌ¿ëÇÏ¸é µÇ¸ç,
¶ÇÇÑ "enctype"À» "multipart/form-data"·Î ÁöÁ¤ÇØ¾ß µÈ´Ù. À̸¦ ÀÌ¿ëÇϸé "browse"¹öưÀÌ
¿ìÃø¿¡ ³ªÅ¸³ª°Ô µÈ´Ù. ÈÀÏ ¾÷·Îµå Æû¹®ÀÇ ¿¹´Â ´ÙÀ½°ú °°´Ù.
<form enctype="multipart/form-data" method="post" action="URL">
Upload File : <br>
<input type="file" name="filename" size="50"><br>
Keyword : <br>
<input type="text" name="keyword" size="50"><br>
File Description :<br>
<textarea name="description" cols="70" rows="5"></textarea><br>
<input type="submit" value="Upload">
</form>
À§ÀÇ Æû¹®À» ÀûÀýÈ÷ ÀÔ·ÂÇÑ µÚ, "Upload"¹öưÀ» ´©¸£¸é,
CGI´Â ȯ°æº¯¼ö¿Í "stdin"À¸·Î ´ÙÀ½°ú °°Àº µ¥ÀÌŸ¸¦ Àü¼Û¹Þ°Ô µÈ´Ù.
ȯ°æº¯¼ö
getenv("CONTENT_TYPE") => multipart/form-data; boundary=---------------------------19241282464929
getenv("CONTENT_LENGTH") => 7209
stdin
-----------------------------19241282464929
Content-Disposition: form-data; name="filename"; filename="C:\Program Files\Netscape\Navigator\Readme.txt"
Content-Type: text/plain
Netscape Navigator 2.0 is subject to the terms detailed in the...
...
...
-----------------------------19241282464929
Content-Disposition: form-data; name="keyword"
text
-----------------------------19241282464929
Content-Disposition: form-data; name="description"
This is "readme.txt" file.
-----------------------------19241282464929--
- multipart/form-data : "multipart"´Â MIME Çü½ÄÁß º¹ÇÕ¹®¼ÀÓÀ» ³ªÅ¸³»°í,
"form-data"´Â ÀÌÁß ÈÀϾ÷·Îµå¿¡ ÀÌ¿ëµÇ´Â Çü½ÄÀÓÀ» ³ªÅ¸³½´Ù.
- boundary : º¹ÇÕ¹®¼³»ÀÇ °¢ ¹®¼µéÀ» ±¸º°ÇÏ´Â ºÐ¸®ÀÚ(delimeter)¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ ºÐ¸®ÀÚ´Â
¹®¼³»¿¡ ³ªÅ¸³ªÁö ¾Ê´Â ¹®ÀÚ¿À» ÀÌ¿ëÇÏ¿©¾ß ÇÑ´Ù.
- ¹®¼°£ÀÇ ºÐ¸® : ºÐ¸®ÀÚ ¾Õ¿¡ "--"¸¦ µ¡ºÙ¿©¼ ±¸º°ÇÑ´Ù.
- Àüü º¹ÇÕ¹®¼ÀÇ ³¡ : ºÐ¸®ÀÚ ¾ÕµÚ·Î "--"¸¦ µ¡ºÙ¿©¼ ¹®¼ÀÇ ³¡À» ³ªÅ¸³½´Ù.
- CONTENT_LENGTH : º¹ÇÕ¹®¼ ÀüüÀÇ Å©±â¸¦ ³ªÅ¸³½´Ù.
- Content-DispositionÀÇ name Çʵå : ³Ñ¾î¿À´Â ÀμöÀÇ À̸§À» ³ªÅ¸³½´Ù.
- Content-DispositionÀÇ ¹ØºÎºÐ : ³Ñ¾î¿À´Â ÀμöÀÇ °ªÀ» ³ªÅ¸³½´Ù.
- Content-DispositionÀÇ filename Çʵå : ¾÷·ÎµåÇÑ ÈÀϸíÀ» ³ªÅ¸³½´Ù.
- Content-Disposition ´ÙÀ½ÀÇ Content-Type : ¾÷·ÎµåÇÑ ÈÀÏÀÇ MIME Çü½ÄÀ» ³ªÅ¸³½´Ù.
À§ÀÇ ¿¹¿¡¼ "keyword" Àμö´Â "text"¸¦ °ªÀ¸·Î °¡Áö¸ç, "description"
Àμö´Â "This is .."¸¦ °ªÀ¸·Î °¡Áø´Ù.
"filename" Àμö´Â ´ëÈ»óÀÚ¿¡¼ ¼±ÅÃÇÑ ÈÀϸíÀ» °¡Áö¸ç,
¾÷·ÎµåµÈ ÈÀÏÀº "text/plain" Çü½ÄÀÇ ÈÀÏÀ̰í, "Netscape Navigator 2.0 is ..." ºÎºÐÀÌ
¾÷·ÎµåµÈ ÈÀÏÀÇ ³»¿ëÀÌ´Ù.
3. µ¿Àû¹®¼(Dynamic Document)
±âÁ¸ÀÇ WWW ½Ã½ºÅÛ¿¡¼ Ŭ¶óÀÌ¾ðÆ®´Â Ç×»ó »ç¿ëÀÚÀÇ ÀԷ¸¸À» µû¶ó »õ·Î¿î ÀڷḦ
°¡Á®¿À¸ç, ¼¹ö´Â Ŭ¶óÀ̾ðÆ®ÀÇ ¿äû¸¸À» µû¶ó °á°ú ÀڷḦ ³Ñ°ÜÁÖ´Â Çǵ¿ÀûÀÎ ÀÔÀå¿¡ ÀÖ´Ù.
ÀÌ¿¡ ºñÇØ, µ¿Àû¹®¼´Â »ç¿ëÀÚÀÇ ÀÔ·ÂÀÌ ¾ø¾îµµ ÀÏÁ¤ÁֱⰡ Áö³ª¸é »õ·Î¿î ÀڷḦ °¡Á®¿Ã ¼ö
ÀÖÀ¸¸ç, ¼¹ö°¡ Ŭ¶óÀ̾ðÆ®ÀÇ ¿äû ¾øÀ̵µ »õ·Î¿î ÀڷḦ ³Ñ°ÜÁÖ´Â ´Éµ¿ÀûÀÎ ÀÔÀå¿¡ ¼³ ¼ö ÀÖ°Ô ÇÑ´Ù.
ÀÌ ¹æ½ÄÀº ÇöÀç Netscape 1.1 À̻󿡼¸¸ Áö¿øµÈ´Ù.
3.1 Ŭ¶óÀÌ¾ðÆ® ´ç±â±â(Client Pull)
3.1.1 ÀÛµ¿¿ø¸®
»ç¿ëÀÚÀÇ ÀÔ·ÂÀÌ ¾ø¾îµµ ÀÏÁ¤ÁֱⰡ Áö³ª¸é »õ·Î¿î ÀڷḦ °¡Á®¿Ã ¼ö ÀÖ´Â ¹æ¹ýÀ¸·Î¼,
HTML ¹®¼³»¿¡ ÇöÀç ¹®¼ÀÇ Áö¼Ó½Ã°£°ú ´ÙÀ½ ¹®¼¸¦ ¸í½ÃÇϰí Áö¼Ó½Ã°£ÀÌ ³¡³ª¸é ´ÙÀ½ ¹®¼¸¦
´Ù½Ã ºÒ·¯¿À°ÔÇÑ´Ù. ÀÌ °úÁ¤À» ±×¸²À¸·Î ³ªÅ¸³»¸é ´ÙÀ½°ú °°´Ù.

±×¸² 5 : Ŭ¶óÀÌ¾ðÆ® ´ç±â±âÀÇ ÀÛµ¿¿ø¸®
3.1.2 ÀÀ¿ëºÐ¾ß
´ÙÀ½°ú °°Àº ºÐ¾ß¿¡ ÀÀ¿ëÀÌ °¡´ÉÇÏ´Ù.
- ÁÖ±âÀûÀ¸·Î ȸéÀÌ ¹Ù²î´Â ÇÁ¸®Á¨Å×À̼Ç
- Á¤ÇØÁø °æ·Î¸¦ µû¶ó WWW °ø°£À» ¿©Çà
- ¹«ÀÛÀ§·Î »ý¼ºµÈ ´ÙÀ½ ¹®¼¸¦ µû¶ó WWW °ø°£À» ¿©Çà
- À̹ÌÁö¿¡ Àû¿ëÇÏ¿© ¾Ö´Ï¸ÞÀÌ¼Ç È¿°ú
3.1.3 ¹®¹ý
´ÙÀ½°ú °°ÀÌ ¸ÞŸÅ±×(meta tag)¾È¿¡ Áö¼Ó½Ã°£°ú ´ÙÀ½ ¹®¼¸¦ ¸í½ÃÇϸç, ÀÌ ¸ÞŸÅ±״Â
HTML ¹®¼ÀÇ HEAD ºÎºÐ¿¡ ¿Í¾ß ÇÑ´Ù.
<META HTTP-EQUIV="Refresh" CONTENT="12; URL=http://host.domain/next.html">
- META : Ç¥ÁØ HTML 3.0 ű׷μ, HTTP ÀÀ´äÇì´õ(HTTP response header)¸¦ ½Ã¹Ä·¹À̼ÇÇÑ´Ù.
- CONTENT : Áö¼Ó½Ã°£ (ÃÊ ´ÜÀ§)
- URL : ´ÙÀ½¹ø¿¡ ¿äûÇÒ ¹®¼ÀÇ URL
À¯ÀÇÇÒ Á¡Àº ´ÙÀ½°ú °°´Ù.
- Refresh ¸í·ÉÀº Çѹø¸¸ À¯È¿ÇÏ´Ù. ¸¸¾à ´ÙÀ½ ¹®¼¿¡ refresh°¡ ¸í½ÃµÇ¾î ÀÖÁö ¾ÊÀ¸¸é, µ¿Àû¹®¼´Â ÁߴܵȴÙ.
- ¿¬¼ÓÀûÀ¸·Î °è¼Ó refresh°¡ ¸í½ÃµÇ¸é refresh°¡ ¾ø´Â ¹®¼°¡ ¿Ã ¶§±îÁö °è¼ÓµÇ¸ç, Áß´ÜÇÏ·Á¸é
¹®¼¸¦ ´Ý¾Æ¾ß ÇÑ´Ù.
- CONTENT°¡ 0À¸·Î ÁöÁ¤µÉ °æ¿ì, Ŭ¶óÀÌ¾ðÆ®´Â ÇÒ ¼ö ÀÖ´Â ÃÖ´ëÇÑ »¡¸® ´ÙÀ½ ¹®¼¸¦ °¡Á®¿Â´Ù.
- ÀÚ·áÇü½ÄÀº À̹ÌÁö, ¿Àµð¿Àµµ °¡´ÉÇÏ´Ù.
3.1.4 Æò°¡
- Ŭ¶óÀÌ¾ðÆ®°¡ ¸Å¹ø »õ·Î¿î ¿¬°á(connection)À» ¿¾î¾ß ÇϹǷΠºñÈ¿À²ÀûÀÌ´Ù.
- ¸ÞŸÅ±׸¦ ÀÌ¿ëÇÑ µ¿Àû¹®¼ÀÌ´Ù.
3.2 ¼¹ö ¹Ð±â(Server Push)
3.2.1 ÀÛµ¿¿ø¸®
Ŭ¶óÀ̾ðÆ®ÀÇ ¿äû ¾øÀ̵µ ¼¹öÂÊ¿¡¼ °è¼ÓÇÏ¿© »õ·Î¿î ÀڷḦ º¸³»´Â ¹æ¹ýÀ¸·Î¼, MIME Çü½ÄÁß
"multipart" Çü½ÄÀ» ÀÌ¿ëÇÏ¿© º¹ÇÕ¹®¼ÇüÅ·Π»õ·Î¿î ÀڷḦ °è¼Ó º¸³½´Ù. µû¶ó¼ ¼¹öÂÊ¿¡¼ º¸´Ù
´Éµ¿ÀûÀÎ ÀÚ·áÀÇ Àü¼ÛÀÌ °¡´ÉÇÏ´Ù.
ÀÌ °úÁ¤À» ±×¸²À¸·Î ³ªÅ¸³»¸é ´ÙÀ½°ú °°´Ù.

±×¸² 6 : ¼¹ö ¹Ð±âÀÇ ÀÛµ¿¿ø¸®
3.2.2 ÀÀ¿ëºÐ¾ß
ÀÀ¿ëºÐ¾ß´Â Ŭ¶óÀÌ¾ðÆ® ´ç±â±â¿Í À¯»çÇϸç, HTML ¹®¼³»ÀÇ ÀϺκÐ(À̹ÌÁö, ¿Àµð¿À µî)¸¸À»
µ¿ÀûÀ¸·Î º¸ÀÌ°Ô ÇÏ´Â °ÍÀÌ °¡´ÉÇÏ´Ù.
3.2.3 ¹®¹ý
¼¹öÂÊ¿¡¼ »ý¼ºµÈ HTTP ÀÀ´ä ¸Þ½ÃÁö´Â ´ÙÀ½°ú °°¾Æ¾ß ÇÑ´Ù.
HTTP/1.0 200 OK
Content-type: multipart/x-mixed-replace;boundary=TestBoundary
--TestBoundary
Content-type: text/plain
first document
--TestBoundary
Content-type: text/html
<html>
<body>
second document
</body>
</html>
--TestBoundary--
À§ÀÇ ¿¹´Â °¢°¢ "first document", "second document" ¸¦ Ãâ·ÂÇÏ´Â
µÎ °³ÀÇ ¿¬¼ÓÀûÀÎ ¹®¼·Î ±¸¼ºµÈ º¹ÇÕ¹®¼À̸ç, ¹®¼°¡ º¯ÇÏ´Â ½Ã°£Àº ¼¹öÂÊ¿¡¼ µÎ¹øÂ°
¹®¼¸¦ Àü¼ÛÇÏ´Â ½Ã±â¸¦ Á¶Á¤ÇÔÀ¸·Î½á °¡´ÉÇÏ´Ù.
- multipart/x-mixed-replace : "multipart"´Â MIME Çü½ÄÁß º¹ÇÕ¹®¼¸¦, "x-mixed-replace"´Â
º¹ÇÕ¹®¼Áß¿¡¼µµ ¼¹ö ¹Ð±â¿¡ ÀÌ¿ëµÇ´Â ¹®¼Çü½ÄÀÓÀ» ³ªÅ¸³½´Ù. ¾ÕÀÇ "x-"´Â ¾ÆÁ÷ Á¤½ÄÀ¸·Î
Ç¥ÁØÈµÇÁö ¾ÊÀº Çü½ÄÀÓÀ» ³ªÅ¸³½´Ù.
- boundary : º¹ÇÕ¹®¼³»ÀÇ °¢ ¹®¼µéÀ» ±¸º°ÇÏ´Â ºÐ¸®ÀÚ(delimeter)¸¦ ÁöÁ¤ÇÑ´Ù. ÀÌ ºÐ¸®ÀÚ´Â
¹®¼³»¿¡ ³ªÅ¸³ªÁö ¾Ê´Â ¹®ÀÚ¿À» ÀÌ¿ëÇÏ¿©¾ß ÇÑ´Ù. NCSA HTTPD¿¡¼´Â boundary¾Õ¿¡ °ø¹éÀÌ ¿À¸é ¾ÈµÈ´Ù.
- ¹®¼°£ÀÇ ºÐ¸® : ºÐ¸®ÀÚ ¾Õ¿¡ "--"¸¦ µ¡ºÙ¿©¼ ±¸º°ÇÑ´Ù.
- Àüü º¹ÇÕ¹®¼ÀÇ ³¡ : ºÐ¸®ÀÚ ¾ÕµÚ·Î "--"¸¦ µ¡ºÙ¿©¼ ¹®¼ÀÇ ³¡À» ³ªÅ¸³½´Ù.
µ¿Àû¹®¼¸¦ ÁߴܽÃų·Á¸é ¼¹öÂÊ¿¡¼ Àüü º¹ÇÕ¹®¼¸¦ ¸ðµÎ º¸³»¾ú°Å³ª, Ŭ¶óÀ̾ðÆ®ÂÊ¿¡¼
»ç¿ëÀÚ°¡ Áß´Ü ¹öưÀ» ´©¸£¸é µÈ´Ù.
´ÙÀ½Àº 1ºÎÅÍ 10±îÁöÀÇ ¼ýÀÚ¸¦ ¿¬¼ÓÀûÀ¸·Î Ãâ·ÂÇÏ´Â C ¿¹Á¦ ÇÁ·Î±×·¥ÀÌ´Ù.
#include <stdio.h>
main()
{
int i;
printf("Content-type: multipart/x-mixed-replace;boundary=TestBoundary\n\n");
for(i = 1; i <= 10; i++)
{
printf("--TestBoundary\n");
printf("Content-type: text/plain\n\n");
printf("count: %d\n", i);
}
printf("--TestBoundary--\n");
}
3.2.4 Æò°¡
- ¿¬°áÀÌ °è¼Ó À¯ÁöµÇ¾î Ŭ¶óÀÌ¾ðÆ® ´ç±â±âº¸´Ù È¿À²ÀûÀÌ´Ù - ƯÈ÷ ´Ü½Ã°£¿¡ ¹Ù²ð½Ã¿¡ À¯¸®ÇÏ´Ù.
- ¼¹öÂÊ¿¡¼ Á¦¾î±ÇÀ» °¡Áö°í ´Éµ¿ÀûÀ¸·Î Á¶ÀýÀÌ °¡´ÉÇÏ´Ù.
- ÁߴܽÃŰ±â°¡ ¿ëÀÌÇÏ´Ù.
- ¹®¼³»ÀÇ ÀϺκи¸À» º¯È½Ãų ¼ö ÀÖ´Ù. - ¿¹) À̹ÌÁö URLÀ» CGI·Î ¿¬°á½Ã۰í CGI¿¡¼ µ¿Àû¹®¼·Î °¢ ±×¸²µéÀ» »ý¼º½ÃŲ´Ù.
- Æ÷Æ®°¡ ¿¬°á³»³» ÇÒ´çµÇ¾î¾ß¸¸ ÇÏ´Â ´ÜÁ¡ÀÌ ÀÖ´Ù.
- MIME Çü½ÄÀ» ÀÌ¿ëÇÑ µ¿Àû¹®¼ÀÌ´Ù.
4. CGI ÇÁ·Î±×·¥ÀÇ ¸ðµ¨¸µ ¹× µð¹ö±ë
4.1 »óÅÂÁ¤º¸ À¯Áö ¸ðµ¨(State-Info Management Model)
WWWÀÇ Å¬¶óÀ̾ðÆ®/¼¹ö ¸ðµ¨À» ±¸¼ºÇÏ´Â HTTP ÇÁ·ÎÅäÄÝÀº ¿¬°áÀÌ ¾ø°í(connectionless),
»óŸ¦ À¯ÁöÇÏÁö ¾Ê´Â(stateless) ÇÁ·ÎÅäÄÝÀÌ´Ù. ¿¬°áÀÌ ¾ø´Ù´Â °ÍÀº ÇѹøÀÇ ¿¬°á¿¡
¿ÀÁ÷ ÇϳªÀÇ ¿äû¸¸À» ÇÒ ¼ö ÀÖ´Ù´Â °ÍÀ» ÀǹÌÇϸç, »óŸ¦ À¯ÁöÇÏÁö ¾Ê´Â´Ù´Â °ÍÀº
¿¬¼ÓÀûÀΠ󸮿¡ ÇÊ¿äÇÑ ¸Þ¸ð¸®¸¦ °¡Áö°í ÀÖÁö ¾Ê´Ù´Â °ÍÀ» ÀǹÌÇÑ´Ù. »óŸ¦ À¯ÁöÇÏÁö
¾Ê±â ¶§¹®¿¡ ¾ò´Â ÀÌÁ¡Àº ¼¹ö°¡ ºÎ°¡ÀûÀÎ Á¤º¸µéÀ» À¯ÁöÇÒ Çʿ䰡 ¾ø±â ¶§¹®¿¡ ´õ¿í
È¿À²ÀûÀ¸·Î ÀÛµ¿µÉ ¼ö ÀÖ´Ù´Â Á¡ÀÌ´Ù. ÇÏÁö¸¸ ¹Ý¸é¿¡ ÀÌÀü 󸮷κÎÅÍ ÇÊ¿äÇÑ Á¤º¸µéÀ»
¸Å ¿¬°á¸¶´Ù ´Ù½Ã Àü¼ÛÇØ¾ß ÇÑ´Ù´Â ´ÜÁ¡À» ¾È°í ÀÖ´Ù. ¿¹¸¦ µé¾î BBS¿¡¼ ÀÌÀü¸Þ´º·Î
µ¹¾Æ°¡°íÀÚ ÇÒ °æ¿ì, ÀÌÀü 󸮷κÎÅÍ Çö »óÅ¿¡ °ü·ÃµÈ Á¤º¸µéÀ» ¸ðµÎ ³Ñ°Ü¹Þ¾Æ¾ß ÇÑ´Ù.
WWW ½Ã½ºÅÛÀº Ŭ¶óÀÌ¾ðÆ®¿Í ¼¹ö°£ÀÇ ¿¬¼ÓÀûÀÎ Åë½Å¿¡ ÀÇÇØ ÀÛ¾÷À» ¼öÇàÇÏ°Ô µÇ¸ç,
ÀÌ °úÁ¤¿¡¼ ÇÊ¿äÇÑ CGIµéÀÌ Àüü ÀÛ¾÷È帧¿¡ µû¶ó ¼øÂ÷ÀûÀ¸·Î ½ÇÇàµÇ°Ô µÈ´Ù.
µû¶ó¼ °¢ CGIÀÇ ½ÇÇàÀº Àüü ÀÛ¾÷È帧 ÁßÀÇ ÇÑ ÇÁ·Î¼¼½º·Î °£ÁÖµÉ ¼ö ÀÖÀ¸¸ç,
Àüü ÀÛ¾÷Àº ´ÙÀ½ ±×¸²°ú °°ÀÌ °¢ CGIµéÀÇ »óŵµÇ¥(state diagram)·Î ³ªÅ¸³¾ ¼ö ÀÖ´Ù.

±×¸² 7 : CGIµé°£ÀÇ »óŵµÇ¥
°¢ CGIµéÀº ´ÙÀ½ CGIÀÇ ½ÇÇà¿¡ ÇÊ¿äÇÑ ¸ðµç Á¤º¸µéÀ» »ý¼º½ÃÄÑ, À̸¦ URLÀÇ Àμö³ª
Æû¹®ÀÇ "hidden" Çü½ÄÀÇ "<input>" ű׸¦ ÀÌ¿ëÇÏ¿©
Ŭ¶óÀÌ¾ðÆ®¿¡ ¹ÝȯµÇ´Â HTML ¹®¼¿¡ Æ÷ÇÔ½ÃŲ´Ù. ±×·¯¸é Ŭ¶óÀÌ¾ðÆ®´Â »ç¿ëÀÚÀÇ
¼±Åÿ¡ µû¶ó ´ÙÀ½ CGI¸¦ ¼öÇàÇÏ°Ô µÇ¸ç, HTML ¹®¼³»¿¡ Æ÷ÇÔµÈ Á¤º¸µéÀ» ´ÙÀ½ CGI·Î
³Ñ°ÜÁÖ°Ô µÈ´Ù. ÀÌ ÁøÇà°úÁ¤À» ±×¸²À¸·Î ³ªÅ¸³»¸é ´ÙÀ½°ú °°´Ù.

±×¸² 8 : CGIµéÀÇ ÁøÇà°úÁ¤
À§ÀÇ ±×¸²¿¡¼ CGI A´Â ´ÙÀ½ CGI B¿¡ ÇÊ¿äÇÑ Á¤º¸ B¿Í ±× ´ÙÀ½ CGI C¿¡ ÇÊ¿äÇÑ Á¤º¸ A¸¦
»ý¼º½ÃŲ µÚ, ÀÌ Á¤º¸µéÀ» HTML ¹®¼³»¿¡ Æ÷ÇÔ½ÃÄÑ Å¬¶óÀ̾ðÆ®ÂÊ¿¡ ³Ñ°ÜÁØ´Ù. Ŭ¶óÀÌ¾ðÆ®´Â
´Ù½Ã URL¿¡ ÀÌ Á¤º¸µéÀ» Æ÷ÇÔ½ÃÄÑ CGI B¸¦ È£ÃâÇÑ´Ù. CGI B´Â ³Ñ°Ü¹ÞÀº Á¤º¸µé Áß ÇÊ¿äÇÑ
Á¤º¸ÀÎ Á¤º¸ B¸¦ ÀÌ¿ëÇÏ¿© ÀÛ¾÷À» ¼öÇàÇÑ µÚ, ´ÙÀ½¹ø CGIÀÎ CGI C¿¡ ÇÊ¿äÇÑ Á¤º¸ A¸¦ HTML
¹®¼³»¿¡ Æ÷ÇÔ½ÃÄÑ ³Ñ°ÜÁØ´Ù. ÀÌ °úÁ¤¿¡¼ CGI A´Â ºñ·Ï CGI B¿¡´Â ÇÊ¿äÇÏÁö ¾ÊÁö¸¸
CGI C¿¡ ÇÊ¿äÇÑ Á¤º¸ A¸¦ »ý¼º½ÃÄÑ CGI B·Î ³Ñ°ÜÁÖ°í, CGI B´Â ÀÌ Á¤º¸ A¸¦ ´Ü¼øÈ÷
CGI CÂÊÀ¸·Î ³Ñ°Ü¸¸ ÁÖ´Â °ÍÀ» ¾Ë ¼ö ÀÖ´Ù. ÀÌÈÄ Å¬¶óÀÌ¾ðÆ®´Â Æû¹®ÀÇ Á¤º¸¿Í ÇÔ²² ÇÊ¿äÇÑ
Á¤º¸ A¸¦ CGI CÂÊÀ¸·Î ³Ñ°ÜÁÖ°Ô µÈ´Ù.
¿©·¯ CGIµéÀ» ÀÌ¿ëÇÏ¿© ÀüüÀûÀÎ ÇϳªÀÇ ½Ã½ºÅÛÀ» ±¸ÃàÇÒ °æ¿ì, ´ÙÀ½°ú °°Àº µÎ°¡Áö
¹æ½Ä Áß Çϳª¸¦ ÀÌ¿ëÇÏ¿© ÀÛ¾÷ ÁøÇà°úÁ¤¿¡¼ ÇÊ¿äÇÑ Á¤º¸¸¦ À¯ÁöÇÏ¿©¾ß ÇÑ´Ù.
1) °¢ CGIµéÀÌ ÇÊ¿ä·Î ÇÏ´Â Á¤º¸µéÀ» ¸ðµÎ ÃëÇÕÇÏ¿© Ŭ¶óÀÌ¾ðÆ®¿Í ¼¹ö»çÀÌÀÇ Åë½Å¿¡
Ç×»ó Æ÷ÇÔ½ÃŲ´Ù.
- ÇÊ¿äÇÑ Á¤º¸µéÀÌ ¸¹Áö ¾ÊÀ» °æ¿ì¿¡ ÀûÇÕÇϸç, ½±°Ô ½Ã½ºÅÛÀ» ¼³°èÇÒ ¼ö ÀÖ´Ù.
- ÇÊ¿äÇÑ Á¤º¸µéÀÌ ¸¹À» °æ¿ì´Â Åë½Å»óÀÇ ºÎÇϰ¡ Ä¿Áö¸ç, URL¿¡ Àμö¸¦ Æ÷ÇÔ½Ãų °æ¿ì¿¡´Â
URL Å©±âÀÇ Á¦¾àÀ¸·Î ÀÎÇØ Á¤º¸°¡ ©¸± ¼ö°¡ ÀÖ´Ù.
2) Àüü ÀÛ¾÷ÁøÇà°úÁ¤ÀÇ »óŵµÇ¥¸¦ ÀÛ¼ºÇÑ µÚ, ¸ðµç °¡´ÉÇÑ °æ·Î¿¡ ÇÊ¿äÇÑ ÃÖ¼ÒÇÑÀÇ Á¤º¸µéÀ»
°¢ CGIµéÀÌ »ý¼º½ÃŰ°Ô ÇÑ´Ù.
- Ŭ¶óÀÌ¾ðÆ®¿Í ¼¹ö»çÀÌÀÇ Åë½Å½Ã¿¡ ÇÊ¿äÇÑ Á¤º¸µé¸¸À» Æ÷ÇÔ½ÃŰ¹Ç·Î, Åë½Å»óÀÇ ºÎÇϰ¡
ÀÛ¾ÆÁø´Ù.
- ½Ã½ºÅÛÀÇ °æ·Î°¡ º¹ÀâÇÒ °æ¿ì, ½Ã½ºÅÛ ¼³°è°¡ ´õ¿í º¹ÀâÇØ Áø´Ù.
4.2 ÅëÇÕÀÎÅÍÆäÀ̽º ¸ðµ¨
¸¹Àº CGIµé·Î ±¸¼ºµÈ WWW ½Ã½ºÅÛÀÏ °æ¿ì, ÅëÇÕµÈ ÀÎÆÛÅ×À̽º¸¦ ÅëÇÏ¿© ÇϳªÀÇ CGI¸¦ µÎ¸é
º¸´Ù Àϰü¼ºÀ» °¡Áö°í ½Ã½ºÅÛÀ» ±¸¼ºÇÒ ¼ö ÀÖ´Ù.
¿¹) BBS¿¡¼ »ç¿ëÀÚ¸¦ »èÁ¦ÇϰíÀÚ ÇÒ ¶§ÀÇ URL
/cgi-bin/DeleteUser?ID=guest : CGI À̸§ÀÌ ¼öÇàÀÛ¾÷À» ÁöÁ¤ÇÑ´Ù.
/cgi-bin/BBS?Menu=User&Cmd=Delete&ID=guest : CGI´Â BBS Çϳª¸¸ µÎ°í ÀμöµéÀ» ÅëÇØ ¼öÇàÀÛ¾÷À» ÁöÁ¤ÇÑ´Ù.
¿©·¯ CGI¸¦ ÅëÇÕµÈ ÀÎÅÍÆäÀ̽º·Î ´ÙÀ½°ú °°ÀÌ ¸ðµ¨¸µÇÒ ¼ö ÀÖ´Ù.

±×¸² 9 : ÅëÇÕÀÎÅÍÆäÀ̽º ¸ðµ¨
°¢ ¸ðµâµéÀº ´ÙÀ½°ú °°´Ù.
- decode parameter : "GET", "POST", "upload" µî,
°¢ "METHOD"¿¡ ¸ÂÃß¾î ÀûÀýÇÏ°Ô ÀμöµéÀ» ÇØµ¶ÇÑ´Ù.
- interpret command : ÀμöµéÀ» ºÐ¼®ÇÏ¿© ¾î¶² ÀÛ¾÷À» ¼öÇàÇÒ Áö °áÁ¤ÇÑ´Ù. ¸¸¾à
ÇÊ¿äÇÑ Àμö°¡ ´Ù ³Ñ¾î¿ÀÁö ¾Ê¾ÒÀ¸¸é ¿¡·¯Ã³¸®ÇÑ´Ù.
- check access control : Á¢±Ù±ÇÇÑÀ» Á¦ÇÑÇϰíÀÚ ÇÒ °æ¿ì, ÇöÀç ÀÛ¾÷¿¡ »ç¿ëÀÚÀÇ
Á¢±ÙÀÌ À¯È¿ÇÑ Áö °Ë»çÇÑ´Ù.
- execute adequate external program : ÀûÀýÇÑ ¿ÜºÎ ÇÁ·Î±×·¥À» ½ÇÇà(exec()¸¦ ÀÌ¿ë)ÇÏ¿© °ü·ÃÀÛ¾÷À»
¼öÇàÇÑ´Ù.
- external program : ¿©·¯ CGIµéÀ» ÇϳªÀÇ CGI·Î ÅëÇÕÇÑ ´ë½Å, ¿©·¯ CGIµéÀÇ ÁÖ¿ä ¸ðµâÀ»
¿ÜºÎÇÁ·Î±×·¥µé·Î µÐ´Ù.
- error handler : ¿¡·¯Ã³¸®¸¦ ¼öÇàÇÑ´Ù.
- HTML generator : ¼öÇà°á°ú¸¦ ÀûÀýÇÑ HTML ¹®¼·Î »ý¼º½ÃŲ´Ù.
4.3 µð¹ö±ë
CGI ÇÁ·Î±×·¥Àº ÀϹÝÀûÀÎ ¹æ¹ýÀ¸·Î µð¹ö±ëÀ» ÇϱⰡ °ï¶õÇÏ¸ç ´ÙÀ½°ú °°Àº ¹æ¹ýµéÀ» ÀÌ¿ëÇÒ ¼ö ÀÖ´Ù.
4.3.1 ÀÔ·Â
CGIÀÇ ÀÔ·ÂÀ» ½Ã¹Ä·¹À̼ÇÇϱâ À§Çؼ´Â ¸ÕÀú ȯ°æº¯¼öµéÀ» ÀûÀýÇÏ°Ô ¼³Á¤ÇÑ µÚ, "GET"ÀÎ
°æ¿ì´Â ÀμöµéÀ» "QUERY_STRING"¿¡ ÁöÁ¤ÇÑ µÚ ÇØ´ç CGI¸¦ ½ÇÇà½ÃŰ¸é µÇ¸ç, "POST"ÀÎ
°æ¿ì´Â ÀμöµéÀÇ Å©±â¸¦ "CONTENT_LENGTH"¿¡ ÁöÁ¤Çϰí ÇØ´ç CGI¸¦ ½ÇÇà½ÃŲ ´ÙÀ½
ÀÔ·ÂµÉ ÀμöµéÀ» ÁöÁ¤µÈ Å©±â±îÁö ŸÀÌÇÎÇÏ¸é µÈ´Ù. ÅëÇÕÀÎÅÍÆäÀ̽º ¸ðµ¨ÀÇ °æ¿ì,
¿ÜºÎÇÁ·Î±×·¥µéÀº ¸í·É¾î¿¡ Àμö(*argv[])¸¦ Æ÷ÇÔÇÏ¿© ½ÇÇà½ÃŰ¸é µÈ´Ù.
4.3.2 Ãâ·Â
ÀϹÝÀûÀ¸·Î ÇÁ·Î±×·¥ÀÇ »óŸ¦ ÃßÀûÇϱâ À§ÇØ "stderr"·Î Áß°£°á°ú°ªµéÀ»
Ãâ·Â½ÃŲ´Ù. ÇÏÁö¸¸ WWW ½Ã½ºÅÛ¿¡¼ ¼¹ö´Â CGIÀÇ "stderr"¿Í "stdout"·Î
°¡´Â Ãâ·ÂµéÀ» ¸ðµÎ °¡·Îæ´Ù. µû¶ó¼ Áß°£°á°ú°ªµéÀ» Ãâ·ÂÇϱâ À§Çؼ´Â HTML ¹®¼¸¦ »ý¼º½Ãų¶§
ÁÖ¼®¹®¾È¿¡ ³ÖÀ¸¸é µÈ´Ù. ±×¸®°í ÁøÇà°úÁ¤À» °Ë»çÇϱâ À§Çؼ´Â ¼¹ö¿¡¼ »ý¼ºÇÏ´Â log ÈÀϵéÀ»
ºÐ¼®ÇÏ¸é µÈ´Ù. ¶ÇÇÑ HTTP ÀÀ´äÇì´õºÎºÐÀ» °Ë»çÇϱâ À§Çؼ´Â 80¹ø Æ÷Æ®·Î telnetÀ» ¿¾î
HTTP¸¦ ½Ã¹Ä·¹À̼ÇÇÏ¸é µÈ´Ù. HTTP¸¦ ½Ã¹Ä·¹À̼ÇÇÑ ¿¹´Â ´ÙÀ½°ú °°´Ù.
[cezanne-kyung] telnet cezanne.daum.co.kr 80
Trying 203.248.135.66...
Connected to cezanne.daum.co.kr.
Escape character is '^]'.
GET / HTTP/1.0
HTTP/1.0 200 Document follows
Date: Tue, 12 Mar 1996 23:07:41 GMT
Server: NCSA/1.5
Content-type: text/html
Last-modified: Wed, 21 Feb 1996 15:30:08 GMT
Content-length: 1881
<HTML>
<HEAD>
<TITLE>DAUM ON-LINE</TITLE>
....
5. ÄíŰ(Cookie)
ÄíŰ´Â CGI¿Í °°Àº ¼¹öÂÊ ÀÎÅÍÆäÀ̽º¿¡¼ Ŭ¶óÀÌ¾ðÆ®¿¡ »óÅÂÁ¤º¸¸¦ ÀúÀåÇϰí ÃßÃâÇÒ ¼ö ÀÖ´Â ½Ã½ºÅÛÀÌ´Ù.
Äí۸¦ ÀÌ¿ëÇÏ¸é »óÅÂÁ¤º¸¸¦ È¿À²ÀûÀ¸·Î °ü¸®ÇÒ ¼ö ÀÖ¾î, WWW¿¡ ±â¹ÝÀ» µÐ Ŭ¶óÀ̾ðÆ®/¼¹ö ½Ã½ºÅÛÀ»
´õ¿í È®Àå½Ãų ¼ö ÀÖ´Ù.
5.1 ÀÛµ¿¿ø¸®
¼¹öÂÊ¿¡¼ °á°ú¹®¼¸¦ Ŭ¶óÀÌ¾ðÆ®¿¡ ¹ÝȯÇÒ ¶§, Ŭ¶óÀÌ¾ðÆ®°¡ ÀúÀåÇÒ ÄíŰ(»óÅÂÁ¤º¸)¸¦ °°ÀÌ º¸³¾ ¼ö ÀÖ´Ù.
ÀÌÈÄ¿¡ Ŭ¶óÀÌ¾ðÆ®°¡ ¼¹öÂÊ¿¡ ¹®¼¸¦ ¿äûÇÒ ¶§, ÇöÀç Ŭ¶óÀÌ¾ðÆ®¿¡ ÀúÀåµÈ ÄíŰ Áß Á¶°ÇÀÌ ÀÏÄ¡ÇÏ´Â
Äí۵éÀ» ´Ù½Ã ¼¹öÂÊÀ¸·Î ³Ñ°Ü ÁØ´Ù.
ÀÌ °úÁ¤À» ±×¸²À¸·Î ³ªÅ¸³»¸é ´ÙÀ½°ú °°´Ù.

±×¸² 10 : ÄíŰÀÇ ÀÛµ¿¿ø¸®
5.2 ÀÀ¿ëºÐ¾ß
´ÙÀ½°ú °°Àº ºÐ¾ß¿¡ ÀÀ¿ëÀÌ °¡´ÉÇÏ´Ù.
- ¼îÇÎ ½Ã½ºÅÛ¿¡¼ ¹°Ç°µéÀ» ¼±ÅÃÇÏ¸é ±× Á¤º¸µéÀ» ÀúÀå½ÃÄÑ µÎ¾ú´Ù°¡, ÀÌÈÄ¿¡ ±¸ÀÔ °áÁ¤½Ã¿¡ Àϰý ±¸¸ÅÇÒ ¼ö ÀÖ°Ô ÇÑ´Ù.
- »ç¿ëÀÚ ¾ÆÀ̵𸦠Çѹø ÀúÀå½ÃÄÑ µÎ¸é, ´ÙÀ½¹ø Á¢¼Ó¶§ ¹ø°Å·Ó°Ô ´Ù½Ã ¹¯Áö ¾Ê°Ô ÇÒ ¼ö ÀÖ´Ù.
- »ç¿ëÀÚÀÇ È¯°æ¼³Á¤°ªµéÀ» ÀúÀå½ÃÄÑ µÎ°í, ¼¹öÂÊ¿¡¼ ¿©±â¿¡ ¸ÂÃß¾î ÀûÀýÇÑ ÇüÅ·Π¹®¼µéÀ» »ý¼º½Ãų ¼ö ÀÖ´Ù.
5.3 ¹®¹ý
Ŭ¶óÀÌ¾ðÆ®¿¡ Äí۸¦ ÀúÀåÇϱâ À§Çؼ´Â HTTP ÀÀ´äÇì´õ¿¡ ´ÙÀ½°ú °°ÀÌ µé¾î°¡°Ô µÈ´Ù.
Set-Cookie: NAME=VALUE; expires=DATE; path=PATH; domain=DOMAIN_NAME; secure
- NAME=VALUE : ÀúÀåÇÒ ÄíŰÀÇ À̸§°ú °ªÀ» ÁöÁ¤ÇÑ´Ù. ';', ',', ' '¸¦ Á¦¿ÜÇÑ ¹®ÀÚ¿·Î¼, ÀÌ ¹®ÀÚµéÀ» ³ªÅ¸³»±â
À§Çؼ´Â URL ¹æ½Ä°ú °°ÀÌ "%XX"¸¦ ÀÌ¿ëÇÏ¸é µÈ´Ù - ÇÏÁö¸¸ ƯÁ¤ÇÑ ÀÎÄÚµå ¹æ¹ýÀÌ Á¤ÀǵǾî ÀÖÁö´Â ¾Ê´Ù.
À¯ÀÏÇÏ°Ô ¹Ýµå½Ã ÇÊ¿äÇÑ ¼Ó¼ºÀÌ´Ù.
- expires=DATE : ÀúÀåÇÒ ÄíŰÀÇ À¯È¿±â°£À» ÁöÁ¤ÇÑ´Ù. ÁöÁ¤µÈ ±â°£ÀÌ Áö³ª¸é ÇØ´ç Äí۰¡ »ç¶óÁö°Ô
µÈ´Ù. ½Ã°£Àº "Wdy, DD-Mon-YY HH:MM:SS GMT"¿Í °°Àº Çü½ÄÀ¸·Î ÁöÁ¤µÈ´Ù. (RFC 850, RFC 1036, RFC 822)
¼±Åûç¾çÀÇ ¼Ó¼ºÀ̸ç, ¸¸¾à ÁöÁ¤µÇÁö ¾ÊÀ¸¸é ±âº»ÀûÀ¸·Î »ç¿ëÀÚÀÇ ¼¼¼ÇÀÌ ³¡³¯¶§±îÁö·Î ÁöÁ¤µÈ´Ù.
- domain=DOMAIN_NAME : ÀúÀåÇÒ Äí۰¡ À¯È¿ÇÑ µµ¸ÞÀÎÀ» ÁöÁ¤ÇÑ´Ù. Ŭ¶óÀÌ¾ðÆ®°¡ ¹®¼¸¦ ¿äûÇÒ ¶§ÀÇ
URLÀÌ ÁöÁ¤µÈ µµ¸ÞÀÎ ¾È¿¡ ÀÖ¾î¾ß¸¸ ÀúÀåµÈ Äí۸¦ ¼¹öÂÊ¿¡ ³Ñ°ÜÁÖ°Ô µÈ´Ù. µµ¸ÞÀÎÀº µÞºÎºÐºÎÅÍ
ºÎºÐ¹®ÀÚ¿ °Ë»ö(substring search)À» ÇàÇÏ¿© ÀÏÄ¡µÇ¸é ÁöÁ¤µÈ µµ¸ÞÀξȿ¡ ÀÖ´Â °ÍÀ¸·Î °£ÁֵȴÙ. ¶ÇÇÑ ÁöÁ¤µÈ µµ¸ÞÀÎ
¾È¿¡ ÀÖ´Â ¼¹ö¸¸ÀÌ Äí۸¦ ´Ù½Ã ÁöÁ¤ÇÒ ¼ö ÀÖÀ¸¸ç, ÁöÁ¤µÉ µµ¸ÞÀÎÀº »óÀ§ 7°¡Áö Ư¼öÇÑ µµ¸ÞÀÎÀº Àû¾îµµ µÎÀÚ¸®, ±× ¿ÜÀÇ
µµ¸ÞÀÎÀº Àû¾îµµ ¼¼ÀÚ¸®¸¦ ¿äÇÑ´Ù. ¸¸¾à ÀÌ ¼Ó¼ºÀÌ ÁöÁ¤µÇ¾î ÀÖÁö ¾ÊÀ¸¸é, ±âº»ÀûÀ¸·Î Äí۸¦ ÁöÁ¤ÇÏ´Â ¼¹öÀÇ ÁÖ¼Ò°¡
ÁöÁ¤µÈ´Ù.
- path=PATH : ÀÌ ¼Ó¼ºÀº ÀúÀåÇÒ Äí۰¡ À¯È¿ÇÑ °æ·ÎÀÇ ºÎºÐ¹®ÀÚ¿À» ÁöÁ¤ÇÑ´Ù.
¸¸¾à µµ¸ÞÀÎÀÌ À¯È¿ÇÏ´Ù¸é, ´Ù½Ã °æ·Î¸¦ ¾ÕºÎºÐºÎÅÍ ºÎºÐ¹®ÀÚ¿ °Ë»öÇÏ¿©
ÀÏÄ¡µÇ¸é ºñ·Î¼Ò ÀúÀåµÈ Äí۸¦ ¼¹öÂÊ¿¡ ³Ñ°ÜÁÖ°Ô µÈ´Ù. ¸¸¾à ÀÌ ¼Ó¼ºÀÌ ÁöÁ¤µÇ¾î ÀÖÁö ¾ÊÀ¸¸é, ±âº»ÀûÀ¸·Î
Äí۸¦ ÁöÁ¤ÇÏ´Â HTTP ÀÀ´äÇì´õ¿Í °°ÀÌ ³Ñ¾î¿À´Â ¹®¼ÀÇ °æ·Î·Î ÁöÁ¤µÈ´Ù.
- secure : ¸¸¾à ÀÌ ¼Ó¼ºÀÌ ÁöÁ¤µÇ¸é, SSL À§¿¡¼¸¸ Äí۰¡ Àü¼ÛµÈ´Ù.
ÀÏ´Ü Äí۰¡ ÀúÀåµÇ¸é, ÀÌÈÄ¿¡ Ŭ¶óÀÌ¾ðÆ®°¡ ¼¹öÂÊ¿¡ ¹®¼¸¦ ¿äûÇÒ ¶§ µµ¸ÞÀΰú °æ·Î°¡ À¯È¿ÇÑ Äí۵éÀ»
HTTP ¿äûÇì´õ(HTTP request header)¿¡ Æ÷ÇÔ½ÃÄÑ ¼¹öÂÊ¿¡ ³Ñ°ÜÁÖ°Ô µÈ´Ù. HTTP ¿äûÇì´õ¿¡ ´ÙÀ½°ú °°ÀÌ µé¾î°¡°Ô µÈ´Ù.
Cookie: NAME1=OPAQUE_STRING1; NAME2=OPAQUE_STRING2 ...
Ŭ¶óÀÌ¾ðÆ®´Â Äí۸¦ ¹«ÇÑÁ¤À¸·Î ÀúÀåÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó, Á¤ÇØÁø °¹¼ö¸¸À» ÀúÀåÇÒ ¼ö ÀÖ´Ù. ÃÖ¼ÒÇÑÀ¸·Î
ÀúÀåµÇ´Â ÃÖ´ë °¹¼ö´Â ´ÙÀ½°ú °°´Ù.
- ÀüüÀûÀ¸·Î 300°³ÀÇ Äí۰¡ ÀúÀåµÉ ¼ö ÀÖ´Ù.
- °¢ ÄíŰº°·Î À̸§°ú °ªÀ» ÇÕÇÏ¿© 4 KB±îÁö ÀúÀåµÉ ¼ö ÀÖ´Ù.
- ¼¹ö³ª µµ¸ÞÀκ°·Î 20°³ÀÇ Äí۰¡ ÀúÀåµÉ ¼ö ÀÖ´Ù.
µû¶ó¼ ÁöÁ¤µÈ °¹¼ö¸¦ ÃʰúÇϸé ÀÌÀü¿¡ ÀúÀåµÈ ÄíŰ´Â »õ·Î¿î Äí۰¡ µ¤¾î¾²°Ô µÇ¸ç, À̶§ ÃÖ±Ù¿¡ °¡Àå Àû°Ô »ç¿ëµÈ ¼ø¼¿¡
µû¶ó Áö¿öÁö°Ô µÈ´Ù - LRU(Least Recently Used) ¹æ½Ä.
À¯ÀÇÇÒ Á¡µéÀº ´ÙÀ½°ú °°´Ù.
- »óÅÂÁ¤º¸¸¦ Áö¿ì°íÀÚ ÇÒ ¶§¿¡´Â expires ¼Ó¼ºÀ» Áö³ª°£ ½Ã°£À¸·Î ÇÏ¿© Äí۸¦ ÁöÁ¤Çϸé Áö¿öÁö°Ô µÈ´Ù.
- °°Àº °æ·ÎÀÇ °°Àº À̸§ÀÇ Äí۸¦ ÁöÁ¤Çϸé ÀÌÀüÀÇ Äí۸¦ µ¤¾î¾²°Ô µÈ´Ù.
- °°Àº À̸§ÀÇ Äí۰¡ ´Ù¸¥ °æ·Î¿¡ ÁöÁ¤µÇ¾î ÀÖÀ» °æ¿ì, ¹®¼ ¿äû½Ã ¸ðµÎ ¼¹öÂÊ¿¡ ³Ñ°ÜÁÖ¸ç,
º¸´Ù ±¸Ã¼ÀûÀÎ °æ·ÎÀÇ Äí۰¡ ¾Õ ºÎºÐ¿¡ ¿À°Ô µÈ´Ù.
- ÇÁ¶ô½Ã ¼¹ö(proxy server)¸¦ ÀÌ¿ëÇÒ °æ¿ì ÄíŰ´Â ij½¬µÇ¸é ¾ÈµÈ´Ù.
¿¹Á¦¸¦ º¸¸é ´ÙÀ½°ú °°´Ù.
¼¹ö°¡ ¹®¼ ¹Ýȯ½Ã
Set-Cookie: USER=guest; path=/
Ŭ¶óÀÌ¾ðÆ®°¡ "/" °æ·ÎÀÇ ¹®¼ ¿äû½Ã
Cookie: USER=guest;
¼¹ö°¡ ¹®¼ ¹Ýȯ½Ã
Set-Cookie: USER=guest2; path=/CUG
Ŭ¶óÀÌ¾ðÆ®°¡ "/CUG" °æ·ÎÀÇ ¹®¼ ¿äû½Ã
Cookie: USER=guest2; USER=guest
C ¿¹Á¦ ÇÁ·Î±×·¥Àº ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºµÈ´Ù.
- ÄíŰ ÀúÀå½Ã - NPH CGI ½ºÅ©¸³Æ® ÀÌ¿ë
#include <stdio.h>
main()
{
printf("HTTP/1.0 200 OK\r\n");
printf("Set-Cookie: name=TEST; path=/\r\n");
printf("Content-type: text/html\r\n");
printf("\r\n");
printf("cookie test!\n");
}
- ÄíŰ ÃßÃâ½Ã
getenv("HTTP_COOKIE")¸¦ ÅëÇÏ¿© ¿äûÇì´õÀÇ ÄíŰ ºÎºÐÀ» ±¸ÇÑ µÚ, ÄíŰ À̸§°ú °ªµéÀ» ºÐ¸®ÇÏ¿©
ÄíŰ Á¤º¸¸¦ ²¨³½´Ù.
5.4 Æò°¡
4.1¿¡¼ »óÅÂÁ¤º¸À¯Áö¸¦ À§ÇÑ CGI¸¦ ÄíŰ·Î ¹Ù²Ù¾î ±¸ÇöÇØ º¸¸é ´ÙÀ½ ±×¸²°ú °°ÀÌ µÈ´Ù.

±×¸² 11 : ÄíŰÀÇ ÁøÇà°úÁ¤
À§ÀÇ ±×¸²¿¡¼ CGI A´Â CGI B, CGI C¿¡ ÇÊ¿äÇÑ ÄíŰ B, Äí±â A¸¦ Ŭ¶óÀÌ¾ðÆ®¿¡ ³Ñ°ÜÁØ´Ù.
±×´ÙÀ½ Ŭ¶óÀÌ¾ðÆ®°¡ CGI B¸¦ È£ÃâÇÒ ¶§ CGI BÀÇ °æ·Î¿¡ À¯È¿ÇÑ ÄíŰ B¸¦ ³Ñ°ÜÁØ´Ù.
´Ù½Ã Ŭ¶óÀÌ¾ðÆ®°¡ CGI C¸¦ È£ÃâÇÒ ¶§ CGI CÀÇ °æ·Î¿¡ À¯È¿ÇÑ ÄíŰ A¸¦ ³Ñ°ÜÁØ´Ù.
¿©±â¼ ±âÁ¸ÀÇ ½Ã½ºÅÛ°ú °¡Àå Å« Â÷ÀÌÁ¡Àº, Ŭ¶óÀÌ¾ðÆ®°¡ Äí۸¦ ÀúÀåÇϰí Àֱ⿡ CGI B°¡
CGI C¿¡ ÇÊ¿äÇÑ ÄíŰ A¸¦ À¯ÁöÇϱâÀ§ÇÑ ¹öÆÛ¿ªÇÒÀ» ÇÒ Çʿ䰡 ¾ø´Ù´Â Á¡ÀÌ´Ù.
ÄíŰ´Â À̿Ͱ°ÀÌ »óÅÂÁ¤º¸À¯Áö¸¦ ´õ¿í ¸Å²ô·´°Ô ±¸ÇöÇÒ ¼ö ÀÖÀ¸³ª,
Äí۸¦ Çѹø¿¡ Çϳª¾¿¹Û¿¡ ÁöÁ¤ÇÒ ¼ö ¾øÀ¸¸ç, ÄíŰÀÇ ÀúÀå°¹¼ö¿¡ Á¦ÇÑÀ» °®´Â ´ÜÁ¡À» ¾È°í ÀÖ´Ù.
6. °á·Ð
¾Õ¿¡¼ CGIÀÇ ÀÛµ¿¿ø¸®¿Í »õ·Î¿î ¹æ½Äµé, »óÅ À¯Áö¸¦ À§ÇÑ ¹æ¹ýµéÀ» ¼³¸íÇÏ¿´´Ù.
WWW ½Ã½ºÅÛÀº Æí¸®ÇÔ°ú È®À强À¸·Î ÀÎÇÏ¿© ¾ÕÀ¸·Îµµ ²ÙÁØÈ÷ º¸±ÞÀÌ Áõ°¡µÉ °ÍÀ¸·Î ÃßÃøµÈ´Ù.
±×·¯³ª WWW ½Ã½ºÅÛÀº »óÅ À¯Áö°¡ ¾î·Æ´Ù´Â ´ÜÁ¡À» ¾È°í ÀÖ´Ù. ÄíŰ ¹æ½ÄÀÇ µµÀÔÀ¸·Î
ÀÎÇÏ¿© »óÅ À¯Áö°¡ ¿ëÀÌÇØÁ³À¸³ª, ¾ÆÁ÷ ÄíŰÀÇ ±â´ÉÀº Á¦¾àÁ¡ÀÌ ¸¹´Ù. µû¶ó¼ ÇâÈÄ ÀÌÀÇ º¸¿ÏÀÌ
¿ä±¸µÈ´Ù.
Âü°í¹®Çå(References)
- [ÃÖ 95]
- ÃÖÀ±¼ö, "¼¹ö ÀÎÅÍÆäÀ̽º", °¡ÀÚ! À¥ÀÇ ¼¼°è·Î - °ÀÇÀÚ·áÁý (Á¦2ȸ WWW-Workshop), WWW-KR, 1995.
- [NCSA 95]
- "The Common Gateway Interface", NCSA, 1995.
URL: http://hoohoo.ncsa.uiuc.edu/cgi/
- [Net.Genesis 95]
- Net.Genesis, Hall, D., Build a Web Site, PRIMA, 1995.
- [Netscape 95a]
- "An Exploration of Dynamic Documents", Netscape, 1995.
URL: http://home.mcom.com/assist/net_sites/pushpull.html
- [Netscape 95b]
- "Persistent Client State HTTP Cookies", Netscape, 1995.
URL: http://home.netscape.com/newsref/std/cookie_spec.html