CGI(Common Gateway Interface)
[참고 사이트]
https://live-everyday.tistory.com/197
웹서버에서 동적인 페이지를 보여 주기 위해 임의의 프로그램을 실행할 수 있도록 하는 기술 중 하나입니다.
서버를 통해 들어온 웹 브라우저에서 넘겨진 요청을 프로그램에 적절히 넘겨줍니다.
등장 배경
원래 웹 서버는 서버에 저장되어 있는 고정된 문서를 보여 주는 역할을 했습니다.
하지만 웹 서버에서 정보를 찾거나 기록을 하려면 웹 서버를 고쳐서 그런 기능을 넣어야 하는데 버틸 수 없으니, 대신 웹 서버가 특정한 URL로 들어가면 요청을 원하는 프로그램에 적절히 넘겨 주는 기술이 필요해졌는데 CGI가 그런 역할을 합니다.
전달 및 응답 절차
- 대게 웹 브라우저를 통해 요청이 웹 서버로 전달됩니다.(HTML 폼을 통해)
- 웹 서버는 요청에 들어 있는 주소가 CGI 프로그램에 대응되는지 확인합니다.
- 대응되면, 그 프로그램들을 실행해서 환경 변수와 표준 입력의 형태로 요청을 전달합니다. (뒤에 서 후술)
- 웹 서버는 CGI 프로그램이 표준 출력으로 돌려 보낸 내용을 그대로 응답으로 돌려준다.
장점
- 언어, 플랫폼이 독립적입니다. 원하는 언어로 프로그래밍하면 됩니다.(스펙만 준수하면 됨)
- 매우 단순하고 다른 server-side 프로그래밍 언어에 비해 advanced task(세션 관리, 비동기 처리, 파일 업로드 처리, DB 연동, 템플릿 랜더링, REST API 설계 등)를 훨씬 쉽게 수행할 수 있습니다.
- 재사용할 수 있는 CGI 코드 라이브러리가 풍부합니다.
- 웹 서버에서 실행될 때 안전합니다.
- CGI 코드를 수행하는데 특정 라이브러리가 필요하지 않기 때문에 매우 가볍습니다.
단점
- 요청이 올때마다 DB connection을 새로 열어야하므로 느립니다.
- HTTP 요청마다 새로운 프로세스를 만들기 때문에 서버 메모리를 많이 잡아먹습니다.(servlet의 걍우 요청마다 쓰레드 생성)
- 페이지 로드 사이에 데이터가 메모리에 캐시될 수 없습니다.
막강한 확장성에도 안쓰이는 이유
→ 이러한 막강한 확장성을 가진 기술임에도 현재 쓰이지 않은 이유는 단점 2번인 요청이 하나 올때마다 프로세스가 하나씩 실행된다는 것입니다. 특히 스크립트 언어에서 치명적이었는데 스크립트 언어에서는 보통 코드를 실행할 때마다 코드를 매번 해석해야 하기 때문입니다.
물론 코드를 해석한 걸 캐싱하면 이 문제는 좀 나아지지만, 설령 C 언어 같은 언어로 미리 CGI 프로그램을 컴파일했다 하더라도 어지간한 환경에서는 프로세스 하나 실행하는데 몇 밀리초는 걸립니다.
더알아보기
JSP나 PHP, Jinja2 같은 경우 CGI의 이론을 이용하여 발전한 방식으로
→ CGI는 전화를 걸어서 누군가에게 문서를 요청하는 느낌이고
→ JSP, PHP, Jinja2는 내 컴퓨터에 설치된 앱에서 바로 문서를 작성하는 느낌 입니다.
CGI의 환경 변수
CGI는 CGI 프로그램이 실행될 때 설정되어 있어야 하는 다른 환경변수들의 개수를 정의합니다. 환경변수는 다음과 같습니다.
환경 변수 | 설명 |
---|---|
REQUEST_METHOD |
요청 메서드 (예: GET , POST ) |
QUERY_STRING |
URL의 쿼리 문자열 (예: id=123&name=lee ) |
CONTENT_TYPE |
요청 본문의 MIME 타입 (예: application/x-www-form-urlencoded ) |
CONTENT_LENGTH |
요청 본문의 길이 (바이트 수) |
SCRIPT_NAME |
실행 중인 CGI 스크립트의 경로 |
PATH_INFO |
추가 경로 정보 (RESTful 방식 URL 등) |
PATH_TRANSLATED |
PATH_INFO 의 실제 파일 시스템 경로 |
SERVER_NAME |
웹 서버의 호스트 이름 또는 IP |
SERVER_PORT |
웹 서버가 수신한 포트 번호 |
SERVER_PROTOCOL |
요청의 프로토콜 (예: HTTP/1.1 ) |
REMOTE_ADDR |
클라이언트 IP 주소 |
REMOTE_HOST |
클라이언트 호스트 이름 (DNS 역질의로 얻은 경우) |
HTTP_USER_AGENT |
클라이언트의 브라우저 정보 |
HTTP_COOKIE |
요청에 포함된 쿠키 정보 |
HTTP_REFERER |
이전 페이지의 URL |
HTTP_ACCEPT |
클라이언트가 허용하는 MIME 타입 목록 |
HTTP_HOST |
요청된 호스트명 (예: example.com ) |
CGI 프로그램은 자신의 동적 컨텐츠를 표준 출력으로 보냅니다. 자식 프로세스가 CGI 프로그램을 로드하고 실행하기 전에 리눅스 dup2 함수를 사용해서 표준 출력을 클라이언트와 연계된 연결 식별자로 재지정합니다. 그래서 CGI 프로그램이 표준 출력으로 쓰는 모든 것은 클라이언트로 직접 가게 됩니다.
HTTP POST 요청에서 CGI 프로그램으로 인자 전달하기
→ POST 요청에 대해 자식은 표준 입력을 연결 식별자로 재지정합니다. 그 후에 CGI는 표준 입력으로부터 요청 본체 내의 인자를 읽어들이게 됩니다.
오류처리 기능
404나 500같은 HTTP오류 처리도 CGI에서 처리해준다.
HTTP 상태 코드 | 의미 | 설명 |
---|---|---|
500 Internal Server Error | 서버 내부 오류 | CGI 스크립트 실행 중 예외, 구문 오류, 권한 문제 등이 있을 때 |
502 Bad Gateway | 게이트웨이 오류 | 웹 서버가 CGI 응답을 제대로 받지 못했을 때 |
403 Forbidden | 접근 금지 | CGI 파일에 실행 권한이 없거나, 접근이 허용되지 않았을 때 |
404 Not Found | 파일 없음 | 지정한 CGI 스크립트 파일이 존재하지 않거나 경로가 틀렸을 때 |
400 Bad Request | 잘못된 요청 | malformed query string, 헤더 오류 등 |
503 Service Unavailable | 서비스 불가 | CGI 프로세스를 생성할 수 없을 때 (서버 과부하 등) |
'크래프톤 정글(C언어 WEEK 5 ~ 8)' 카테고리의 다른 글
IP(Internet Protocol) (0) | 2025.05.06 |
---|---|
HTTP(Hyper Text Transfer Protocol) (1) | 2025.05.06 |
MIME Type (1) | 2025.05.06 |
Web server (웹 서버) (0) | 2025.05.06 |
Datagram Socket vs Stream Socket (0) | 2025.05.06 |