프록시 패턴이란?

김세빈·2025년 5월 3일

디자인패턴

목록 보기
6/7

프록시 패턴(Proxy Pattern)이란?

프록시(Proxy) 패턴은 어떤 객체에 접근하기 전 그 흐름을 가로채어 접근을 제어하거나, 필터링하거나, 수정하는 역할을 하는 디자인 패턴입니다.
쉽게 말하면, 인터페이스와 실제 객체 사이에 중간 계층을 둠으로써, 직접 접근을 막고 필요한 작업을 대신 수행하도록 하는 방식입니다.


프록시 패턴의 구조

프록시 패턴은 다음과 같은 구성 요소를 가집니다:

  • RealSubject (실제 객체): 클라이언트가 궁극적으로 사용하려는 대상 객체입니다.
  • Proxy (프록시 객체): RealSubject와 동일한 인터페이스를 구현하며, 클라이언트의 요청을 가로채어 전처리 또는 후처리를 수행합니다.
  • Client (클라이언트): Proxy를 통해 RealSubject에 접근합니다.

예시 코드

프록시 패턴은 보안, 로깅, 캐싱, 접근 제한 등 다양한 목적으로 활용됩니다.
대표적인 사례로는 Cloudflare와 같은 CDN이 있습니다. 사용자의 요청이 실제 서버에 도달하기 전에 Cloudflare가 중간에서 요청을 프록시하여 공격적이거나 비정상적인 트래픽을 차단합니다.

다음은 JavaScript로 구현한 간단한 API 요청 필터링용 프록시 객체입니다.


예제 코드

function createRequestProxy(apiHandler, logger) {
  return new Proxy(apiHandler, {
    apply(target, thisArg, args) {
      const [endpoint, data] = args;

      // 간단한 디도스 필터링 시뮬레이션
      if (data && data.ip === '123.123.123.123') {
        logger(`[경고] 차단된 IP(${data.ip})의 요청이 차단되었습니다.`);
        return;
      }

      logger(`[요청] ${endpoint} 엔드포인트에 접근 시도`);
      return target.apply(thisArg, args);
    }
  });
}

// 실제 API 요청을 수행하는 함수
function sendRequest(endpoint, data) {
  console.log(`${endpoint}에 데이터 전송 중...`, data);
}

const logger = console.log;
const protectedRequest = createRequestProxy(sendRequest, logger);

// 테스트
protectedRequest("/api/login", { username: "user1", ip: "111.222.333.444" });
protectedRequest("/api/login", { username: "attacker", ip: "123.123.123.123" });

실행 결과

[요청] /api/login 엔드포인트에 접근 시도
/api/login에 데이터 전송 중... { username: 'user1', ip: '111.222.333.444' }
[경고] 차단된 IP(123.123.123.123)의 요청이 차단되었습니다.

프록시 패턴은 객체에 직접 접근하지 않고 중간 단계를 통해 필요한 로직을 삽입할 수 있다는 점에서 유용합니다.
특히 다음과 같은 상황에서 자주 사용됩니다:

  • 보안 처리 (접근 제어, 인증, 권한 검사)
  • 네트워크 필터링 (예: 디도스 방어, IP 차단)
  • 로깅 및 모니터링
  • 지연 초기화 (Lazy Loading)
  • 캐싱 프록시

0개의 댓글