Apache CGI 환경에서 실행되는 Python 스크립트로도 사용자 정의(custom) 요청 헤더의 값을 손쉽게 가져올 수 있습니다. 핵심 원리는 Apache의 mod_cgi가 HTTP 헤더를 환경 변수 형태로 전달한다는 점입니다.
HTTP 헤더는 환경 변수로 전달됩니다
Apache의 mod_cgi는 수신한 각 HTTP 요청 헤더마다 대응되는 환경 변수를 자동으로 설정해 줍니다. 이때 생성되는 변수에는 모두 HTTP_라는 접두사(prefix)가 붙습니다.
예를 들어 클라이언트가 다음과 같은 헤더를 보냈다고 가정해 보겠습니다.
x-client-version: 1.2.3
그러면 CGI 스크립트에서는 이 값이 HTTP_X_CLIENT_VERSION이라는 환경 변수로 변환되어 전달됩니다. 즉, 헤더 이름의 하이픈(-)은 밑줄(_)로 바뀌고 앞에 HTTP_가 붙는 규칙을 따릅니다.
특정 헤더 값 읽기
따라서 위에서 예시로 든 사용자 정의 헤더의 값은 아래와 같이 간단히 읽을 수 있습니다.
import os
version = os.environ["HTTP_X_CLIENT_VERSION"]
print(version) # 1.2.3
모든 HTTP_* 헤더 출력하기
아래 스크립트는 환경 변수를 순회하면서 HTTP_로 시작하는 모든 헤더 이름과 값을 화면에 출력합니다.
#!/usr/bin/env python3
import os
print("Content-Type: text/html")
print("Cache-Control: no-cache")
print()
print("<html><body>")
for headername, headervalue in os.environ.items():
if headername.startswith("HTTP_"):
print("<p>{0} = {1}</p>".format(headername, headervalue))
print("</body></html>")
참고로 위 코드는 현재 표준인 Python 3 문법에 맞춰 작성되었습니다. 구버전(Python 2)에서는 print를 문(statement) 형태로 쓰고, 딕셔너리 순회 시 iteritems()를 사용했다는 점만 다릅니다.
알아두면 좋은 점
- 예외적인 헤더: CGI 명세에 따라
Content-Type과Content-Length헤더는HTTP_접두사 없이 각각CONTENT_TYPE,CONTENT_LENGTH환경 변수로 전달됩니다. - 보안 주의: 헤더 값은 클라이언트가 임의로 조작할 수 있으므로, 출력하거나 로직에 사용하기 전에 반드시 검증·이스케이프 처리를 하는 것이 안전합니다.
- HTML 태그 순서: 닫는 태그는
</body>를 먼저,</html>을 나중에 출력하는 것이 올바른 HTML 구조입니다.