[Proxy] 프록시 (Proxy)란?

DevelopHeo·2025년 1월 3일
post-thumbnail

📙 프록시(Proxy) 란?

프록시 서버

클라이언트가 프록시 서버를 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해주는 시스템이나 프로그램

프록시 서버 : 클라이언트와 서버 사이의 중계 서버

  • 서버와 클라이언트 사이에 중계기로서 대리로 통신하는것이 프록시 서버
  • 프록시 서버의 위치에 따라 Forward Proxy와 Reverse Proxy로 나뉜다.
  • 보안 목적 또는 캐싱 기능 제공

1. 포워드 프록시

  • 서버는 클라이언트의 ip가 아닌 프록시 서버의 ip를 받으므로 클라이언트가 누구인지 알수없다.
  • 클라이언트가 인터넷에 직접 접근이 아닌 포워드 프록시를 거쳐서 인터넷과 연결
  • 프록시 서버는 Cache를 사용하여 자주 사용하는 데이터라면 캐시를 사용해 성능 향상 가능
  • 즉, 서버에서 클라이언트가 누구인지 감춰주는 역할
  • 기업 사내망에서 주로 사용

역할

  1. 캐싱
    • 첫번째 요청 이후 동일한 요청이 온다면, 프록시 서버에 캐싱된 내용을 전달해 성능을 향상
  2. IP 우회
    • 서버측에 클라이언트 정보를 숨길 수 있다.
  3. 제한
    • 보안이 중요한 사내망에서 정해진 사이트만 연결해 웹 사용 환경을 제한할 수 있다.

2. 리버스 프록시

  • 클라이언트 입장 : 실제 서버의 정보는 알 수 없다(리버스 프록시 서버에 요청하기에 서버가 감춰짐)
  • 클라이언트가 인터넷에 데이터를 요청하면 리버스 프록시가 이 요청을 받아 서버와 통신후 클라이언트에 전달
  • 클라이언트는 내부 서버에 대한 정보를 알필요 없이 리버스 프록시에만 요청하면됨
  • 내부 서버(WAS)에 직접 접근하면 DB에 접근이 가능하기때문에 중간에 리버스 프록시를 둔다.
    • 어플리케이션 서버를 감추는 역할을 한다.
  • 내부 서버에대한 설정으로 로드 밸런싱이나 서버 확장등에 유리
  • ex) NginX, Apache Web Server

역할

  1. 로드 밸런싱

    • 리버스 프록시 뒤에 여러 WAS를 두어 사용자의 요청을 분산할수있다.
    • End-Point 마다 호출 서버를 설정할 수 있어 역할에 따라 서버의 트래픽 분산 가능
  2. 보안

    • 보안상의 이유로 서버에 접근을 막기위해 DMZ 같은 네트워크에 리버스 프록시 구성

📙 Spring에서 Proxy

Spring에서 Proxy 개념

프록시는 대리 객체를 의미하며, 원래 객체에 대한 접근을 제어하거나 추가 작업을 수행하기 위해 사용됩니다.
쉽게 말해, 실제 객체에 앞서 동작하는 가짜 객체입니다.

Spring 프레임워크에서 Proxy(프록시)는 AOP(Aspect-Oriented Programming) 기능을 구현하는 데 핵심적인 역할을 합니다.
프록시는 원래 객체(타겟 객체) 앞에서 동작하며, 원래 객체에 대한 접근을 제어하거나 추가적인 기능을 제공합니다.

  • Proxy는 Spring에서 핵심적인 역할을 하며, 개발자가 비즈니스 로직에만 집중할 수 있도록 돕습니다.

Spring에서 Proxy 생성 방식

1. JDK Dynamic Proxy

  • 인터페이스를 기반으로 프록시를 생성.
  • 인터페이스를 구현한 객체만 프록시로 만들 수 있음.

2. CGLIB Proxy

  • 클래스 상속을 기반으로 프록시를 생성.
  • 인터페이스가 없는 클래스도 프록시를 생성할 수 있음.
  • Spring은 기본적으로 JDK Dynamic Proxy를 사용하지만, 클래스 기반의 객체에는 CGLIB를 사용합니다.

Spring에서 Proxy의 동작 과정

1. AOP 적용 시 프록시 동작

  • @Transactional, @Aspect와 같은 어노테이션이 적용되면, Spring은 프록시 객체를 생성합니다.
  • 프록시 객체는 메서드 호출을 가로채고, 원래 메서드 호출 전에 추가 작업을 수행하거나 호출 후 작업을 처리합니다.
// 실제 동작 흐름
1. 클라이언트 -> 프록시 객체 호출
2. 프록시 객체 -> 메서드 호출 가로채기
3. 프록시 객체 -> 추가 로직 실행 (예: 트랜잭션 시작)
4. 프록시 객체 -> 원래 객체(타겟) 메서드 호출
5. 프록시 객체 -> 추가 로직 실행 (예: 트랜잭션 커밋/롤백)
6. 클라이언트 -> 결과 반환

Spring Proxy의 장단점

장점

  1. 관심사의 분리
    • 핵심 로직과 부가 로직(트랜잭션, 로깅 등)을 분리하여 코드의 가독성과 유지보수성을 높입니다.
  2. 동적 생성
    • 런타임에 프록시를 동적으로 생성하여 유연한 기능 확장이 가능합니다.
  3. 다양한 어노테이션 지원
    • @Transactional, @Async, @Cacheable 등 다양한 Spring 기능을 쉽게 구현 가능.

단점

  1. 프록시 오버헤드
    • 프록시 객체 생성 및 메서드 호출 가로채기에 따른 성능 오버헤드가 발생할 수 있습니다.
  2. self-invocation 제한
    • 같은 클래스 내에서 자기 자신의 메서드를 호출하면 프록시가 작동하지 않습니다. (프록시가 호출을 가로채지 않음)

프록시의 활용

  1. 트랜잭션 관리
    • @Transactional을 사용할 때, Spring이 프록시 객체를 생성해 트랜잭션의 시작, 커밋, 롤백을 처리합니다.
  2. 로깅 및 모니터링
    • 메서드 실행 전/후에 로그를 출력하거나 실행 시간을 측정할 때 사용됩니다.
  3. 보안
    • 접근 권한을 확인하거나 인증을 처리하는 데 사용됩니다.

0개의 댓글