Server Side Includes
1. 개요
Server Side Includes (SSI)는 텍스트 기반의 간단한 프로그래밍 언어이다. HTML 주석 안에 지시어를 배치하여 웹 페이지에 동적 콘텐츠를 포함할 수 있으며, 파일, 프로그램 출력, 시스템 변수 등을 포함하는 데 사용된다. SSI는 `` 형태의 구문을 사용하며, include, exec, echo, config, flastmod, fsize 등의 지시어를 제공한다. 제어 흐름을 위한 if-elif-else-endif, 변수 설정을 위한 set, 환경 변수를 출력하는 printenv 등의 지시어도 지원한다.
| 종류 | 서버 측 스크립트 언어 |
|---|---|
| 개발자 | 로버트 R. 프리먼 (Robert R. Freeman) |
| 첫 공개 | 1995년 |
| 용도 | 기존 HTML 페이지에 동적 콘텐츠 추가 웹 서버에서 실행 |
|---|---|
| 실행 방식 | 웹 서버가 HTML 페이지를 제공하기 전에 서버에서 처리 |
| 장점 | 간단한 동적 콘텐츠 구현 용이 서버 부하 감소 (클라이언트 측 스크립트보다) |
| 단점 | 보안 취약점 가능성 존재 서버 설정 필요 |
| 주요 명령어 | `#echo`: 변수 출력 `#include`: 파일 포함 `#exec`: 셸 명령어 실행 `#flastmod`: 파일 최종 수정일 출력 `#fsize`: 파일 크기 출력 `#config`: SSI 설정 변경 `#if`: 조건문 `#loop`: 반복문 `#goto`: 지정된 위치로 이동 `#break`: 루프 종료 `#return`: 함수 종료 |
| 공통 헤더/푸터 | 모든 페이지에 동일한 헤더/푸터를 쉽게 포함 |
|---|---|
| 현재 시간 표시 | 페이지에 현재 시간을 동적으로 표시 |
| 파일 정보 표시 | 파일 크기나 최종 수정 날짜 등을 표시 |
| 명령어 실행 제한 | `#exec` 명령어 사용을 신중하게 고려하고 필요한 경우 비활성화 |
|---|---|
| 입력값 검증 | 사용자 입력값을 검증하여 보안 취약점 방지 |
| 디렉터리 접근 제한 | SSI가 접근할 수 있는 디렉터리를 제한 |
| 아파치 웹 서버 설정 | `.htaccess` 파일 또는 서버 설정 파일에서 SSI 활성화 |
|---|---|
| 파일 확장자 | `.shtml`, `.shtm`, `.html` 등 다양한 확장자 사용 가능 |
-
웹 기술 -
공용 게이트웨이 인터페이스
공용 게이트웨이 인터페이스(CGI)는 웹 서버가 외부 프로그램을 실행하기 위한 표준 인터페이스이며, 웹 서버가 클라이언트 요청에 응답하여 프로그램을 실행하고 그 결과를 클라이언트에 전송하는 방식으로 동작한다. -
웹 기술 -
FastCGI
FastCGI는 웹 서버와 외부 애플리케이션 간 효율적인 통신을 위한 프로토콜로, CGI의 단점을 보완하여 지속적인 프로세스를 통해 웹 애플리케이션의 성능과 안정성을 향상시킨다. -
웹 1.0 -
전화 접속
전화 접속은 공중 교환 전화망을 통해 모뎀과 전화선으로 인터넷에 연결하는 방식으로, 1980년대부터 사용되었으나 광대역 인터넷의 등장으로 2000년대 이후 사용이 줄어 현재는 제한적으로 사용되며 사라지는 추세이다. -
웹 1.0 -
자바 애플릿
-
스크립트 언어 -
Tcl
Tcl은 존 오스터하우트가 개발한 명령어 기반의 프로그래밍 언어로, Tk 툴킷과 결합하여 GUI 스크립팅 환경으로 발전했으며, 다양한 운영체제에서 사용 가능하고 C, C++, Java 등 다른 언어와의 인터페이스를 지원한다. -
스크립트 언어 -
PHP
PHP는 라스무스 러도프가 개발한 범용 스크립팅 언어로, 웹 개발에 널리 사용되며 LAMP 아키텍처의 핵심 요소이다.
2. 설계
SSI는 단순한 프로그래밍 언어로, 단 하나의 자료형인 텍스트만 지원한다. 제어 흐름은 상당히 단순하며, 선택을 지원하지만, 루프는 기본적으로 지원되지 않으며, include를 사용하거나 HTTP 리디렉션을 사용하여 재귀적으로만 수행할 수 있다. 언어의 단순한 설계는 대부분의 서버 측 스크립트 언어보다 배우고 사용하기 쉽게 만들며, 복잡한 서버 측 처리는 종종 더 많은 기능을 갖춘 프로그래밍 언어 중 하나로 수행된다. SSI는 튜링 완전하다.
SSI는 다음과 같은 간단한 구문을 가진다: ``. 지시어는 HTML 주석 안에 배치되어 SSI가 활성화되지 않은 경우 사용자가 페이지에서 SSI 지시어를 볼 수 없도록 한다(소스 코드를 보지 않는 한). 구문은 선행 "<!--"와 지시어 사이에 공백을 허용하지 않는다.
3. 사용 예시
매일 바뀌는 인용구를 포함하는 웹 페이지는 웹 페이지 파일에 다음 코드를 배치하여 인용구를 포함할 수 있다.
quote.txt영어 파일을 한 번만 변경하면 해당 파일을 포함하는 모든 페이지에 최신 일일 인용구가 표시된다. 포함은 파일로 제한되지 않으며, 프로그램의 텍스트 출력 또는 현재 시간과 같은 시스템 변수 값일 수도 있다.
4. 지시어
SSI(Server Side Includes) 지시어는 웹 페이지에 특정 내용을 삽입하는 데 사용된다. 주요 기능은 다음과 같다:
* 설정: 시점, 크기, 오류 메시지 형식을 설정한다.
* 변수 삽입: SSI 변수 값을 웹 페이지에 삽입한다.
* 명령 실행: 시스템 명령어나 CGI 프로그램을 실행하고, 그 출력 결과를 웹 페이지에 삽입한다.
* 파일 관련 정보: 지정된 파일의 크기나 최종 수정 날짜를 웹 페이지에 삽입한다.
* 다른 파일 포함: 동일한 웹 서버에 있는 다른 파일의 내용을 가져와 웹 페이지에 삽입한다. 클라이언트 측에서는 이미 포함된 상태이므로, 브라우저에서 소스를 봐도 include 지정이 대체되어 있어 구별할 수 없다.
4.1. 일반 지시어
다음은 NCSA HTTPd(1990년대) 시대의 SSI 지시어이다. 일부 구현에서는 이들 중 일부를 지원하지 않는다.
| 지시어 | 매개변수 | 설명 |
|---|---|---|
include | file 또는 virtual | 가장 많이 사용되는 SSI 지시어이다. 이를 통해 한 문서의 내용을 다른 문서에 포함할 수 있다. 포함된 문서는 다른 SSI 지원 파일일 수도 있다. `file` 또는 `virtual` 매개변수는 포함할 파일(HTML 페이지, 텍스트 파일, 스크립트 등)을 지정한다. NCSA HTTPd는 `include`를 통한 CGI를 지원하지 않았지만, 이후 Apache HTTPd는 지원한다. 프로세스가 파일을 읽거나 스크립트를 실행할 수 있는 권한이 없으면 include는 실패한다. "`virtual`" 매개변수는 모든 디렉토리 경로를 URL의 일부로 처리하는 반면, "`file`"은 기본 파일 시스템의 모든 디렉토리 경로를 처리한다. "`file`"을 사용할 때는 절대 경로 또는 상위 디렉토리에 접근하기 위한 `../`의 참조가 금지된다. Apache 설명서는 "`file`"보다 "`virtual`"을 사용하는 것을 권장한다. |
exec | cgi 또는 cmd | 이 지시어는 서버에서 프로그램, 스크립트 또는 셸 명령을 실행한다. `cmd` 매개변수는 서버 측 명령을 지정하고, `cgi` 매개변수는 CGI 스크립트의 경로를 지정한다. |
echo | var | 이 지시어는 지정된 HTTP 환경 변수의 내용을 표시한다. |
config | timefmt, sizefmt, 또는 errmsg | 이 지시어는 날짜, 시간, 파일 크기 및 오류 메시지(SSI 명령이 실패했을 때 반환됨)에 대한 표시 형식을 구성한다. |
flastmod 및 fsize | file 또는 virtual | 이 지시어는 지정된 문서가 마지막으로 수정된 날짜 또는 지정된 문서의 크기를 표시한다. `file` 또는 `virtual` 매개변수는 사용할 문서를 지정한다. `file` 매개변수는 문서를 문서 경로에 상대적으로 정의하고, `virtual` 매개변수는 문서를 문서 루트에 상대적으로 정의한다. |
4.2. 제어 지시어
제어 지시어는 나중에 SSI에 추가되었다. 여기에는 널리 사용되는 if-elif-else-endif 흐름 제어와 변수 쓰기, 그리고 일부 구현에서만 발견되는 루프와 같은 더 이국적인 기능이 포함된다.
| 지시어 | 매개변수 | 설명 | 예시 | 다음에서 발견됨 |
|---|---|---|---|---|
| if영어, elif영어, else영어, endif영어 | expr | if문. 단일 물리적 페이지에서 여러 논리적 페이지를 결정하고 생성할 수 있는 조건 테스트에 사용된다. elif는 중첩된 else-if의 축약형이다. else 및 endif는 매개변수를 허용하지 않는다. | 널리 사용됨. | |
| set영어 | var, value | SSI 변수의 값을 설정한다. 아파치는 인코딩에 대한 추가 매개변수를 제공한다. | 아파치, Nginx | |
printenv | 이 지시어는 환경 변수 및 사용자 정의 변수를 포함하여 모든 SSI 변수와 해당 값을 출력한다. 속성이 없다. | 아파치 |
4.3. 실행 가능한 명령 (일본어 문서)
SSI 변수 값을 웹 페이지에 삽입한다. 시스템 명령어나 CGI 프로그램을 실행하고, 그 출력 결과를 웹 페이지에 삽입한다. 지정된 파일의 크기를 웹 페이지에 삽입한다. 웹 페이지 내에 파일의 최종 수정 날짜를 삽입한다. 동일한 웹 서버에 있는 다른 파일의 내용을 가져와 웹 페이지 내에 삽입한다. 클라이언트 측에서는 이미 포함된 상태이므로, 브라우저 등에서 소스를 봐도 include 지정이 대체되어 있어 구별할 수 없다.