EnvoyFilter

지원 버전: Istio 1.28+ 마지막 업데이트: 2026년 2월 19일

EnvoyFilter는 Envoy 프록시의 구성을 직접 커스터마이즈할 수 있는 고급 기능입니다.

목차

개요

EnvoyFilter를 사용하면:

  • 커스텀 헤더 추가/수정/삭제

  • Rate Limiting

  • External Authorization

  • WASM 플러그인 통합

구조

주요 사용 사례

1. 커스텀 헤더 추가

2. Rate Limiting

3. WASM 플러그인

X-Forwarded-For 및 Hop 설정

프록시 체인 환경에서 실제 클라이언트 IP를 추적하기 위해 X-Forwarded-For (XFF) 헤더와 hop 수를 제어하는 것은 매우 중요합니다.

X-Forwarded-For 개요

spinner

XFF 설정 옵션

1. use_remote_address 설정

use_remote_address는 Envoy가 XFF 헤더를 어떻게 처리할지 결정합니다.

use_remote_address 옵션:

설정 값
동작
사용 시나리오

true

다운스트림 주소를 XFF에 추가하고, 신뢰

Edge Proxy (인터넷 직접 접근)

false

다운스트림 주소를 신뢰하지 않고, XFF 그대로 전달

Internal Proxy (신뢰된 프록시 뒤)

2. xff_num_trusted_hops 설정

xff_num_trusted_hops는 XFF 헤더에서 신뢰할 수 있는 hop 수를 정의합니다.

xff_num_trusted_hops 계산 예시:

실제 시나리오별 설정

시나리오 1: AWS ALB + Istio Gateway

spinner

설정:

설명:

  • use_remote_address: true: Gateway가 edge proxy 역할

  • xff_num_trusted_hops: 1: ALB (마지막 hop)를 신뢰

  • 결과: 실제 클라이언트 IP (203.0.113.5)가 올바르게 추출됨

시나리오 2: Client → CloudFront → ALB → Gateway

spinner

설정:

XFF 계산:

시나리오 3: Client → CloudFront → NLB → ALB → Gateway

spinner

설정:

중요: NLB는 L4 로드 밸런서이므로 XFF 헤더를 읽거나 수정하지 않습니다. 따라서 XFF 체인에 영향을 주지 않습니다.

XFF 계산:

시나리오 4: Client → ALB → Gateway (직접 연결)

spinner

설정:

XFF 계산:

시나리오 3: 내부 서비스 간 통신 (Sidecar)

XFF 관련 추가 옵션

skip_xff_append

XFF 헤더에 현재 hop을 추가하지 않습니다.

사용 시나리오: 디버깅 또는 특정 XFF 체인 유지가 필요한 경우

via 헤더 설정

프록시 체인을 Via 헤더로 추적:

실제 클라이언트 IP 추출 예제

Lua 스크립트로 실제 클라이언트 IP 추출:

XFF 검증 및 디버깅

1. 헤더 확인

2. 실제 요청으로 테스트

3. Envoy 액세스 로그 활성화

보안 고려사항

1. XFF 스푸핑 방지

중요: Edge Gateway에서는 반드시 use_remote_address: true로 설정하여 클라이언트가 XFF를 조작하는 것을 방지해야 합니다.

2. 내부 서비스 보호

선택적 앱별 IP 제한 (Gateway + AuthorizationPolicy)

시나리오: 일부 앱(A-E)은 모든 클라이언트 허용, 특정 앱(F-G)은 회사 NAT IP만 허용

아키텍처 개요

spinner

핵심 원리

Gateway의 역할 (모든 앱에 공통 적용):

  • XFF 헤더에서 원본 클라이언트 IP 추출

  • 신뢰할 수 있는 hop 제외 (xff_num_trusted_hops)

  • 접근 제어는 하지 않음 - 단지 IP를 정확히 식별하는 역할

AuthorizationPolicy의 역할 (특정 앱에만 선택적 적용):

  • Gateway가 추출한 원본 IP를 기반으로 접근 제어

  • selector로 특정 앱만 대상으로 지정

  • 정책이 없는 앱은 모든 클라이언트 허용

구현 예시

1단계: Gateway에서 XFF 처리 (전체 앱 공통)

2단계: App F에 IP 제한 적용 (선택적)

3단계: App G에 IP 제한 적용 (선택적)

4단계: App A-E는 AuthorizationPolicy 없음 (모든 클라이언트 허용)

동작 흐름

spinner

왜 Gateway 설정이 필요한가?

Gateway XFF 설정 없이는:

  • remoteIpBlocks가 ALB의 IP를 읽음 (원본 IP가 아님)

  • 모든 요청이 동일한 ALB IP로 보여서 제대로 필터링 불가

Gateway XFF 설정 있으면:

  • Gateway가 XFF 헤더에서 원본 IP 정확히 추출

  • AuthorizationPolicy의 remoteIpBlocks가 원본 IP 사용

  • 각 앱의 AuthorizationPolicy가 정확히 작동

테스트

요약

구성 요소
적용 범위
목적
필수 여부

Gateway EnvoyFilter

모든 앱

XFF에서 원본 IP 추출

✅ 필수 (한 번만)

App F AuthorizationPolicy

App F만

회사 NAT IP만 허용

선택적

App G AuthorizationPolicy

App G만

회사 NAT IP만 허용

선택적

App A-E AuthorizationPolicy

없음

제한 없음 (모든 IP 허용)

불필요

핵심 포인트:

  • Gateway XFF 설정은 IP 추출만 수행, 접근 제어 안 함

  • AuthorizationPolicy는 선택적으로 특정 앱에만 적용

  • 정책이 없는 앱은 자동으로 모든 클라이언트 허용


XFF 기반 IP 접근 제어

X-Forwarded-For 헤더의 원본 클라이언트 IP를 기반으로 접근 제어를 구현합니다.

권장 방법: AuthorizationPolicy의 remoteIpBlocks 사용 (EnvoyFilter보다 선언적이고 안전)

1. AuthorizationPolicy로 IP Whitelist (권장)

장점:

  • ✅ 선언적이고 이해하기 쉬움

  • ✅ Istio가 자동으로 XFF 헤더 파싱

  • ✅ CIDR 범위 지원

  • ✅ Istio 업그레이드 시 안전

  • ✅ 별도 코드 작성 불필요

2. AuthorizationPolicy로 IP Blacklist (권장)

3. 경로별 IP 제한 (AuthorizationPolicy)

4. 복합 정책: IP + 경로 + 메서드

5. Whitelist + Blacklist 조합

처리 순서: DENY 정책이 먼저 평가되므로 Blacklist가 우선 적용됩니다.

6. 테스트

7. 고급: EnvoyFilter로 커스텀 거부 메시지 (선택적)

AuthorizationPolicy는 기본적으로 RBAC: access denied 메시지를 반환합니다. 커스텀 메시지가 필요한 경우에만 EnvoyFilter 추가:

모범 사례

  1. Edge Gateway 설정:

    • use_remote_address: true

    • xff_num_trusted_hops: 신뢰하는 프록시 수만큼 설정

  2. Internal Sidecar 설정:

    • use_remote_address: false

    • skip_xff_append: false

  3. 검증 및 테스트:

    • 프로덕션 배포 전 XFF 동작 철저히 테스트

    • 액세스 로그로 실제 클라이언트 IP 추출 확인

  4. 보안:

    • Edge에서 XFF 스푸핑 방지

    • 신뢰할 수 없는 소스의 XFF 무시

정적 응답 설정

특정 요청에 대해 백엔드 서비스를 거치지 않고 정적 응답을 직접 반환할 수 있습니다. 이는 유지보수 모드, 에러 페이지, 헬스체크 응답 등에 유용합니다.

정적 응답 개요

spinner

사용 사례

  1. 유지보수 모드: 503 Service Unavailable 반환

  2. 헬스체크 엔드포인트: 200 OK 반환

  3. 커스텀 에러 페이지: JSON 또는 HTML 에러 응답

  4. 테스트/모의 응답: 특정 경로에 미리 정의된 응답

  5. 빠른 거부: 인증 실패 시 401 Unauthorized 즉시 반환

구현 방법 선택 가이드

Istio는 정적 응답을 구현하는 여러 방법을 제공합니다:

방법
사용 시기
장점
단점

VirtualService

간단한 정적 응답, 라우팅 규칙과 통합

선언적, 이해하기 쉬움

제한된 커스터마이징

ProxyConfig

워크로드별 Envoy 설정

세밀한 제어, 성능 튜닝

복잡한 구성

AuthorizationPolicy

IP/헤더 기반 접근 제어

보안 정책과 통합

정적 응답 전용 아님

EnvoyFilter

위 방법으로 불가능한 경우만

최대 유연성

복잡, 업그레이드 위험

권장: 가능한 한 VirtualServiceAuthorizationPolicy를 먼저 사용하고, 필요한 경우에만 EnvoyFilter 사용

VirtualService로 정적 응답 구현

1. 기본 정적 응답 (directResponse)

결과:

2. 헬스체크 엔드포인트

3. 특정 경로 차단

4. Fault Injection으로 에러 시뮬레이션

AuthorizationPolicy로 접근 제어

1. 소스 IP 기반 접근 제어

2. 경로별 IP 제한

3. X-Forwarded-For 헤더 기반 제어

AuthorizationPolicy는 remoteIpBlocks를 사용하여 X-Forwarded-For 헤더의 원본 IP를 확인할 수 있습니다:

중요: remoteIpBlocks가 작동하려면 Gateway에서 xff_num_trusted_hops를 올바르게 설정해야 합니다 (위 XFF 설정 참조).

4. 커스텀 거부 응답

AuthorizationPolicy로 차단된 요청은 기본적으로 403 응답을 반환하지만, EnvoyFilter와 결합하여 커스텀 응답을 제공할 수 있습니다:

ProxyConfig로 Envoy 설정

ProxyConfig를 사용하면 워크로드별로 Envoy 프록시를 세밀하게 구성할 수 있습니다.

1. 워크로드별 프록시 설정

2. 통계 및 메트릭 설정

통합 예제: VirtualService + AuthorizationPolicy

실제 프로덕션 시나리오를 위한 통합 예제입니다.

시나리오: API 서비스 보호

Lua를 사용한 동적 정적 응답

Lua 스크립트를 사용하면 조건에 따라 동적으로 정적 응답을 생성할 수 있습니다.

유지보수 시간대 자동 감지

요청 헤더 기반 응답

VirtualService와 통합

VirtualService와 EnvoyFilter를 함께 사용하여 더 복잡한 라우팅 시나리오를 구현할 수 있습니다.

실전 시나리오

시나리오 1: Blue/Green 배포 중 트래픽 차단

시나리오 2: Rate Limit 초과 시 429 응답

시나리오 3: 카나리 배포 테스트 응답

테스트 및 검증

정적 응답 테스트

Envoy 구성 확인

모범 사례

  1. 명확한 에러 메시지:

    • 사용자에게 문제의 원인과 해결 방법 제공

    • Retry-After 헤더로 재시도 시간 명시

  2. 일관된 에러 형식:

    • 모든 에러 응답에 동일한 JSON 스키마 사용

    • HTTP 상태 코드와 에러 코드 일관성 유지

  3. 로깅 및 모니터링:

    • 정적 응답 반환 시 로그 기록

    • 메트릭으로 정적 응답 빈도 추적

  4. 점진적 적용:

    • 유지보수 모드 전환 시 단계적으로 적용

    • 카나리 배포로 테스트 후 전체 적용

  5. 롤백 계획:

    • EnvoyFilter 제거로 즉시 정상 트래픽 복구

    • 긴급 상황 대비 자동화된 롤백 스크립트

주의사항

  1. 우선순위: EnvoyFilter의 정적 응답은 VirtualService보다 우선 적용될 수 있음

  2. 성능: Lua 스크립트는 모든 요청에 실행되므로 성능 영향 고려

  3. 보안: 에러 메시지에 민감한 정보 노출 주의

  4. 캐싱: 정적 응답도 Cache-Control 헤더 설정 필요

  5. 메트릭: 정적 응답은 일반 응답과 다른 메트릭 생성

실전 예제

예제 1: 요청/응답 로깅

예제 2: JWT 검증

모범 사례

  1. workloadSelector 사용: 특정 워크로드에만 적용

  2. 테스트 환경 우선: 프로덕션 전 충분한 테스트

  3. Istio 버전 호환성: 버전별 API 확인

  4. 성능 모니터링: EnvoyFilter 추가 후 성능 확인

문제 해결

참고 자료

마지막 업데이트