혼동하기 쉬운 웹 개발 개념
혼동해서 사용하는 웹 개발 개념 정리
WSGI와 CGI에 대해서 좋은 글을 발견해서 정리합니다.
WSGI
WSGI와 파이썬 시간이 있다면 시간내어 읽어 볼만한 wsgi 문서 WSGi PEP 문서
CGI란
CGI는 Common Gateway Interface의 약자입니다. 이에 대해서 괜찮은 글을 찾아 영문을 한글로 번역해서 올립니다.
CGI 프로그래밍은 간단하다.
이렇게 말하는 것은 정신나간 소리라고 생각할 것이다.
이 글을 보는 당신은 컴퓨터 프로그래밍에 초짜가 아닐 거다. 그렇지 않다면 이 글을 보고 있지도 않을 테니. 그렇다면 당신은 컴퓨터 프로그래밍에서 간단한 거란 없다는 것도 알고 있을 거다.
그리고 당신이 그렇게 생각하고 있는 것이 내가 이렇게 정신나간 소리를 하는 이유이기도 하다. 왜냐면 네가 컴퓨터 프로그래밍을 하는 방법만 알고 있다면, CGI 프로그램을 짜는 데 필요한 모든 것을 이미 알고 있는 것이기에. 당신은 모든 것을 이미 알고 있다.
CGI가 뭐야?
경력 프로그래머들 사이에서도 CGI에 대해서 수 없이 많은 혼동을 하고 있다. 그래서 나는 당신이 아래에 있는 것 중 한 두개쯤은 언젠가 들어봤을 거라고 확신한다.
그것이 지금부터 CGI가 아닌 것에 대해서 말하려는 이유이다.
- CGI는 프로그래밍 언어가 아니다.
- 당신은 Perl을 배울 필요가 없다.
- 네가 알고 있는 어떤 언어를 사용해도 된다.
- 다음 2가지 기능을 만족하는 세상 모든 컴퓨터 언어가 해당된다.
- 입력을 읽을 수 있다면
- 출력을 작성할 수 있다면
그런데 이 2가지 기능이 없는 컴퓨터 언어가 있던가?
- 즉 한 가지 언어에 국한되는 것이 절대로 아니다.
- CGI는 프로그래밍 스타일이 아니다. 당신만의 스타일로 작성해도 된다.
- CGI는 암호가 아니다. Perl은 암호이지만 괜찮다. Perl을 꼭 써아하는 게 아닌 걸 이제 아니깐.
- CGI는 Unix gurus일 필요가 없다. 사실 어떤 종류의 guru일 필요도 없다. 네가 필요한 모든 건 프로그래밍 할 줄만 알면 된ㄷ.ㅏ
그래서 CGI는 정말 뭐냐구.
정말 간단하게 말해서 CGI는 일반적인 출입구 접속장치다.(Common Gateway Interface)우리가 다들 아는 Application programming Interface 즉, API치고는 쓸데없이 화려한 용어이다. 다시말해 CGI는 웹 서버를 위한 API다.
웹 서버는 물론 웹 페이지를 웹 브라우져에 전송하는 프로그램이다. 기술적으로 말하면, 웹 브라우져는 웹 클라이언트라고 불리기도 하고 웹 브라우져를 사용하는 사람을 지칭하기도 한다. 하지만 여기서 기술적으로 정확하게 알고 넘어갈 필요는 없다.
그래서 서버가 하는 일이 뭐더라?
핵심만 말하면, 웹 서버는 기다린다. 웹 사이트가 엄청 바빠질 때까지 기다린다.
무엇을 기다리냐고? 웹 브라우져가 파일을 요청할 때까지지. 파일은 HTML 문서일 수도, 이미지, 혹은 어떤 종류의 파일이 될 수 있다.
만약 서버가 요청을 받기만 하면, 웹 서버는 다음 3가지 일을 한다.
- 단순한 텍스트 한 줄을 보낸다. 어떤 종류의 파일을 보내는 지에 대한 설명을 담아서. 예를 들어 HTML, GIF or …
- 빈 줄을 보낸다.
- 파일의 컨텐츠를 보낸다.
이 순서로 일을 한다.
얼마나 많은 파일을 웹 서버가 보내지?
단 한 개 이 말을 듣고 고개를 갸우뚱 할 수도 있다. 결국 전형적인 웹 페이지는 여러개의 HTML 문서와, 이미지, 그리고 몇 가지 필요한 파일들이 들어가 있을 테니 말이다.
네가 생각했던 게 맞다. 그럼에도 불구하고 한 세션 동안에는 웹 서버는 하나의 파일만을 보낸다. 브라우져는 모든 파일에 대해 각각 새로운 세션을 만들어 줘야 한다. 그리고 모든 웹 서버와 웹 브라우져는 완벽하게 멀티 테스킹이 가능하기 때문에, 이 둘은 여러개의 세선을 동시에 진행할 수 있다. 그렇지만 다시 말해두자면, 각 세션별로 하나의 파일만 보낼 수 있다는 것은 바뀌지 않는다.
꼭 파일만 보내는 거야?
그럴 필요는 없다. 전송되는 모든 건 데이터이기만 하면 된다.
기억할 것 : 웹 서버와 웹 브라우져는 보통 별 개의 컴퓨터에서 작동한다. 어쩌면 서로 다른 OS에서 작동할 수도 있고, 서로 다른 마이크로 프로세서를 가지고 있을 수도 있다. 하지만 웹 브라우져는 오로지 자료만 요구한다. 자료를 어디에서 가져오는지는 결코 중요치 않다.
그럼에도 불구하고, 일반적인 웹 서버는 파일에서부터 데이터를 가져오게 프로그래밍되어있다. 웹 서버는 단순히 파일에서 정보를 읽고나서 위에서 말한 3가지 순서에 따라 클라이언트에게 보낸다.
이 결과로 웹 서버는 오로지 정적 파일(Static File)만 보낼 수 있다. 다시 말해 웹 서버는 데이터를 수정하는 동적인 작업을 하지 못해.
하지만 나는 동적인 데이터를 보내길 원하는데? (Dynamic data)
할수 있다.
그게 바로 CGI가 필요한 이유다. 너는 단지 동적으로 데이터를 생성하는 프로그램만 짜면 된다. 네 데이터는 파일 대신에 브라우져에게 전송된다. 이러한 방식으로 네 CGI 프로그램은 웹 서버의 역할을 동적 파일을 보내주는 것으로 확장할 수 있다. 마치 DLL이 윈도우즈의 기능을 확장하는 것처럼
예외적으로 CGI는 windows를 위해서 작성해야 하는 프로그램보다 훨씬 간단하다.
하지만 CGI가 브라우져에게 어떻게 얘기할수 있지?
할 수 없다. 웹 서버가 알아서 해줄 거다. 사실 CGI의 아름다움은 심지어 웹서버에게도 말해줄 필요가 없다는 거다. 네가 해야할 일은 단지 규격에 맞는 출력만 작성하면 된다. 예를 들어 C에서는 printf()라는 함수를 쓸 거다.
너가 신경 써야할 단 한 가지는 위에서 말한 3가지 단계를 사용하는 것이다. 웹서버는 CGI가 어떤 종류의 데이털를 출력하는지 모르고 있기 때문에, CGI는 정보를 규격에 맞는 출력으로 스스로 작성해야한다.
전에 내가 프로그래밍 언어 없이도 이 일을 할 수 있다고 한 말을 기억하고 있는지.
이렇게 가정해보자. 네 웹 서버가 MS DOS 아래에서 돌아가고 있다. 윈도우 웹 서버가 있고 오직 윈도우만이 MS DOS 명령어를 처리할 수 있다.
지금, 네 현재 디렉토리의 목록을 웹에 보내고 싶다고 해보자. (좋은 아이디어는 아니지만 간단한 예를 들자면). MS DOS 는 디렉토리 목록을 정해진 규격으로 출력하는 dir 명령어가 있다.
그렇다면 앞에 2가지 단계는?
dir 명령어가 3번째 단계, 즉 실제 데이터를 출력한다면, 위에 2단계 context 타입인 plain text를 출력하고 빈 줄을 출력하는 단계는 누가 해주지? 걱정할 필요 없이 네가 직접 작성하면 된다.
echo Content-type: text/plain
echo.
dir
첫번째 줄은 브라우져에게 plain text가 전달될 거라는 것을 예상할 수 있게 해준다. 두번째 줄은 빈 줄을 보낸다. 마지막 세번째는 현재 디렉토리의 목록 정보를 보낸다.
내 웹 사이트는 유닉스 서버이고 나는 테스트 할 수 없는 상태이다. 네가 유닉스 쉘을 비슷한 목적에서 사용할 거라는 걸 알고 있다. 그리고 나는 윈도우 서버가 방금 작성한 것과 같은 CGI를 위한 배치 파일을 허용할지도 의문이다. 하지만 이글을 읽는 많은 사람들이 MS DOS 배치 파일을 유닉스 쉘보다 더 잘 이해할 거라고 믿었기 때문에 이 예제를 선택했다. (.. 나는 유닉스 쉘이 더 익숙한데 )
어떻게 입력을 얻는가
첫번째로, 웹은 대화식(interactive) 소통이 아니라는 것을 강조하고 싶다. 그 말은 네 CGI 프로그램이 유저에게 입력을 묻고, 처리하고, 출력을 보내고 또 새로운 입력을 묻는 행동을 할 수 없음을 의미한다.
하지만 이 것은 CGI 프로그램이 매우 단순한가에 대한 설명이기도 하다. 프로그램은 유저 인풋을 최대 한번 시작할 때 받고 나서 정해진 규격으로 출력을 한번 보내고 끝난다. 그럼에도 불구하고 입력과 출력은 네가 만든 프로그램이 다룰 수 있는 범위까지 가능하다.
그 말은, 네 CGI 프로그램은 사용자 입력을 2가지 방법으로 받을 수 있다는 말이다. 웹 브라우져가 웹 서버에 보내는 방식에 따라서.
어디에서 브라우져는 사용자 입력을 받는가 ?
브라우져는 HTML forms을 사용해서 사용자 입력을 받는다. form은 브라우져가 2가지 방법으로 데이터를 전송하게 하는데, 여러분이 잘 알고있는 GET과 POST이다.
GET 메소드는 URL을 통해서 입력 정보를 보낸다. POST 메소드는 stdin이라는 형식으로 입력 정보를 보낸다. 이 POST 방식은 URL을 통해 정보를 전달하는 GET방식에 비해 몇 가지 뛰어난 장점을 갖는다.
- URL은 보낼 수 있는 정보에 크기 제한이 있지만 POST는 없다고 봐도 된다.
- PassWord같은 민감한 데이터를 URL을 통해서 보내는 것은 정보를 공개하는 것과 마찬가지이다.
- POST는 정보를 URL보다 안전하게 보낼 수 있다.