프록시(Proxy)
소프트웨어 마에스트로 14기 팀 프로젝트에서 나는 백엔드 파트를 담당하여 Spring Boot를 통한 API 서버 개발을 하게 되었다. 백엔드 아키텍처를 설계하던 중 ‘리버스 프록시’라는 단어를 팀원을 통해 접하게 되었고, 이에 대해 상세하게 공부하여 팀원들에게 공유해주고자 게시글을 작성하게 되었다.
프록시(Proxy)
정의
프록시(Proxy)란 인터넷에서 정보를 주고받을 때 중개자 역할을 하는 컴퓨터나 애플리케이션을 의미한다. 이 중개자는 클라이언트와 서버 간의 통신을 대리하며, 클라이언트의 요청을 받아 서버에 전달하고, 서버의 응답을 받아 클라이언트에게 전달한다.
종류
프록시 서버는 네트워크 상 어디에 위치하느냐, 혹은 어느 방향으로 데이터를 제공하느냐에 따라 포워드 프록시(Forward Proxy), 리버스 프록시(Reverse Proxy)로 분류된다. 자세한 내용은 아래에서 살펴보자
포워드 프록시(Forward Proxy)
같은 내부망에 존재하는 클라이언트의 요청을 받아 인터넷을 통해 외부 서버에서 데이터를 가져와 클라이언트에게 응답해준다. 즉, 클라이언트가 서버에 접근하고자 할때, 클라이언트는 타겟 서버의 주소를 포워드 프록시에 전달하여, 포워드 프록시가 인터넷으로 요청된 내용을 가져오는 방식이다. 예를 들어 우리가 naver.com
을 요청하면 포워드 프록시 서버가 naver.com 리소스를 대신 받아와 클라이언트에게 내밀어준다(forward)고 생각하면 된다.
참고로 우리가 흔히 말하는 프록시 서버
는 일반적으로 바로 포워드 포록시 서버를 의미한다.
목적
프록시의 주요 목적 중 하나는 클라이언트의 신원을 숨기는 것이다. 클라이언트는 직접 서버와 통신하지 않고 프록시를 거쳐서 통신하므로, 실제 클라이언트의 IP 주소나 기타 식별 정보를 서버에 노출시키지 않을 수 있다. 이를 통해 익명성을 유지하거나, 접근 제어를 위한 보안적인 목적으로 사용될 수 있다.
또한 프록시는 캐시 기능을 제공하여 리소스의 효율적인 활용을 도와줄 수 있다. 프록시 서버는 이전에 요청된 리소스의 사본을 저장해두고, 동일한 요청이 들어올 경우 캐시된 리소스를 제공함으로써 네트워크 대역폭을 절약하고 응답 시간을 단축시킬 수 있다.
보안을 강화하는 목적으로도 사용할 수 있다. 프록시는 네트워크 트래픽을 모니터링하고, 악성 코드나 해킹 시도 등을 탐지하여 차단할 수 있다. 또한, 내부 네트워크에서 외부로의 통신을 제한하거나, 특정 사이트 혹은 애플리케이션에 대한 접근을 제어하는 데 사용될 수도 있다.
한 문장으로 요약하면, 프록시는 클라이언트와 서버 간의 통신을 중개하는 역할을 수행하며, 익명성, 캐싱, 보안 등 다양한 목적으로 활용할 수 있다.
리버스 프록시(Reverse Proxy)
웹서버/WAS 앞에 놓여 있는 프록시 서버를 의미한다. 클라이언트는 웹서비스에 접근할때 웹서버에 요청하는 것이 아닌, 프록시로 요청하게 되고, 프록시가 배후(reverse)의 서버로부터 데이터를 가져오는 방식이다. 클라이언트쪽으로 데이터(response)를 밀어주는게 포워드라면, 그 반대편인 서버 쪽으로 데이터(request)를 밀어주는 것이 리버스 프록시 라고 보면 된다.
내부 서버거 직접 서비스를 제공해도 되지만 이렇게 구성하는 이유는 보안 때문이 가장 크다. 보통 기업의 네트워크환경에서는 DMZ라고 부르는 내부네트워크/외부네트워크 사이에 위치하는 구간(내부네트워크/외부네트워크에 둘다 접근할 수 있는 공간)이 존재한다. 이 구간에는 보통 메일 서버, 웹 서버, FTP 서버 등 외부 서비스를 제공하는 서버가 위치하게 된다.
WAS를 DMZ에 놓고 서비스해도 되지만 WAS는 DB서버와 연결되어 있으므로, WAS가 해킹당할 경우 DB서버까지 해킹당할 수 있는 문제가 발생할 수 있기 때문에 보안 상 문제가 있으므로 이렇게 하지는 않는다. 따라서 리버스 프록시 서버를 DMZ에 두고 실제 서비스 서버는 내부망에 위치시킨 후 서비스 하는 것이 일반적이다.
우리가 구성하는 일반적인 WEB(Apache, nginx) - WAS(Tomcat) 분리 형태를 Reverse 프록시라고 보면 된다.
여기서 WEB(Apache, nginx)가 reverse proxy가 된다.
물론 아파치 톰캣 같이 물리적인 한서버에 web, was가 존재한다면 reverse proxy라고 볼 수 없다.
목적
유명한 웹 사이트는 하루에도 수백만명이 방문하고, 그러한 대량의 트래픽을 하나의 서버로만 감당해 내기란 어렵다. 하지만 리버스 프록시 서버를 여러개의 본 서버들 앞에 두면 특정 서버가 과부화 되지 않게 로드밸런싱을 할 수 있다. 또한, 리버스 프록시를 사용하면 본래 서버의 IP 주소를 노출시키지 않을 수 있다. 따라서 해커들의 DDoS 공격과 같은 공격을 막는데 도움이 될 수 있다. 우선 클라이언트는 인터넷을 통해 리버스 프록시 서버 url에게 요청을 한다. 그리고 리버스 프록시는 본서버에게 요청을 경유해서 보내게 된다. 이렇게 되면 클라이언트는 본 서버의 url을 모른채 리버스 프록시 url을 통해 서비스를 이용하게 되고, 이는 즉 본 서버의 정보를 숨기는 효과가 된다. 그리고 한국에 있는 유저는 한국에 있는 리버스 프록시 서버와 통신해서 리버스 프록시 서버에 캐싱되어 있는 데이터를 사용할 경우에는 더 빠른 성능을 보여줄수 있다. 본래 서버가 클라이언트들과 통신을 할때 SSL(or TSL)로 암호화, 복호화를 할 경우 비용이 많이 들게 된다. 그러나 리버스 프록시를 사용하면 들어오는 요청을 모두 복호화하고 나가는 응답을 암호화해주므로 클라이언트와 안전한 통신을 할수 있으며 본래 서버의 부담을 줄여줄 수 있다.
포워드 프록시와 리버스 프록시의 차이
서버 위치
- 포워드 프록시 서버 : 클라이언트 앞에 놓여져 있음
- 리버스 프록시 서버 : 웹서버/WAS 앞에 놓여 있음
서버 통신 대상
- 포워드 프록시 서버 : 내부망에서 클라이언트와 Proxy 서버가 통신하여 인터넷을 통해 외부에서 데이터를 가져옴
- 리버스 프록시 서버 : 내부망에서 Proxy 서버와 내부망서버가 통신하여 인터넷을 통해 요청이 들어오면 Proxy 서버가 받아 응답함
감춰지는 대상
- 포워드 프록시 서버 : 내부망에서 클라이언트와 프록시 서버가 통신하여 인터넷을 통해 외부에서 데이터를 가져옴
- 리버스 프록시 서버 : 내부망에서 프록시 서버와 내부망서버가 통신하여 인터넷을 통해 요청이 들어오면 Proxy 서버가 받아 응답함