APISIX의 교차 출처(CORS) 솔루션에 대한 심층 분석
January 27, 2024
웹 애플리케이션 개발에서 크로스 오리진(Cross-Origin) 문제는 인기 있는 주제가 되었습니다. 그러나 API 게이트웨이의 광범위한 채택으로 인해 이제 크로스 오리진 문제를 해결하기 위한 더 편리하고 효율적인 솔루션을 갖게 되었습니다. API 게이트웨이는 애플리케이션 아키텍처의 핵심 구성 요소로서, 요청 라우팅 및 API 관리와 같은 기능을 제공할 뿐만 아니라 크로스 오리진 요청을 효과적으로 처리하여 개발자가 브라우저의 동일 출처 정책(Same-Origin Policy) 제한을 우회할 수 있도록 도와줍니다. 이 글에서는 API 게이트웨이인 APISIX를 사용하여 크로스 오리진 문제를 해결하는 방법에 대해 깊이 있게 다룰 것입니다.
크로스 오리진이란?
크로스 오리진 문제는 주로 브라우저에서 시행하는 동일 출처 정책에서 비롯됩니다. 동일 출처 정책은 요청의 출처(프로토콜, 도메인, 포트)가 대상 리소스와 정확히 동일해야 하며, 그렇지 않으면 브라우저가 요청을 차단합니다. 이 정책은 사용자 정보 보안을 보호하고 악성 웹사이트가 데이터를 도용하는 것을 방지하기 위한 목적이 있습니다. 그러나 실제 개발에서는 프론트엔드와 백엔드의 분리 또는 다른 도메인이나 포트로의 배포와 같은 시나리오에서 크로스 오리진 문제가 자주 발생합니다.
APISIX를 사용하여 크로스 오리진 문제 해결하기
CORS (Cross-Origin Resource Sharing)
CORS(Cross-Origin Resource Sharing)는 W3C 표준으로, 브라우저가 크로스 오리진 서버로 요청을 보낼 수 있도록 하여 동일 출처 정책의 제한을 극복합니다. APISIX에서는 개발자가 CORS 플러그인을 사용하여 CORS 규칙을 쉽게 구성할 수 있으며, 어떤 출처가 리소스에 접근할 수 있는지 지정할 수 있습니다.
APISIX에서 CORS를 구성하기 위해 curl을 사용한 예제 명령어:
curl http://127.0.0.1:9180/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d ' { "uri": "/hello", "plugins": { "cors": {} }, "upstream": { "type": "roundrobin", "nodes": { "127.0.0.1:8080": 1 } } }'
이 명령어는 APISIX의 Admin API에 PUT 요청을 보내 ID가 1인 라우트를 생성합니다. 라우트는 URI 경로가 /hello
로 설정되었으며, 기본 구성으로 CORS 플러그인이 활성화됩니다. 또한 업스트림 서버가 127.0.0.1:8080
으로 지정됩니다.
테스트 요청을 실행하면 기본 구성 결과를 얻을 수 있습니다:
curl http://127.0.0.1:9080/hello -v
...
< Server: APISIX web server
< Access-Control-Allow-Origin: *
< Access-Control-Allow-Methods: *
< Access-Control-Allow-Headers: *
< Access-Control-Expose-Headers: *
< Access-Control-Max-Age: 5
...
CORS 정책을 조정해야 하는 경우, 관련 플러그인 구성을 수정하기만 하면 됩니다. 다음은 일반적으로 사용되는 몇 가지 구성 옵션입니다:
-
allow_origins
: 크로스 오리진 접근이 허용되는 출처를 지정합니다. 특정 URL이거나 와일드카드 '*'를 사용하여 모든 출처를 허용할 수 있습니다. 여러 값은 쉼표로 구분됩니다. -
allow_methods
: 크로스 오리진 접근이 허용되는 HTTP 메서드를 정의합니다. 예를 들어 GET, POST 등이 있습니다. 여러 값은 쉼표로 구분됩니다. -
allow_headers
: 크로스 오리진 요청에서 사용자 정의 헤더 필드를 허용합니다. 여러 값은 쉼표로 구분됩니다. -
expose_headers
: 크로스 오리진 응답에서 노출할 사용자 정의 헤더 필드를 지정합니다. 여러 값은 쉼표로 구분됩니다. -
max_age
: 브라우저가 CORS 응답을 캐시할 최대 시간을 설정합니다. -
allow_credentials
: 크로스 오리진 요청에서 자격 증명(예: 쿠키)을 허용할지 여부를 결정합니다.
주의 사항
CORS는 사용하기 쉽지만, 이를 활성화하면 보안 문제가 발생할 수 있다는 점에 특히 주의해야 합니다. 이는 주로 CORS가 동일 출처 정책의 제한을 완화하여 다른 출처의 요청이 리소스에 접근할 수 있도록 허용하기 때문입니다.
이러한 맥락에서 allow_credentials
에 주목할 필요가 있습니다. allow_credentials
는 CORS에서 중요한 구성 항목으로, 크로스 오리진 요청이 인증 정보를 포함할 수 있는지 여부를 결정합니다. 이는 쿠키, HTTP 인증 정보 또는 클라이언트 SSL 인증서와 같은 민감한 데이터를 포함할 수 있습니다.
기본적으로 allow_credentials
는 비활성화되어 있으며, 이는 인증 정보를 포함할 수 없음을 의미합니다. 그러나 CORS가 활성화되고 인증 정보를 포함할 수 있도록 설정된 경우(allow_credentials: true
), 추가적인 주의가 필요합니다. 이는 다른 출처의 요청도 보호된 리소스에 접근할 수 있으며, 민감한 작업을 실행할 수 있음을 의미합니다. 예를 들어, 이 구성 취약점을 악용한 악성 웹사이트는 사용자가 크로스 오리진 요청을 시작하도록 유도하여 세션 쿠키를 도용하거나 무단 작업을 수행할 수 있습니다.
크로스 오리진 요청을 활성화할 때 잠재적인 보안 문제를 최소화하기 위해 다음의 모범 사례를 따르는 것이 좋습니다:
allow_origin
을 신중하게 구성:allow_origin
을 무분별하게*
(모든 출처 허용)로 설정하지 말고, 명시적으로 허용할 출처를 지정하세요.allow_credentials
제한:allow_credentials
는 필요한 경우에만 활성화하고 신뢰할 수 있는 출처로 제한하세요.- 보안 전송 프로토콜 사용: CORS 요청이 HTTPS를 통해 전송되도록 하여 중간자 공격을 방지하세요.
- 검증 및 권한 부여: 백엔드 서버에서 크로스 오리진 요청에 대한 적절한 검증 및 권한 부여 검사를 구현하여 권한이 있는 사용자만 민감한 리소스에 접근할 수 있도록 하세요.
- 안전하지 않은 HTTP 메서드 사용 금지: 크로스 오리진 요청에서 사용되는 HTTP 메서드를 제한하고, GET 및 POST와 같은 안전한 메서드만 허용하며, PUT 및 DELETE와 같은 잠재적으로 위험한 메서드는 비활성화하세요.
리버스 프록시
CORS를 사용하는 것 외에도, APISIX는 리버스 프록시로 구성하여 간접적으로 크로스 오리진 문제를 해결할 수 있습니다. 리버스 프록시는 일반적인 서버 아키텍처 패턴으로, 리버스 프록시 서버는 클라이언트와 대상 서버 사이의 중개자 역할을 합니다. 클라이언트가 요청을 시작하면 이러한 요청은 먼저 리버스 프록시 서버로 전송되고, 리버스 프록시 서버는 이를 실제 대상 서버로 전달합니다. 처리가 완료되면 대상 서버의 응답이 리버스 프록시로 반환되고, 최종적으로 클라이언트에게 전달됩니다.
리버스 프록시 자체가 직접적으로 크로스 오리진 문제를 해결하지는 않지만, 브라우저의 동일 출처 정책 제한을 교묘히 우회한다는 점을 이해하는 것이 중요합니다. 클라이언트가 크로스 오리진 요청을 해야 할 때, 실제로는 대상 서버에 직접 요청을 보내는 대신 리버스 프록시 서버에 요청을 보냅니다. 리버스 프록시 서버와 대상 서버는 일반적으로 동일한 네트워크 환경 또는 구성에 있기 때문에, 이들 간의 통신은 동일 출처 정책의 제한을 받지 않습니다. 이를 통해 리버스 프록시 서버는 클라이언트의 요청을 자유롭게 대상 서버로 전달하고, 응답을 클라이언트에게 반환하여 간접적으로 크로스 오리진 접근을 달성할 수 있습니다.
APISIX는 API 게이트웨이로서, 클라이언트와 서버 사이에 배치되도록 설계되었습니다. 따라서 소규모 애플리케이션에서는 클라이언트 애플리케이션과 APISIX를 동일한 도메인에 배치하고, 클라이언트의 요청 주소를 APISIX 서비스 주소로 수정하여 클라이언트가 APISIX에 원활하게 접근할 수 있도록 할 수 있습니다. 이를 통해 리버스 프록시 기능을 활용하여 클라이언트에게 크로스 오리진 접근을 제공할 수 있습니다. 또한 다른 플러그인과 결합하여 전체 통신 과정의 보안과 신뢰성을 보장할 수 있습니다.
결론
이 글에서는 APISIX를 사용하여 크로스 오리진 문제를 해결하는 방법을 탐구했으며, 특히 CORS와 리버스 프록시라는 두 가지 방법에 초점을 맞췄습니다. CORS 플러그인을 적절히 구성함으로써 브라우저의 동일 출처 정책 제한을 완화하여 크로스 오리진 요청이 리소스에 접근할 수 있도록 할 수 있습니다. 반면, 리버스 프록시는 중개자 역할을 하여 브라우저의 동일 출처 정책을 우회하고 크로스 오리진 접근을 용이하게 합니다. 각 방법은 각자의 장점이 있으며, 적절한 솔루션을 선택하는 것은 특정 요구 사항에 따라 달라집니다. CORS를 사용하든 리버스 프록시를 사용하든, APISIX는 유연하고 강력한 기능을 제공하여 개발자가 크로스 오리진 문제를 원활하게 해결하고 애플리케이션의 정상적인 운영과 사용자 경험을 보장할 수 있도록 도와줍니다.