Cloudflare를 사용하여 요청 URI를 변경하고 백엔드 서비스로 전달하려면 Cloudflare Workers를 사용하는 것이 좋습니다. Cloudflare Workers를 이용하면 간단한 JavaScript 코드를 통해 들어오는 요청의 URI를 수정하고 요청을 원하는 대상으로 리디렉션할 수 있습니다.
다음은 요청 URI를 변경하고 수정된 URI로 요청을 전달하는 예제 Cloudflare Worker 스크립트입니다.
addEventListener('fetch', event => {
event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
// 요청 URL을 새로운 URL로 변경
let url = new URL(request.url)
// 원본 도메인과 요청 경로 분리
if (url.hostname === "example.com") {
// 새 도메인으로 변경
url.hostname = "new-example.com"
// 요청 경로 변경
let path = url.pathname.split('-').join('/') // 예: '/webhook-adfasa' -> '/webhook/adfasa'
url.pathname = path
}
// 새로운 요청 객체 생성
let newRequest = new Request(url, request)
// 변경된 URL로 요청 전송
return fetch(newRequest)
}
이 스크립트는 들어오는 요청을 체크하여 도메인이 example.com
인 경우, 도메인을 new-example.com
으로 변경하고, 경로에서 하이픈(-
)을 슬래시(/
)로 치환하여 요청합니다. 이를 통해 원하는 형식의 새로운 요청을 백엔드 서비스로 전송할 수 있습니다.
Cloudflare Worker 설정 방법
- Cloudflare 대시보드에 로그인합니다.
- "Workers" 메뉴를 선택합니다.
- "Create a Worker"를 클릭하여 새 Worker를 생성합니다.
- 제공된 스크립트 편집기에 위의 JavaScript 코드를 복사하고 붙여넣습니다.
- "Save and Deploy"를 클릭하여 Worker를 배포합니다.
이 설정을 통해 지정한 요청 패턴에 따라 요청을 변환하고 적절한 백엔드 서비스로 라우팅할 수 있습니다.
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 내에서 요청을 동적으로 조작하고 라우팅할 수 있는 가장 강력한 도구이기 때문입니다. 비용 문제가 걱정된다면, 실제 사용량을 모니터링하여 예상치를 확인하고, 최적화된 로직을 사용하여 비용을 관리하는 방법을 고려할 수 있습니다.
댓글