본문 바로가기
WIKI 기술 지식 베이스

별칭 이름을 가진 헤더

원문 보기 위키 갱신

출처: Headers with Aliasing Names

본문

Headers with Aliasing Names

헤더 이름 별칭화를 통한 헤더 스푸핑 방지

Go는 대시(dash)에서만 헤더 이름을 정규화해요. 그래서 X-Auth-User, X_Auth_User, X.Auth.User를 서로 다른 세 개의 헤더로 처리해요.

많은 백엔드(CGI, WSGI, PHP, NGINX 등)는 변수 이름을 헤더 이름에서 파생해요. 즉 헤더 이름을 대문자로 바꾸고, 문자도 숫자도 아닌 모든 문자를 밑줄(underscore)로 치환해요. 그런 백엔드에게 위 세 이름은 모두 같은 HTTP_X_AUTH_USER 변수예요.

밑줄과 점만 해당되는 건 아니에요. 문자, 숫자, 대시에 더해 HTTP는 헤더 이름에 다음 문자들을 허용해요:

!  #  $  %  &  '  *  +  .  ^  _  `  |  ~

이 각각은 그런 백엔드에서 밑줄로 바뀌기 때문에 각각 별칭을 만든답니다: X_Auth_User, X.Auth.User, X!Auth!User, X~Auth~User, X+Auth+User는 모두 X-Auth-User로 읽혀요. 문자, 숫자, 대시만 그대로 남으므로 대시 형태만 모호함이 없어요.

그 결과, 클라이언트가 Traefik이 관리하는 헤더의 별칭을 이를 관리하는 미들웨어를 우회해 몰래 들여보내고, 그런 백엔드가 Traefik이 검증한 값 대신 스푸핑된 값을 읽게 만들 수 있어요.

구성

aliasHeadersStrategy 엔트리포인트 옵션이 이런 종류의 스푸핑에 대한 완화책이에요. 이 옵션은 라우팅 전에 다른 헤더 이름을 별칭으로 갖는 요청 헤더를 어떻게 처리할지를 제어해요:

  • keep (기본값): 별칭 이름을 가진 요청 헤더를 그대로 전달해요.

  • delete: 이름에 문자, 숫자, 대시 중 어떤 것도 아닌 문자가 들어 있는 모든 요청 헤더를 요청에서 조용히 제거해요.

  • reject: 이름에 문자, 숫자, 대시 중 어떤 것도 아닌 문자가 들어 있는 헤더를 실은 요청을 400 Bad Request 응답으로 거부해요.

정당한 헤더도 함께 제거돼요

delete와 reject 전략은 Traefik이 관리하는 헤더뿐 아니라 모든 요청 헤더에 적용돼요: 이들은 스푸핑 시도와 우연히 그런 문자를 이름에 포함한 정당한 헤더를 구분할 수 없어요. 예를 들어 X_Request_Id라는 헤더에 의존하는 애플리케이션은 delete에서는 그 헤더를 더 이상 받지 못하고, reject에서는 요청이 거부돼요.

실제로 헤더 이름은 문자, 숫자, 대시로만 만들어지고 IANA 레지스트리의 어떤 헤더도 다른 문자를 포함하지 않아요. 이 옵션을 켜기 전에 (기본 NGINX 구성은 이미 밑줄을 버리는데도) 의도적으로 그런 이름을 사용하는 백엔드가 있는지 확인해야 해요.

보안 고려 사항

aliasHeadersStrategy를 delete나 reject로 설정하는 건 엔트리포인트가 헤더 이름을 정규화하는 백엔드 앞에 있을 때 강력히 권장돼요. 요청 헤더를 관리하는 미들웨어(ForwardAuth authResponseHeaders, BasicAuth와 DigestAuth headerField, PassTLSClientCert, Headers customRequestHeaders, StripPrefix, ReplacePath 등)는 자신이 설정한 헤더의 정규 형태만 관리하며, 별칭 이름으로 스푸핑되지 않도록 이 옵션에 의존해요.

Traefik은 이 옵션을 구성하지 않은 채 남겨둔 각 엔트리포인트에 대해 시작 시 경고를 로그로 남겨요.

File (YAML)

entryPoints:
  websecure:
    address: ":443"
    http:
      aliasHeadersStrategy: delete  # Default: keep

File (TOML)

[entryPoints.websecure]
  address = ":443"

  [entryPoints.websecure.http]
    aliasHeadersStrategy = "delete"

CLI

--entryPoints.websecure.address=:443
--entryPoints.websecure.http.aliasHeadersStrategy=delete

더 이상 사용되지 않는 옵션

underscoreHeadersStrategy 옵션은 aliasHeadersStrategy를 위해 더 이상 사용되지 않아요. 후자는 밑줄만이 아니라 모든 별칭 문자를 처리해요. 자세한 내용은 기능 폐지 공지(feature deprecation notices)를 참고하세요.

더 알아보기