Apache HTTP Server Version 2.4

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

# 아파치 모듈 mod_headers

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

설명: | HTTP 요청 헤더와 응답 헤더 수정
상태: | Extension
모듈명: | headers_module
소스파일: | mod_headers.c
지원: | `RequestHeader`는 아파치 2.0에만 있다

### 요약

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

### 주제

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

### 지시어들

### Bugfix checklist

- httpd changelog
- Known issues
- Report a bug

## 처리 순서

`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` 지시어를 처리한다. 그래서 브라우저에 따라 혹은 아파치 입력필터가 헤더를 덮어쓰거나 수정할 수 있다.