들어가기 전

네트워크와 소프트웨어 설계를 공부하다 보면 가장 많이 마주치는 단어 중 하나가 바로 프록시(Proxy)이다. 이는 단순히 하나의 기술을 지칭하는 것이 아니라, 설계 패턴부터 실제 서버 인프라에 이르기까지 폭넓게 쓰이는 개념이다. 디자인 패턴의 관점에서 시작하여 실제 인프라 활용 사례와 개발자를 괴롭히는 CORS 에러 해결 방법까지 차례대로 정리해보았다.

프록시 패턴(Proxy Pattern)

프록시 패턴은 대상 객체에 접근하기 전 그 흐름을 가로채서 대상 인터페이스 역할을 수행하는 디자인 패턴을 의미한다. 클라이언트와 실제 객체 사이에 통제 가능한 중간 계층을 만들어 객체의 본래 로직을 수정하지 않고도 사용 절차를 제어하거나 기능을 확장하는 것이 핵심이다.

이 패턴은 실제 객체의 기능을 실행하기 전 유효한 접근인지 확인하는 데이터 검증 및 권한 검사 단계에서 유용하게 쓰인다. 또한 동일한 요청에 대해 실제 객체까지 가지 않고 프록시에서 즉시 데이터를 반환하는 캐싱 작업이나, 객체에 접근한 기록을 남겨 모니터링하는 로깅 작업 등에도 폭넓게 활용한다.

프록시 서버 (Proxy Server)

보통 클라이언트와 실제 서버 중간에 위치해 양측의 중개인 역할을 하는 서버이다. 실서버 IP를 숨기고 프록시 서버 IP로 대신 접근하게 하거나, 자주 찾는 데이터들을 미리 프록시 서버에 저장해놓고 캐싱할 수도 있다. 또한 서버를 목표로 하는 공격, 불분명한 접근 등을 프록시 선에서 차단할 수 있다.

Forward Proxy vs Reverse Proxy

260225-1
프록시 서버가 클라이언트와 서버 중간에 위치해 있지만, 누구를 위해 존재하는지에 따라 2가지로 나뉜다.

Forward Proxy

말 그대로 앞으로 나가는 곳, 즉 클라이언트 측을 보호하기 위한 프록시로 내부 망 출구에 위치하며, 클라이언트가 외부 인터넷(Google, Naver etc)에 연결하는 요청을 관리한다. 기업 내부 망, 학교 실습실 등 보안 및 관리 목적으로 사용된다. 모든 요청이 프록시 서버를 거치게 만들어 유해 사이트, 업무와 무관한 사이트로 연결하는 것인지 등을 확인하고 내부에서 사용하는 IP가 아닌 프록시 서버의 IP를 사용해 목적지 서버에 요청을 하고 다시 응답 반환한다.

Reverse Proxy

실제 서버 입구에서 서버를 보호하기 위한 프록시로 서버 대리인 역할을 한다. 클라이언트의 요청을 대신 받아 직접 실서버로 전달하고, 그 결과를 다시 클라이언트에게 전달한다. 클라이언트는 리버스 프록시의 IP로 요청을 보내게 되고, 실제 서버의 IP를 알지 못한다.

nginx(“engine x”)

nginx는 가장 대표적인 리버스 프록시 서버이다. 비동기 이벤트 기반 아키텍쳐를 사용해서 다수의 연결을 효과적으로 처리할 수 있다. nginx를 Node.js 서버 앞단에 두는 것이 교과서같은 아키텍쳐로 알려져 있는데 이는 nginx가 Node.js의 작업량을 크게 줄여주기 때문이다. 260225-thumbs 가장 큰 시너지는 Node.js의 단일 스레드 동작으로 인한 병목 현상을 방지하는 데서 나온다. CPU 소모가 큰 HTTPS 암복호화 연산이나 단순 이미지, CSS 등 정적 리소스 전송 작업을 Nginx가 전담하도록 설정하면, Node.js는 API 처리와 같은 핵심 비즈니스 로직 연산에만 전념할 수 있다.

CloudFlare

Cloudflare는 시작은 CDN(콘텐츠 전송 네트워크)으로 했으나, 현재는 전 세계 규모의 네트워크 인프라를 제공하는 글로벌 플랫폼으로 성장했다. 브라우저와 실제 서버 사이의 모든 통신을 중계하는 거대한 리버스 프록시망이라고 볼 수 있으며, 이를 활용하면 까다로운 CORS 에러도 손쉽게 해결할 수 있다.

260225-2

브라우저는 현재 접속 중인 사이트의 Origin과 다른 곳에서 데이터를 가져오지 못하도록 막는 보안 정책을 가지고 있다. 이때 응답 헤더의 Access-Control-Allow-Origin에 내 도메인이 명시되어 있지 않으면 브라우저는 CORS 에러를 발생시킨다. Cloudflare를 사용하면 실제 서버 코드를 단 한 줄도 수정하지 않고도 대시보드 설정을 통해 이 헤더를 강제로 주입할 수 있다. 또한 에지 서버에서 자바스크립트 코드를 직접 실행하여 요청 조건에 따라 CORS 헤더를 동적으로 생성해 응답하는 고급 기능까지 제공한다.

💡여기서 말하는 Origin은 프로토콜, 호스트이름(도메인), 포트의 조합을 말한다. 예를 들어 https://www.my.com:1111/test에서 https는 프로토콜, www.my.com은 호스트이름, 1111은 포트번호이다. 따라서 Origon은 https://www.my.com:1111을 뜻한다.

마치며

프록시는 기술적 위치와 사용 목적에 따라 이름은 다양하게 불리지만, 결국 “중간에서 대리인 역할을 수행한다”는 본질을 공유한다. 설계 단계에서는 프록시 패턴으로 객체 접근을 제어하고, 배포 단계에서는 Nginx로 서버의 성능과 안정성을 높이며, 운영 단계에서는 Cloudflare를 통해 전 세계 사용자에게 안전하고 빠른 서비스를 제공하는 것이 프록시 활용의 핵심이다.

카테고리:

업데이트: