본문 바로가기
네트워크 (LAN,WAN)

Cloudflare Workers 프록시 원본 서버 전달 시 헤더값 조작 방법

by 날으는물고기 2024. 6. 29.

Cloudflare Workers 프록시 원본 서버 전달 시 헤더값 조작 방법

Eliminating cold starts with Cloudflare Workers

Cloudflare Workers를 사용하여 요청을 프록시할 때, 대부분의 헤더 값을 수정할 수 있지만 Host 헤더는 변경할 수 없습니다. Host 헤더는 원본 서버에 대한 정보를 가지고 있으며, 보안상의 이유로 Cloudflare는 이 헤더의 수정을 허용하지 않습니다. 따라서, 사용자가 Cloudflare Workers를 통해 요청을 보낼 때, Host 헤더는 자동으로 원본 서버의 호스트 이름으로 설정되며 이를 변경하는 것은 불가능합니다.

 

Host 헤더를 직접 변경할 수 없는 상황에서 요청 URL의 첫 번째 폴더명을 백엔드 호스트 이름으로 사용하려면 다음과 같은 방법을 고려할 수 있습니다.

1. 서브도메인 사용

URL의 첫 번째 폴더명을 서브도메인으로 이용하는 방식을 고려할 수 있습니다. 예를 들어, https://example.com/folder1/page 요청을 https://folder1.example.com/page 로 재구성할 수 있습니다. 이 경우 Cloudflare DNS 설정에서 각 서브도메인을 적절한 백엔드 서버로 라우팅할 수 있습니다.

2. Cloudflare Workers 사용

Cloudflare Workers를 사용하여 요청을 중간에서 가로채고, 요청 URL을 분석한 후 적절한 백엔드 서버로 요청을 전송할 수 있습니다. 예를 들어 다음과 같은 스크립트를 사용할 수 있습니다.

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})

async function handleRequest(request) {
  // URL을 파싱하여 첫 번째 폴더 이름을 추출
  const url = new URL(request.url);
  const path = url.pathname.split('/')[1]; // 첫 번째 폴더명

  // 새로운 URL 생성
  const newUrl = `https://${path}.example.com${url.pathname.replace(`/${path}`, '')}`;

  // 새로운 요청 객체 생성
  const newRequest = new Request(newUrl, {
    method: request.method,
    headers: request.headers,
    body: request.body
  });

  // 새로운 요청을 백엔드로 전송
  return fetch(newRequest);
}

이 스크립트는 첫 번째 폴더명을 서브도메인으로 변환하여 요청을 새로운 주소로 리디렉션합니다.

3. 백엔드 구성 변경

백엔드 서버를 구성하여, Host 헤더 대신 다른 헤더 또는 URL 경로를 기반으로 적절한 처리를 할 수 있도록 설정하는 방법도 고려해볼 수 있습니다. 예를 들어, 백엔드에서 특정 경로를 기반으로 라우팅 로직을 구현할 수 있습니다.

 

이러한 방법들을 통해 Host 헤더를 변경하지 않고도 요청을 적절한 백엔드 서버로 라우팅하는 로직을 구현할 수 있습니다. 각 방법의 구현 복잡성과 운영 환경에 따라 가장 적합한 방법을 선택하시면 됩니다.

 

Cloudflare Workers 외에도 여러 대안적인 방법들이 있어서, 첫 번째 폴더명을 백엔드 호스트 이름으로 활용하고자 할 때 적용할 수 있습니다. 다음은 몇 가지 가능한 대안적인 접근 방법입니다.

1. 로드 밸런서 또는 리버스 프록시 사용

NGINX 또는 Apache와 같은 로드 밸런서 또는 리버스 프록시 서버를 사용하여 URL 경로를 분석하고, 첫 번째 폴더명에 따라 요청을 적절한 백엔드 서버로 라우팅할 수 있습니다. 이들 소프트웨어는 규칙 기반의 URL 리라이팅과 리버스 프록시 기능을 제공하여, 요청을 동적으로 처리할 수 있습니다.

2. 애플리케이션 서버에서 라우팅 처리

애플리케이션 레벨에서 직접 라우팅 로직을 구현할 수 있습니다. 예를 들어, Node.js, Django, 또는 Spring과 같은 웹 프레임워크를 사용하여 URL의 첫 번째 폴더명을 추출하고 해당 정보를 기반으로 내부적으로 요청을 적절한 서비스나 컨트롤러로 전달할 수 있습니다.

3. DNS 레벨에서의 서브도메인 동적 할당

DNS 서비스에서 와일드카드 서브도메인을 지원하는 경우, 첫 번째 폴더명을 서브도메인으로 사용하여 DNS 레벨에서 동적으로 백엔드 서버로 라우팅할 수 있습니다. 예를 들어, folder1.example.com가 자동으로 적절한 IP 주소로 해석되도록 DNS 레코드를 설정할 수 있습니다.

4. 컨테이너 오케스트레이션 도구 사용

Kubernetes 같은 컨테이너 오케스트레이션 플랫폼을 사용하여 서비스를 동적으로 스케일링하고 라우팅하는 로직을 구현할 수 있습니다. Ingress 컨트롤러를 사용하여 URL 경로에 따라 요청을 적절한 컨테이너 서비스로 라우팅할 수 있습니다.

5. 서드파티 API 게이트웨이 사용

API 게이트웨이 제품을 사용하여, 첫 번째 폴더명을 사용하여 요청을 적절한 백엔드로 라우팅하는 로직을 구현할 수 있습니다. 이들은 종종 복잡한 라우팅 규칙, SSL 종료, 인증 및 인가 처리 등을 지원합니다.

 

각 방법의 장단점을 고려하여 환경에 가장 적합한 방법을 선택하는 것이 중요합니다. 기술 스택, 유지 관리 용이성, 성능 요구 사항 및 비용 등 다양한 요소를 고려해야 합니다.

 

Cloudflare에서 직접 해결하고자 한다면, Cloudflare Workers를 제외하고도 몇 가지 방법이 있습니다. 그러나 Host 헤더를 직접 변경하는 것은 불가능하므로, 다른 접근 방법을 고려해야 합니다.

1. 페이지 규칙 사용

Cloudflare의 페이지 규칙을 사용하여 특정 URL 패턴에 대한 리다이렉트 또는 기타 설정을 구현할 수 있습니다. 이는 URL의 첫 번째 폴더명을 서브도메인으로 리다이렉트하는 등의 동작을 정의할 수 있으나, 동적으로 Host 헤더를 변경하는 것은 지원하지 않습니다.

2. 변형된 Workers 접근 방식

Cloudflare Workers를 사용하지 않으려는 주된 이유가 비용이나 복잡성 때문이라면, 가장 간단한 로직만을 사용하는 Workers 스크립트를 구현하여 비용을 최소화할 수 있습니다. 예를 들어, URL을 파싱하고 특정 경로에 따라 리다이렉션하는 간단한 스크립트는 리소스 사용이 매우 적으므로 비용이 크게 증가하지 않을 수 있습니다.

3. Cloudflare Transform Rules

최근 Cloudflare는 Transform Rules 기능을 도입했습니다. 이 기능을 통해 HTTP 요청의 특정 부분을 변경할 수 있습니다. 하지만 이것은 주로 URL 경로, 쿼리 스트링, 또는 헤더 값을 변경하는 데에 초점을 맞추고 있으며 Host 헤더를 포함한 모든 변경은 제한적입니다.

4. Cloudflare Load Balancer

Cloudflare Load Balancer를 사용하여 트래픽을 다양한 백엔드 서버로 분산할 수 있습니다. URL 경로 또는 기타 요청 특성에 기반하여 트래픽을 특정 백엔드로 라우팅하는 규칙을 설정할 수 있지만, 이 역시 Host 헤더를 직접 변경하지는 않습니다.

가장 현실적이고 간단한 방법은, 가능한 한 Cloudflare Workers를 사용하여 요청을 조작하는 것입니다. 이것이 Cloudflare 내에서 요청을 동적으로 조작하고 라우팅할 수 있는 가장 강력한 도구이기 때문입니다. 비용 문제가 걱정된다면, 실제 사용량을 모니터링하여 예상치를 확인하고, 최적화된 로직을 사용하여 비용을 관리하는 방법을 고려할 수 있습니다.

728x90

댓글