Apache HTTP Server Version 2.2

Apache > HTTP Server > Documentation > Version 2.2 > 모듈

#### Please note

This document refers to a legacy release (2.2) of Apache httpd. The active release (2.4) is documented here. If you have not already upgraded, please follow this link for more information.

You may follow this link to go to the current version of this document.

# 아파치 모듈 mod_headers

가능한 언어: en | ja | ko

이 문서는 최신판 번역이 아닙니다. 최근에 변경된 내용은 영어 문서를 참고하세요.

설명: | HTTP 요청 헤더와 응답 헤더 수정
상태: | Extension
모듈명: | headers_module
소스파일: | mod_headers.c

### 요약

이 모듈은 HTTP 요청 헤더와 응답 헤더를 조절하고 수정하는 지시어들을 제공한다. 헤더를 합치거나 대체, 제거할 수 있다.

### 주제

- 처리 순서
- 이른(early) 처리와 늦은(late) 처리
- 예제

### 지시어들

- Comments

## 처리 순서

`mod_headers`가 제공하는 지시어는 서버설정의 거의 모든 장소에서 사용할 수 있으며, 설정 섹션으로 감싸서 지시어의 범위를 제한할 수도 있다.

처리순서는 중요하며, 설정파일에 나온 순서와 설정 섹션의 영향을 받는다. 다음 두 지시어를 반대로 적으면 효과가 달라진다.

`RequestHeader append MirrorID "mirror 12"
RequestHeader unset MirrorID`

위와 같이 적으면 `MirrorID` 헤더가 나오지 않는다. 반대로 적으면 MirrorID 헤더를 "mirror 12"로 설정한다.

## 이른(early) 처리와 늦은(late) 처리

`mod_headers`를 요청 초기나 나중에 적용할 수 있다. 보통은 내용생성자를 실행하기 직전에 요청 헤더를 설정하고 응답을 네트웍에 쓸때 응답 헤더를 설정하는 늦은(late) 방식을 사용한다. 실제 서비스하는 서버에서는 항상 느린 방식을 사용하라.

이른(early) 방식은 개발자를 위해 검사/디버깅용으로 만들었다. `early` 키워드를 사용하여 정의한 지시어는 요청을 처리하기 시작할때 설정한다. 즉, 다른 요청을 모의실험하거나 검사를 하기위해 사용할 수 있지만, 응답을 생성하기 전에 다른 모듈이 불시에 헤더를 수정할 수 있다.

요청경로에 대한 설정을 살펴보기 전에 이른 지시어를 처리하기때문에 이른 헤더 지시어는 주서버이나 가상호스트 사용장소에서만 사용할 수 있다. 이른 지시어는 요청경로에 의존할 수 없기때문에 `<Directory>`나 `<Location>`같은 사용장소에서 사용할 수 없다.

## 예제

1. "TS"로 시작하는 모든 요청 헤더를 응답 헤더로 복사한다.

   `Header echo ^TS`

2. 응답에 요청을 받은 시간과 요청을 서비스하는데 걸릴 시간을 알려주는 `MyHeader` 헤더를 추가한다. 클라이언트는 이 헤더를 보고 서버의 부하를 추정하거나 클라이언트와 서버간의 병목점을 찾을 수 있다.

   `Header add MyHeader "%D %t"`

   응답에 다음과 같은 헤더가 생긴다.

   `MyHeader: D=3775428 t=991424704447256`

3. Joe에게 안녕

   `Header add MyHeader "Hello Joe. It took %D microseconds \
   for Apache to serve this request."`

   응답에 다음과 같은 헤더가 생긴다.

   `MyHeader: Hello Joe. It took D=3775428 microseconds for Apache to serve this request.`

4. 요청에 "MyRequestHeader" 헤더가 있는 경우에만 선택적으로 응답에 `MyHeader`를 보낸다. 특정 클라이언트에게만 응답에 헤더를 추가할때 유용하다. 이 예제가 동작하려면 `mod_setenvif` 모듈이 필요하다.

   `SetEnvIf MyRequestHeader value HAVE_MyRequestHeader
   Header add MyHeader "%D %t mytext" env=HAVE_MyRequestHeader
   `

   HTTP 요청에 `MyRequestHeader: value` 헤더가 있다면, 응답에 다음과 같은 헤더가 생긴다.

   `MyHeader: D=3775428 t=991424704447256 mytext`

## Header 지시어

설명: | HTTP 응답 헤더를 구성한다
문법: | `Header [condition] set|append|add|unset|echo header [value] [early|env=[!]variable]`
사용장소: | 주서버설정, 가상호스트, directory, .htaccess
Override 옵션: | FileInfo
상태: | Extension
모듈: | mod_headers

이 지시어는 HTTP 응답 헤더를 합치거나 대체, 제거한다. 내용 핸들러와 출력 필터가 실행한 직후에 헤더를 수정하기때문에 보낼 헤더를 수정할 수 있다.

condition은 선택적으로 사용하며, 값으로 `onsuccess` 혹은 `always`를 사용한다. 이는 어떤 내부 헤더표에 동작할지를 결정한다. `onsuccess`는 `2xx` 상태코드를 뜻하고, `always`는 (`2xx`를 포함한) 모든 상태코드를 뜻한다. 특히 어떤 모듈이 설정한 헤더를 해제하고 싶다면, 둘중 어떤 것을 사용할지 잘 살펴봐야 한다.

두번째 아규먼트에 따라 기능이 다르다. 두번째 아규먼트로 아래 값중 하나를 사용할 수 있다.

`set`
  응답 헤더를 설정한다. 같은 이름으로 이미 헤더가 있다면 대체한다. value에 형식문자열을 사용할 수 있다.
`append`
  이미 존재하는 같은 이름의 응답 헤더에 추가한다. 기존 헤더에 새로운 값을 합치면, 기존 헤더와 새로운 값 사이에 쉼표를 붙인다. 이는 여러 헤더값을 지정하는 HTTP 표준 방식이다.
`add`
  헤더가 이미 있더라도 응답 헤더를 추가한다. 그래서 같은 이름의 헤더가 두개 (혹은 많이) 생길 수 있다. 이 경우 의외의 결과가 발생할 수 있기때문에 보통 대신 `append`를 사용해야 한다.
`unset`
  이런 이름의 응답 헤더가 있다면 삭제한다. 같은 이름을 가진 헤더가 여러개 있다면 모두 제거한다. value는 적지 않는다.
`echo`
  이런 이름의 요청 헤더를 그대로 응답 헤더로 보낸다. header에 정규표현식을 사용할 수 있다. value는 적지 않는다.

아규먼트 뒤에 header 이름이 나온다. 헤더명 뒤에 콜론을 적을 수 있지만, 없어도 된다. `set`, `append`, `add`, `unset`에서 대소문자는 무시한다. `echo`의 header 이름은 대수문자를 구별하고 정규표현식을 사용할 수 있다.

`add`, `append`, `set`을 사용할때는 세번째 아규먼트 value가 필요하다. value 안에 공백이 있다면 쌍따옴표로 묶어야 한다. value는 일반 문자열이나 형식을 기술하는 문자열이며, 두가지를 같이 사용할 수도 있다. value에서 지원하는 형식기술자는 다음과 같다.

형식 | 설명
--- | ---
`%%` | 퍼센트 기호
`%t` | 요청을 받은 시간을 국제표준시로 epoch (1970년 1월 1일) 이후 지난 마이크로초 단위로. 값 앞에 `t=`이 붙는다.
`%D` | 요청을 받은 시간부터 헤더를 네트웍에 쓸때까지 걸린 시간. 요청의 기간을 잰다. 값 앞에 `D=`이 붙는다.
`%{FOOBAR}e` | 환경변수 `FOOBAR`의 내용.
`%{FOOBAR}s` | `mod_ssl`이 동작한다면, SSL 환경변수 `FOOBAR`의 내용.

### 주의

`%s` 형식 지시자는 아파치 2.1 이후에만 있다. 이 지시자는 `SSLOptions +StdEnvVars`를 사용하는 부담을 덜기위해 `%e` 대신 사용할 수 있다. 어떤 이유에서건 `SSLOptions +StdEnvVars`를 사용해야 한다면, `%e`는 `%s` 보다 훨씬 더 효율적이다.

`Header` 지시어 뒤에 행동이 일어날 조건을 지시하는 추가 아규먼트나 이른 처리를 뜻하는 키워드 `early`가 나올 수 있다. `env=...` 아규먼트를 사용한 경우 해당 환경변수가 존재한다면 (혹은 `env=!...`에 나온 환경변수가 존재하지 않다면) `Header` 지시어가 동작한다. 그렇지 않으면 지시어는 요청에 아무 영향을 미치지 않는다.

이른 방식이 아니라면 응답을 네트웍으로 보내기 직전에 `Header` 지시어를 처리한다. 그래서 헤더 필터가 추가하는 헤더를 제외한 대부분의 헤더를 설정하거나 덮어쓸 수 있다.

## RequestHeader 지시어

설명: | HTTP 요청 헤더를 구성한다
문법: | `RequestHeader set|append|add|unset header [value] [early|env=[!]variable]`
사용장소: | 주서버설정, 가상호스트, directory, .htaccess
Override 옵션: | FileInfo
상태: | Extension
모듈: | mod_headers

이 지시어는 HTTP 요청 헤더를 합치거나 대체, 제거한다. 내용 핸들러가 실행하기 직전에 헤더를 수정하기때문에 받은 헤더를 수정할 수 있다. 첫번째 아규먼트에 따라 기능이 다르다. 첫번째 아규먼트로 아래 값중 하나를 사용할 수 있다.

`set`
  요청 헤더를 설정한다. 같은 이름으로 이미 헤더가 있다면 대체한다
`append`
  이미 존재하는 같은 이름의 요청 헤더에 추가한다. 기존 헤더에 새로운 값을 합치면, 기존 헤더와 새로운 값 사이에 쉼표를 붙인다. 이는 여러 헤더값을 지정하는 HTTP 표준 방식이다.
`add`
  헤더가 이미 있더라도 요청 헤더를 추가한다. 그래서 같은 이름의 헤더가 두개 (혹은 많이) 생길 수 있다. 이 경우 의외의 결과가 발생할 수 있기때문에 보통 대신 `append`를 사용해야 한다.
`unset`
  이런 이름의 요청 헤더가 있다면 삭제한다. 같은 이름을 가진 헤더가 여러개 있다면 모두 제거한다. value는 적지 않는다.

아규먼트 뒤에 헤더명이 나온다. 헤더명 뒤에 콜론을 적을 수 있지만, 없어도 된다. 대소문자는 무시한다. `add`, `append`, `set`을 사용할때는 세번째 아규먼트 value가 필요하다. value 안에 공백이 있다면 쌍따옴표로 묶어야 한다. unset을 사용할때는 value를 적으면 안된다. value는 일반 문자열이나 형식을 기술하는 문자열이며, 두가지를 같이 사용할 수도 있다. 지원하는 형식기술자는 `Header`와 같으므로 자세한 내용은 그곳을 참고하라.

`RequestHeader` 지시어 뒤에 행동이 일어날 조건을 지시하는 추가 아규먼트나 이른 처리를 뜻하는 키워드 `early`가 나올 수 있다. `env=...` 아규먼트를 사용한 경우 해당 환경변수가 존재한다면 (혹은 `env=!...`에 나온 환경변수가 존재하지 않다면) `RequestHeader` 지시어가 동작한다. 그렇지 않으면 지시어는 요청에 아무 영향을 미치지 않는다.

이른 방식이 아니라면 fixup 단계에서 요청에 해당하는 핸들러를 실행하기 직전에 `RequestHeader` 지시어를 처리한다. 그래서 브라우저에 따라 혹은 아파치 입력필터가 헤더를 덮어쓰거나 수정할 수 있다.

가능한 언어: en | ja | ko

## Comments

Notice:
This is not a Q&A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our mailing lists.