오늘 포스팅을 두개나 하다니, 오늘따라 내가 왜 이렇게 열정적이지 ㅋㅋㅋㅋㅋㅋㅋ
이것만 쓰고 집청소하고 넷플릭스 봐야지 😤 아무도 날 막을 수 없어
아무튼 뭐 .. 공부 시작해보자 😀
✏️정의
– CGI(Common Gateway Interface)는 웹 서버와 외부 애플리케이션 사이를 연결하기 위한 일종의 표준이다. 이는 웹 서버가 일방적으로 서비스를 제공하는 데 그치는 것이 아니라 사용자의 요구를 받을 수 있도록 하기 위해 만들어진 것이다.
기본의 HTML 문서는 미리 만들어진 것이기 때문에, 에디터로 바꾸기 전에는 내용이 전혀 바뀌지 않게 된다. 이에 반해 CGI는 사용자의 요구에 따라 즉석에서 문서를 만들게 된다. 이 점이 바로 CGI가 HTML 문서와 다른 부분이면서 장점이기도 한다.
예를 들어 WWW 서비스를 통해 서버에 있는 데이터베이스를 검색한다고 할 때, 사용자가 검색한 결과를 화면에 보여주어야 할 것이다. 이 경우에 CGI 프로그램은 사용자의 검색 조건으로 데이터베이스를 검색하여 그 결과를 브라우저로 보내주게 된다. 이것이 바로 CGI 프로그램의 전형적인 예인 것이다. 물론 이보다 복잡한 처리도 CGI 프로그램을 통해 수행할 수 있다.
CGI 프로그램을 만드는 방법
– CGI 프로그램은 사용자가 입력한 데이터를 처리할 수 있어야 하기 때문에, 반드시 실행 파일이나 그에 준하는 스크립트를 만들 수 있는 어떠한 언어를 사용해도 만들 수 있다.
예를 들어 현재 CGI 프로그램을 만들기 위해 가장 많이 사용하는 언어에는 다음과 같은 것들이 있다.
– C/C++ Language
– Fortran Language
– Unix Shell Script
– Perl
– TCL
– Visual Basic
– AppleScript
물론 언어를 선택할 때에 현재 웹 서버로 어떤 컴퓨터를 사용하고 있는지도 중요하다. 만약 매킨토시에서 MacHTTP를 사용하고 있다면 AppleScript를 사용해야 할 것이다. 그리고 유닉스를 사용하는 WorkStation을 서버로 사용하고 있다면 쉘 스크립트나 Perl로 간단하게 CGI 프로그램을 만들 수 있을 것이다. 물론 C나 Fortran과 같은 언어를 함께 사용할 수 있다.
만약 C나 Fortran과 같은 프로그래밍 언어를 사용한다면 실행시키기 전에 반드시 컴파일하는 과정을 거쳐야 한다. 그렇지만 쉘 스크립트, Perl, TCL과 같은 스크립트 언어를 사용하는 경우에는 컴파일할 필요없이 그대로 사용할 수 있다. 이러한 이유로 많은 사람들은 CGI 프로그램을 만드는 언어로 스크립트 방식을 선호하고 있다. 또한 이 스크립트 언어는 프로그래밍 언어보다 프로그램을 수정하고 디버깅하기가 훨씬 수월하다는 장점도 가지고 있다.
CGI 프로그램의 보안성
– 그런데 CGI 프로그램의 사용은 보안성에 있어 약간의 문제를 가지고 있다. 예를 들어 어떤 사람이 예상한 것과 다른 데이터를 CGI 프로그램을 사용할 때에는 몇가지 보안 조치를 취해야 하는 것이다.
Network 보안을 위해 가장 많이 사용하는 방법은 CGI 프로그램을 특정 디렉토리 속에 모아두는 것이다. 이 디렉토리는 웹을 관리하는 관리자에 의해 통제되며, 다른 사용자들이 함부로 CGI 프로그램을 만들지 못하도록 만들게 된다. 물론 웹 관리자에게 양해를 얻는다면 CGI 프로그램을 만들어 사용할 수 있다.
CGI 프로그램에서 데이터를 받는 방법
– 사용자가 <FORM> 태그로 만들어진 입력 양식 문서를 통해 필요한 내용을 입력하고 데이터 보내기 버튼을 누르면 해당 내용이 CGI 프로그램에 전달된다. 그런데 이때 주의할 것은 사용자가 입력한 내용이 그대로 전달되는 것이 아니라, 특정한 방식으로 암호화되어 전달된다는 것이다. 대표적인 암호 방식은 스페이스를 ‘+’ 기호로 바꾸고 ‘LF+CR’와 같은 것은 ‘%’에 16진수의 아스키 코드를 붙여서 바꾸는 것이다. 다음 예를 보면 어떻게 암호화가 이루어지는지 알 수 있을 것이다.
◐ How are you → How+are+you
또한 입력 양식을 통해 들어온 각 값들은 “변수=값” 이라는 형식으로 CGI에게 전달되며, 2개 이상의 양식이 있을 경우에는 “&” 기호로 각 값들을 연결하게 된다. 예를 들어 다음과 같은 암호화 방법을 사용하고 있다.
◐ name=xx&pc=on&sex=male
클라이언트에서 이 암호화된 문자들을 어떠한 방식으로 보내느냐에 따라 CGI 프로그램에서 문자열을 받는 방법이 달라지게 된다. 현재 HTML에서 <FORM>을 통해 보낼 때 사용하는 방법으로 GET과 POST 두 가지가 있다.
첫 번째 GET 방식은 QUERY_STRING 이라는 환경 변수를 통해 사용자가 입력한 데이터를 보내게 되는데, <FORM METHOD=”GET”> 택으로 지정된다.
두 번째 POST 방식은 환경 변수가 아닌 표준 입력(Standard Input)을 통해 사용자가 입력한 데이터를 보내는 것으로, <FORM METHOD=”POST”> 택을 사용하여 지정된다.
그러면 GET과 POST 두 가지 방식 중에서는 WWW에서 가장 많이 사용되고 있는 HTTP를 만든 NCSA와 CERN에서는 두 가지 방식 중에서 POST 방식을 추천하고 있다.
그것은 GET 방식이 환경 변수를 사용하여 데이터를 보내기 때문에 환경 변수에 저장할 수 있는 문자열의 크기가 한정될 수 밖에 없다는 문제가 있기 때문이다. 그렇기 때문에 아주 많은 양의 데이터를 한꺼번에 GET 방식으로 보내게 되면 일부 데이터를 잃어버릴 수도 있게 된다. 그렇지만 POST 방식은 표준 입력 방법을 사용하고 있기 때문에 보낼 수 있는 문자열의 크기에 제한이 없다.
CGI 프로그램에서 데이터를 보내는 방법
CGI 프로그램은 브라우저로 부터 받은 데이터를 처리한 후에 결과를 다시 서버를 통해 브라우저로 보내게 된다. 그러면 어떤 데이터를 어떠한 방법으로 보내야 할 것인가?
CGI 프로그램에서 보내는 데이터는 서버와 브라우저에서 인식할 수 있는 어떤 특별한 형식을 따르게 되어 있다. 그렇지 않으면 서버와 브라우저에서 받은 데이터를 적절하게 처리할 수 없기 때문이다. 이 형식은 헤더와 데이터라는 두 부분으로 구성되어 있다. 이 형식은 헤더와 데이터라는 두 부분으로 구성되어 있다. 먼저 헤더에 대해 살펴보자.
* 헤더
CGI 프로그램에서 보내는 데이터의 앞 부분에는 헤더(Header)라는 것이 있다. 여기에서는 현재 보내게 되는 데이터에 대한 일반적 정보를 담고 있기 때문에, 브라우저를 통해 화면에 나타나지 않는다.
헤더에 들어갈 수 있는 요소로는 데이터 종류(Content-type), 위치 정보(Location-type), 상태 정보(Status-type)가 있다. 이 정보들을 통해 브라우저는 받은 데이터를 어떻게 대처할 것인지를 결정하게 된다.
첫 번째 데이터 종류(Content-type)는 현재 보내는 데이터의 종류를 알리는 특별한 표시이다. 예를 들어 HTML 문서를 결과로서 브라우저에 보낸다면 다음과 같이 헤더를 쓸 수 있다.
Content-type: text/html
WWW 서비스에서 다룰 수 있는 데이터의 종류에는 HTML 문서만 있는 것이 아니다. 일반 텍스트 파일에서부터, GIF나 JPEG과 같은 그래픽 파일, MPEG와 같은 비디오 파일, AU나 WAV와 같은 사운드 파일까지 다양한 종류가 처리될 수 있다. 이러한 각 데이터들은 자신만의 고유한 데이터 종류(Content-type) 이름이 지정되어 있다. 다음 표는 현재 정의된 몇 가지 데이터 종류의 목록이다.
- 파일
- 데이터 종류(Content-type)
- HTML 문서
- text/html
- 텍스트
- text/plain
- GIF 포맷
- image/gif
- JPEG 포맷
- image/jpeg
- 포스트 스크립트
- application/postscript
- ZIP
- application/x-zip-compressed
- MPEG
- video/mpeg
- AVI
- video/x-msvideo
CGI 프로그램에서 헤더를 보낼 때 한 가지 주의할 점은 “Content-type: …” 줄 뒤에 반드시 빈 줄을 하나 보내야 한다는 것이다. 그렇지 않으면 서버나 브라우저에서 헤더가 끝난 줄을 알 수 없기 때문이다.
두 번째 위치 정보(Location-type)는 브라우저가 읽어들일 파일의 위치를 알려주는 곳으로, 다음과 같은 형식으로 사용된다. “Location:” 뒤에 들어가는 경로명에는 절대 경로를 사용해도 되고 상대 경로를 사용해도 된다.
Location: /usr/people/doc/abcd.html
만약 헤더에 이러한 위치 정보가 들어가게 된다면, 앞에 나온 데이터 종류 (Content-type)나 실제 데이터를 보낼 필요가 없다. 단지 위치 정보에 지정된 파일을 보내기만 하면 되기 때문이다. 여기에서도 “Location: …” 줄 뒤에 반드시 빈줄을하나 보내야 한다.
세 번째 상태 정보(Status-type)는 서버나 브라우저에게 데이터 대신 현재 상태에 대한 정보를 알려줄 때 사용하게 된다. 예를 들어 CGI 프로그램이 보낼 데이터가 없다는 신호는 다음과 같이 보낼 수 있다.
Status: 204 No Response
* 데이터
헤더 뒤에는 데이터 부분이 나오게 되는데, 이 부분은 브라우저를 통해 화면에 실제로 나타나게 될 것들이다. 그러므로 이 데이터의 내용은 헤더의 데이터 종류(Content-type)에서 정한 형식과 일치해야 한다. 즉, 데이터 종류에서 text/html을 지정하였다면, 데이터 부분에서는 HTML 문서를 보내야 하는 것이다.
* 예제
<HTML>
<HEAD>
<TITLE>쉘 스크립트 예제</TITLE>
</HEAD>
<BODY>
<H2>개인 신상 입력</H2><P>
<FORM ACTION=”tti”>
<UL>
<LI>당신의 나이와 띠가 나옵니다. 각 항목을 입력한 후에 확인버튼을 눌러주세요.<BR>
<LI>이름 : <INPUT TYPE=”text” NAME=”이름” SIZE=10><BR>
<LI>주소 : <INPUT TYPE=”text” NAME=”주소” SIZE=60 MAXLENGTH=200><BR>
<LI>주민등록번호 : <INPUT TYPE=”text” NAME=”주민등록번호” SIZE=14 MAXLENGTH=14><BR>
<LI>전화번호 : <INPUT TYPE=”text” NAME=”전화번호” SIZE=12><BR>
</UL>
<INPUT TYPE=”submit” VALUE=”확 인”>
<INPUT TYPE=”reset” VALUE=”재입력”>
</FORM>
</BODY>
</HTML>
출처: https://gap85.tistory.com/entry/CGI-란 [Joo studio]