Reverse Proxy.. 과연 무엇일까요?

유아 Yooa·2023년 12월 2일
8

CS

목록 보기
3/4
post-thumbnail

Web Server와 관련된 중요 개념 중 하나인 리버스 프록시..

프로젝트를 해보며 nginx를 통해 reverse proxy를 적용한 경험이 있다. 최근 기술 면접에서 reverse proxy에 대한 질문을 받았는데 아무런 대답을 못했다..! (충격__)

내가 적용하고 자신있게 포폴에 적어놓고는 대답을 못한 사실이 좌절스럽고 부끄러운 한편, 오히려 성장의 기회로 삼자고 다짐했다! 그러니 공부해보자!


proxy

reverse proxy를 이야기하기 전에 proxy란 무엇인가?
(대충 넘어가지 말고 프록시에 대해 명확하게 설명할 수 없다면 꼭 보고 넘기자.)

프록시(proxy)는 "대리"의 의미로, 빠른 액세스와 안전한 통신을 확보하기 위한 중계 서버를 "프록시 서버"라고 일컫는다. 클라이언트와 웹 서버 중간에 위치하고 있어, "대리"로 통신을 받아주는 개념이라 생각하면 된다.

네트워크에 연결된 모든 컴퓨터에는 IP가 있다. 마찬가지로 프록시 서버는 자체 IP 주소가 있는 네트워크의 컴퓨터이다. 그러나 때로는 제한된 웹 사이트나 서버에 액세스하여 IP주소를 표시하지 않으려는 경우도 있다. 이런 경우, 프록시 서버를 사용하여 같은 결과를 달성할 수 있다.

프록시 서버는 클라이언트의 수신 요청을 수락하고 이러한 요청을 대상 서버로 전달하는 인터넷상의 컴퓨터이며 최종 사용자와 인터넷 사이의 게이트 역할을 한다. 앞에서 언급했듯 자체 IP 주소가 있으며, 클라이언트 시스템과 웹 서버를 글로벌 네트워크에서 분리한다.

즉, 프록시 서버를 통해 다른 IP 주소를 가진 웹 사이트에 액세스 할 수 있다.

프록시 서버는 클라이언트의 요청을 수락하고 다음 조건에 따라 응답을 생산한다.
1. 요청된 데이터 또는 페이지가 로컬 캐시에 이미 있는 경우 프록시 서버 자체가 필요한 검색을 클라이언트에 제공한다.
2. 요청한 데이터 또는 페이지가 로컬 캐시에 없는 경우 프록시 서버는 해당 요청을 대상 서버로 전달한다.
3. 프록시 서버는 클라이언트에 응답을 전송하고 또한 클라이언트에 캐시된다.

따라서 프록시 서버는 서버뿐 아니라 클라이언트 역할도 한다고 할 수 있다.

프록시는 크게 forward proxy와 reverse proxy로 나누어지는데, 기본적으로 forward proxy는 클라이언트 쪽, reverse proxy는 서버 쪽의 설정을 한다고.

Forward Proxy

일반적으로 프록시라고 하면 포워드 프록시를 뜻한다. 클라이언트 대신 프록시 서버가 목적 서버에 통신해주는 구성을 말한다.

좀더 쉽게 이해하면 회사 내부 인트라넷에서 인터넷상에 있는 서버에 요청할 때 먼저 프록시 서버를 호출하는 방식.

만약 proxy server가 없다면 아래처럼 클라이언트가 직접적으로 액세스할 수 있다.

반면 포워드 프록시를 사용하면 서버에게 클라이언트가 누구인지 감출 수 있다. 서버가 응답받은 IP는 포워드 프록시 서버의 IP이기 때문에 클라이언트가 누군지 알 수 없다.

우리가 http://racoon.com을 요청하면 포워드 프록시 서버가 리소스를 대신 받아와 클라이언트에게 내밀어준다(forward)고 생각하면 된다고👀.

인터넷보다 프록시 서버를 먼저 호출하게 되면 포워드 프록시인 것이다.

이점

  • 클라이언트 보안 측면에서 이점이 있다.
    • 포워드 프록시는 보통 정부, 기업 같은 기관에서 제한적인 인터넷 사용을 위한 방화벽 사용과 같은 개념으로 제한을 위해 사용된다고 보면 된다.
    • 방문하려는 웹에 직접적인 방문을 방지할 수 있다.
    • 룰을 추가하면 사용자 전원의 외부 웹사이트로의 액세스를 필터링할 수도 있다. 무조건 프록시 서버를 경유하기 때문!
  • 프록시 서버는 페이지 서버의 정보를 캐싱해둔다.
    • 다른 클라이언트가 해당 페이지를 요청할 때, 캐싱된 정보를 그대로 반환할 수 있다.
    • 서버의 부하를 줄이는 효과가 있다.
  • 클라이언트의 요청은 포워드 프록시 서버를 통과할 때 암호화된다.
    • 암호화된 요청은 다른 서버를 통과할 때 필요한 최소한의 정보만 갖게 되는데, 이는 클라이언트의 UP를 감춰주는 보안효과를 낸다.
    • 따라서 본 서버에서 IP 주소를 역추적해도 포워드 프록시 서버의 IP 주소만 보여 정체를 파악하기 어렵다.

Reverse Proxy

포워드 프록시와 달리 Web Server 쪽에 위치하여 클라이언트의 접근을 최초로 받아 리퀘스트에 해당하는 Web Server에 배분해주는 역할을 한다.

클라이언트는 웹 서비스에 접근할 때 프록시로 요청하게 되고, 프록시가 배후(reverse)의 서버로부터 데이터를 가져오는 방식이다.

리버스 프록시는 서버가 누구인지를 감추는 역할을 한다. 클라이언트는 리버스 프록시 서버를 먼저 호출하게 되기에 실제 서버의 IP를 알 수 없다.

내부 서버가 직접 서비스를 제공해도 되지만 이렇게 구성하는 이유는 보안 때문이다.
보통 기업의 네트워크 환경에서는 DMZ라고 부르는 내부 네트워크/외부 네트워크 사이에 위치하는 구간이 존재한다. 이 구간에는 보통 메일 서버, 웹 서버, FTP 서버 등 외부 서비를 제공하는 서버가 위치하게 된다.

WAS를 DMZ에 놓고 서비스해도 되지만 WAS는 DB와 연결되어 있으므로, WAS가 해킹당할 경우 DB까지 해킹당할 수 있는 문제를 초래할 수 있다. 따라서 리버스 프록시 서버를 DMZ에 두고 실제 서비스 서비는 내부망에 위치시킨 후 서비스하는 것이 일반적이다.

흔히 서버 아키텍처로 구성하는 web server(nginx) - WAS(tomcat) 분리 형태를 reverse proxy라고 보면 된다👀.

이점

  • 로드밸런스와 병용하면 서버 부담을 분산할 수 있다.
    • 설정으로 정적 콘텐츠와 동적 콘텐츠의 보는 곳을 나누어 메모리 사용량을 효율화 할 수 있다.
    • 클라이언트 입장에서 프록시 서버는 web server와 같은 동작을 하므로 web server가 여러 개 존재하는 것을 은폐할 수 있다.
    • 엔드 포인트마다 호출하는 서버를 설정하여 역할에 따라 서버의 트래픽을 분산할 수 있다.
  • 이는 확장성과도 관련이 있다.
    • 서버를 동적으로 추가하거나 제거할 수 있으므로 웹 어플리케이션을 쉽게 확장할 수 있다.
    • 트래픽 급증을 대응하거나 다운타임 없이 용량을 일릴 수 있다.
  • 서버 보안 측면에서도 이점이 있다.
    • 리버스 프록시 서버를 두면 본 서버의 IP 주소를 감출 수 있는데 이는 DDoS 공격과 같은 해킹 방어에 유용하다.
    • 요청을 필터링하고 의심스러운 트래픽을 차단하여 악의적인 트래픽으로부터 백엔드 서버를 보호하는데 도움이 될 수 있다.
  • 포워드 프록시와 유사하게 캐싱 기능을 갖고 있다.
    • 자주 액세스하는 콘텐츠를 캐시하고 클라이언트에 직접 제공하여 백엔드 서버의 로드를 줄이고 응답 시간을 향상시킬 수 있다.
  • SSL 암호화에도 좋다.
    • 본래 서버가 클라이언트가 통실할 때 SSL(or TSL)로 암호화, 복호화를 하는데 이는 비용이 많이 든다.
    • 리버스 프록시 서버를 두면 들어오는 요청을 모두 복호화하고 나가는 응답을 암호화해주어 클라이언트와 안전한 통신을 할 수 있게 하고 서버 부담도 줄여준다.

Forward? Reverse? 정리하자면..

  • Forward Proxy 서버는 클라이언트 앞에 놓여져 있는 반면, Reverse Proxy 서버는 웹서버/WAS 앞에 놓여 있다.
  • Forward Proxy는 직접 서버 URL로 요청을 보내고 내부망에서 포워드 프록시 서버를 호출하여 프록시가 요청을 보내게 되어 서버에게 클라이언트를 감출 수 있다. 반면에 Reverse Proxy는 프록시 서버 URL로만 접근이 가능하여 본 서버의 IP 정보를 숨길 수 있다.

서버가 ssl 인증서를 직접 관리하지 않아도 되고, 보안과 확장성 측면에서 큰 이점이 있는 reverse proxy.. 이제 무엇인지 알고 쓸 수 있다!


참고

profile
기록이 주는 즐거움