[네트워크] 프록시 서버와 리버스 프록시 서버
프록시 서버와 리버스 프록시 서버
프록시(proxy) 서버란 클라이언트와 서버 사이에 위치하여 클라이언트 대신 요청을 서버에게 전달하는 게이트웨이 역할을 하는 서버이다. 프록시 서버를 포워드 프록시(forward proxy) 서버라고도 한다. 프록시 서버는 클라이언트 앞에 구성한다. 클라이언트는 프록시 서버를 통해 서버에 직접 접근하지 않고 간접적으로 접근할 수 있다. 클라이언트는 서버의 존재를 알지만 직접 접근하지 않으며 대신 프록시 서버에 접근함으로써 클라이언트의 요청을 프록시 서버가 대신 처리한다. 서버는 클라이언트로부터 요청을 직접 받는 대신 프록시 서버를 통해 받으므로 클라이언트에 대해 알지 못한다.
sequenceDiagram
box gray
participant 클라이언트
participant 프록시
end
클라이언트->>프록시: 서버 대신 프록시에게 요청
프록시->>서버: 클라이언트의 요청을 받아 서버로 전달
프록시 서버의 사용 예는 다음과 같다.
- 클라이언트의 특정 사이트 접근 제한을 우회
- 클라이언트에게 익명성을 제공
리버스 프록시(reverse proxy) 서버란 클라이언트와 서버 사이에 위치하여 서버 대신 클라이언트의 요청을 처리하는 게이트웨이 역할을 하는 서버이다. 리버스 프록시 서버는 서버 앞에 구성한다. 서버는 리버스 프록시 서버를 통해 클라이언트가 서버에 직접 접근할 수 없도록 하고 간접적으로 접근하도록 한다. 서버가 클라이언트의 요청을 직접 처리하지 않고 리버스 프록시가 대신 처리한다. 클라이언트는 리버스 프록시에 직접 접근하므로 서버의 존재를 알지 못한다.
sequenceDiagram
클라이언트->>리버스 프록시: 서버 대신 리버스 프록시에게 요청
리버스 프록시->>서버: 클라이언트의 요청을 받아 서버로 전달
box gray
participant 리버스 프록시
participant 서버
end
프록시 서버의 사용 예는 다음과 같다.
- 로드 밸런싱
- 공격 보호
- GSLB
- 캐싱
- SSL 암호화
- CDN
클라이언트가 서버에 직접 요청하고 싶지 않을 경우 프록시 서버를 사용한다. 클라이언트는 프록시 서버에 접근하고 프록시 서버가 서버에 접근한다. 서버가 클라이언트의 요청을 직접 받고 싶지 않을 경우 리버스 프록시를 사용한다. 리버스 프록시가 클라이언트의 요청을 받고 서버는 리버스 프록시로부터 요청을 받는다.
로드 밸런서
로드 밸런서(load balancer)(또는 부하 분산기)란 서비스의 안전성을 위해 서버에 유입되는 트래픽을 여러 대의 서버로 분산시키는 부하 분산 역할을 수행하는 네트워크 장비이다. 로드 밸런서는 4계층 뿐만 아니라 7계층에서도 동작 가능하다. 7계층 로드 밸런서를 ADC(Application Delivery Controller)라고 한다. ADC는 4계층의 L4 스위치와 달리 애플리케이션 프로토콜의 헤더와 내용을 이해하고 동작한다. 대부분의 ADC는 L4 스위치의 기능을 포함한다.
단일 장애 지점(SOF) 발생을 막기 위해 스케일 아웃(scale out)으로 확장된 서버들(서버 그룹, 서버팜)이 클라이언트의 외부 요청을 어떻게 받을 것인지 관리하기 위해 로드 밸런싱(부하 분산, 트래픽 분산) 개념이 필요하다.
웹 서버가 클라이언트의 외부 요청을 직접 받지 않고 로드 밸런싱을 담당하는 리버스 프록시가 받게 함으로써 다음과 같은 기능을 제공한다.
- 서버의 과부하 방지
- 성능 최적화를 위해 이미지 및 정적 컨텐츠 캐싱
- 보안 프로토콜(HTTPS) 사용 시 웹 서버의 SSL 암복호화 부하를 줄이기 위해 SSL 엔드포인트로 동작 (SSL 오프로딩)
- 서버의 헬스 및 중단 여부를 체크하여 일부 서버에 장애가 발생한 경우 해당 서버에 대한 클라이언트의 요청을 정상적인 서버로 전환
- 동일 세션에서 유효 기간 동안 클라이언트의 요청으로 인한 작업(트랜잭션)이 동일한 서버에서 처리될 수 있도록 세션 영속성 제공
- 클라이언트의 단일 요청은 실제로는 클라이언트와 서버 간 다수의 요청과 응답 전송이 필요한 일련의 작업들이며 하나의 트랜잭션으로 처리되어야 하는 경우가 있다
- 사용자 경험 향상을 위해 서버에 사용자에 대한 정보 저장이 필요하지만 이 경우 동일한 서버로 모든 요청을 보내지 않으면(동일한 사용자의 요청이 여러 서버로 분산되면) 문제가 발생하므로 세션 상태 정보(컨텍스트 정보)를 저장해야 한다.
Comments