[Design Pattern] Proxy Pattern and Proxy Server

먹보·2023년 2월 20일
0

MUK_BO's Design Pattern

목록 보기
5/9

✍ Proxy Pattern?

📝 정의

프록시 패턴이란 캐싱, 로깅, 또는 보안성 인증과 같이 원 객체의 코드를 바꾸지 않은 채로 원 객체의 접근을 제어하는 객체 또는 레이어가 추가되어 있는 패턴을 의미한다.

📝 구성 요소

프록시 패턴은 크게 3가지의 구성 요소를 가지고 있다.

  1. 대상 객체 (Subject) - 프록시가 담당하고 있는 주 객체

  2. 프록시 객체 - 주 객체 담당

  3. 클라이언트 - 프록시 객체에 접근하는 객체

=> 3 객체의 연결과정은 다음과 같다.

프록시 객체는 클라이언트에서 직접적으로 보내주는 요청을 받아들임으로써 추가 기능을 적용시켜 판단을 내리고 판단 여부에 따라 그 요청을 자신이 처리할 것인지 아니면 주 객체로 넘길 것인지 결정한다.

📝 특징

  1. 프록시 객체는 단일 객체 혹은 주 객체의 종속된 객체로써 작동 할 수 있다.

  2. 클라이언트는 주 객체가 아닌 프록시 객체와 직접적으로 교류 한다.

  3. 프록시는 클라이언트에서 받은 요청을 검증 후 필요에 따라 편집을 한 뒤에 주 객체로 전송한다.

  4. 캐싱 그리고 로깅과 같은 추가 기능을 주 객체에 더 할 수 있다.

📝 프록시 패턴을 응용한 로직

class File {
  constructor(name) {
    this.name = name;
  }

  display() {
    console.log(`Displaying file: ${this.name}`);
  }

  process() {
    console.log(`Processing file: ${this.name}`);
  }
}

class FileProxy {
  constructor(name) {
    this.name = name;
  }

  display() {
    console.log(`Displaying file: ${this.name}`);
  }

  process() {
    if (!this.file) {
      console.log(`Loading file: ${this.name}`);
      this.file = new File(this.name);
    }

    console.log(`Processing file: ${this.name}`);
    this.file.process();
  }
}

const client = (file) => {
  file.display();
  file.process();
  file.process();
};

const file = new FileProxy('large_file.mp4');
client(file);

로직을 간단하게 설명하자면 본래라면, File이란 클래스를 통해 파일 객체를 직접적으로 생성할 수 있겠지만 그 사이에 FileProxy라는 클래스를 생성하여 File 클래스를 그 안에 이어주고 클라이언트에서는 요청을 FileProxy를 통해 설정하게 하게끔 유도해준다.

보면 client라는 함수가 File에 요청을 한 것이 아닌 FileProxy에 요청한 것을 알 수 있다.

✍ Proxy Server

📝 정의

프록시 서버는 백서버와 클라이언트 사이에서 클라이언트가 자신을 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 컴퓨터 시스템이나 응용 프로그램을 뜻한다.

📝 프록시 서버의 역할

  1. Caching - 캐싱

  2. Filtering - 특정 웹사이트 혹은 컨텐츠 접근 제어

  3. 보안성 강화 - 방화벽의 역할

  4. 익명성 - 사용자의 디바이스 IP 주소 및 위치 정보를 숨길 수 있다.

프록시 서버에 대한 툴은 다양하게 존재하는데, 가장 인기있는 툴로는 Nginx, Apache 그리고 Squid가 있다.

현재까지 이것 저것 써본 적은 없어서 무엇이 어떻게 좋다라는 명확한 장점을 알려드리기가 어려워 알고만 넘어가겠다.

프록시 서버를 다루다 보면 버퍼 오버플로우, DDOS 공격과 같은 보안성 문제 그리고 CORS에 대해서 다뤄야 하지만 마냥 이 게시글에서만 다루기에는 너무 헤비한 주제들이라 프록시 서버가 어떤 역할을 하는지 까지만 다뤄보고 다른 주제들은 직접 다뤄보면서 게시글을 추가해야 할 것 같다.

profile
🍖먹은 만큼 성장하는 개발자👩‍💻

0개의 댓글