[Network] 포워드 프록시와 리버스 프록시
프록시(Proxy) 란?
프록시는 클라이언트와 서버 사이에 위치한 중계 서버로, 통신을 대신 수행하는 대리자 역할을 한다. 프록시가 없다면 클라이언트는 서버와 직접 통신한다. 반면, 클라이언트와 서버 사이에 프록시 서버가 있다면, 클라이언트와 서버는 프록시를 한번 거쳐 통신하게 된다.
왜 프록시를 사용할까?
프록시를 사용하면 보안을 강화할 수 있고, 통신 성능을 높여주며, 통신 비용을 절약할 수 있다. 프록시는 프록시 서버의 위치에 따라 유형이 나뉜다. 유형에 따라 각각의 용도도 조금씩 다른데, 이 글에서는 프록시의 유형을 크게 포워드 프록시(Forward Proxy)와 리버스 프록시(Reverse Proxy) 2가지로 나누어 설명하려고 한다.
포워드 프록시 (Forward Proxy)
포워드 프록시는 클라이언트와 인터넷 사이에 위치한다. 이로 인해 클라이언트의 정보가 서버측에 노출되지 않는다.
캐싱
프록시를 사용하면 자주 사용되는 HTML, JS, CSS, 이미지와 같은 정적 파일들을 원 서버로부터 캐싱하고, 클라이언트가 요청할 때 원 서버로 요청을 대신 가지고 있는 캐시로 응답할 수 있다.
캐싱된 데이터에 대한 요청이 발생하면, 원 서버에 대한 부하가 감소하고, 네트워크 병목 현상도 감소한다. 또한, 클라이언트 입장에서 원 서버에 비해 프록시 서버가 물리적으로 더 가까운 위치에 있다면 전송 시간도 절약될 것이다.
특정 컨텐츠 액세스 제한
학교 혹은 사내의 내부망에 프록시 서버를 두어 특정 컨텐츠에 대한 액세스를 제한할 수 있다. 학교에서는 학생들에게 유해한 웹사이트를 프록시 서버를 통해 차단할 수 있다. 클라이언트의 모든 요청은 프록시를 거쳐 인터넷으로 연결되기 때문이다. 또한, 사내망에서도 보안을 위해서 특정 웹사이트에 대한 접속을 차단할 수 있다.
익명성 확보
모든 요청이 프록시 서버를 통해 발생하므로 클라이언트는 인터넷에서 자신을 숨길 수 있다. 클라이언트의 진짜 IP 주소가 노출되는 것을 원치 않을 경우 프록시 서버를 경유할 수 있다.
리버스 프록시 (Reverse Proxy)
리버스 프록시는 서버와 인터넷 사이에 위치한 프록시 서버이다. 클라이언트의 요청을 서버 대신 받게된다. 이런 구조에서는 클라이언트는 프록시 뒤의 서버의 존재를 모르게 되며, 웹 서버에 요청하듯이 프록시 서버에 요청하게 될 것이다.
로드밸런싱
인기 있는 서비스는 하루에 수백만, 수천만의 트래픽이 발생할 것이다. 이를 하나의 서버로 처리하는 것은 무리가 있을 것이다. 따라서 수평 확장(scale out)을 하여 다중 서버 환경을 구축하게 될 것이다. 이 때, 프록시는 여러 서버에 각각 부하를 분산하여 한 서버에 집중적으로 부하가 몰리는 상황을 방지하는 역할을 할 수 있다. 혹은 서버에 장애가 발생했을 때 해당 서버로 요청을 보내지 않도록 설정할 수 있다.
무중단 배포
리버스 프록시를 사용하여 서비스를 새로 배포할 때 중단 없이 배포할 수 있다. 한 서버가 배포중일 때에는 프록시가 그 서버로 요청을 전달하지 않는다. 그러면 사용자는 서비스 이용 중단 없이 그대로 서비스를 이용할 수 있고, 자연스럽게 새로운 배포 버전을 사용할 수 있게 된다.
DDos 등의 공격으로부터 보호
앞서 말했듯 서버 앞단에 프록시를 두게 되면 서버는 인터넷으로부터 숨겨진다. 외부에서는 서버의 IP를 알 수 없을 것이다. 이렇게 되면 공격자는 실제 버서를 공격 대상으로 두기 어려울 것이다. 즉, 공격자는 리버스 프록시 서버만 공격 대상으로 설정할 수 있다. 이로 인해 실제 서버를 여러 공격으로부터 보호할 수 있다.
클라우드 플레어와 같은 서비스가 이런 원리로 우리의 서버를 DDos 공격으로부터 보호할 수 있는 것이다.
캐싱
포워드 프록시와 동일하게 리버스 프록시도 캐싱 기능을 수행할 수 있다.
차이점
1. End Point
Forward Proxy 는 클라이언트가 요청하는 End Point 가 실제 서버 도메인이고 프록시는 둘 사이의 통신을 담당해준다.
Reverse Proxy 는 클라이언트가 요청하는 End Point 가 프록시 서버의 도메인이고 실제 서버의 정보는 알 수 없다.
2. 감춰지는 대상
Forward Proxy 는 클라이언트가 감춰진다.
요청 받는 서버는 포워드 프록시 서버를 통해서 요청을 받기 때문에 클라이언트의 정보를 알 수 없다.
Reverse Proxy 는 반대로 서버가 감춰진다.
클라이언트는 리버스 프록시 서버에게 요청하기 때문에 실제 서버의 정보를 알 수가 없다.
참고
https://bcp0109.tistory.com/194
https://hudi.blog/forward-proxy-reverse-proxy/
https://www.cloudflare.com/ko-kr/learning/cdn/glossary/reverse-proxy/