Envoy는 마이크로서비스 환경에서 프록시 역할을 수행하는 강력한 데이터 플레인(data plane)이다. 필터 체인을 통한 유연한 요청 처리, 동적 구성, 다양한 통계 수집 기능 덕분에 서비스 메시(mesh) 혹은 API Gateway 계층에서 널리 사용된다. 그러나 기능이 많고 유연한 만큼, 문서만 읽고 이해하기보다는 직접 실습을 통해 익히는 것이 중요하다.
Envoy 프로젝트는 이를 위해 다양한 기능을 컨테이너 환경에서 실험해볼 수 있도록 샌드박스(Sandbox) 예제를 제공하고 있다. 본 글에서는 그 중에서도 자주 사용되며 설정이 헷갈릴 수 있는 필터 3가지(Gzip 압축, CORS, Local RateLimit) 를 직접 실습한 과정을 정리한다.
Envoy 공식 문서의 샌드박스는 특정 기능에 대한 실습을 목적으로 제공되는 도커 기반 예제 환경이다. 처음 접할 땐 "샌드박스를 설치해야 기능이 활성화되는 건가?"라는 오해를 할 수도 있지만, 샌드박스는 어디까지나 실습을 위한 예제 구성 모음일 뿐이다.
즉, gzip, cors, local_ratelimit 같은 기능을 Envoy에서 쓰고 싶다면 샌드박스를 설치할 필요는 없다. 샌드박스에서 제공하는 envoy.yaml 설정을 참고해 실제 운영 중인 Envoy 인스턴스에 설정을 반영하면 된다.
공식 문서 링크: Envoy Sandbox Examples
샌드박스 예제는 다음과 같은 구조로 구성된다:
gzip, cors, local_ratelimit 등)envoy.yaml: 해당 필터가 설정된 Envoy 구성 파일docker-compose.yaml: 예제 실행용 컨테이너 설정클라이언트가 Accept-Encoding: gzip 헤더를 전송할 경우, Envoy가 응답 본문을 gzip으로 압축해 전송할 수 있도록 설정한다.
git clone https://github.com/envoyproxy/examples.git
cd examples/gzip
docker-compose up --build -d
# 압축 없음
curl -s http://localhost:10000/file.json -o /dev/null -w "%{size_download}\n"
# gzip 압축 적용
curl -s -H "Accept-Encoding: gzip" --compressed http://localhost:10000/file.json -o /dev/null -w "%{size_download}\n"
> 10485760 # 압축 전
> 11271 # 압축 후
압축 적용 전후의 응답 크기 차이가 극명하며, Gzip 필터가 제대로 동작함을 확인할 수 있다.
Envoy를 통해 백엔드 서비스를 호출할 때, 특정 오리진만 허용하거나 모두 허용, 혹은 CORS 정책을 비활성화하는 등 다양한 시나리오를 테스트한다.
cd examples/cors
bash verify.sh # 또는 docker-compose를 직접 구성
CORS 실습의 경우 프론트엔드와 백엔드가 함께 동작하므로, 두 서비스가 정상적으로 뜨는지 확인해야 한다.
localhost:8080
localhost:8081프론트엔드 UI에서 라디오 버튼을 선택하면 백엔드로 요청이 전송되며 CORS 허용 여부에 따라 동작이 달라진다.
/cors/open: 모든 오리진 허용/cors/disabled: CORS 비활성화/cors/restricted: 특정 오리진(*.envoyproxy.io)만 허용브라우저 콘솔 또는 네트워크 탭에서 CORS 오류 여부를 확인할 수 있다.
또한 Envoy의 관리 포트를 통해 관련 통계를 볼 수 있다.
curl http://localhost:8003/stats | grep cors
http.ingress_http.cors.origin_valid: 허용된 요청 수http.ingress_http.cors.origin_invalid: 차단된 요청 수⚠️
cors샌드박스는 frontend와 backend를 모두 포함하므로verify.sh를 실행하거나 각 디렉토리에서 수동으로 빌드/실행해야 한다.
Local RateLimit은 Redis 같은 외부 시스템 없이 Envoy 자체 내에서 간단한 요청 제한을 적용할 수 있게 해준다.
cd examples/local_ratelimit
docker-compose up --build -d
Envoy 설정에 초당 2회만 요청을 허용하도록 구성되어 있음.
for i in {1..5}; do
curl -si localhost:10000 | grep -E "x-local-rate-limit|429|local_rate_limited"
done
HTTP/1.1 429 Too Many Requests
x-local-rate-limit: true
local_rate_limited
curl http://localhost:9901/stats | grep http_local_rate_limit
http_local_rate_limiter.http_local_rate_limit.enabled: 필터가 적용된 요청 수http_local_rate_limiter.http_local_rate_limit.enforced: 실제로 제한된 요청 수http_local_rate_limiter.http_local_rate_limit.ok: 정상 처리된 요청 수http_local_rate_limiter.http_local_rate_limit.rate_limited: 제한된 요청 수이번 실습을 통해 Envoy의 대표적인 HTTP 필터 3가지 기능을 직접 구성하고 테스트해보았다.
💡 샌드박스는 Envoy 기능을 미리 실험해볼 수 있는 테스트 환경이지, 기능 활성화를 위한 전제 조건은 아니다. 필요한 기능을 운영에 적용하고자 할 때는 해당 예제의
envoy.yaml만 참고하면 된다.]