우선 Proxy Server(프록시 서버)란 클라이언트가 자신을 통해 타 네트워크 서비스에 간접적으로 접속하도록 해주는 서버이다. 서버와 클라이언트를 이어주는 역할을 수행하는 중계 서버로 볼 수 있다. 이 프록시 서버를 통해 보안성과 성능 및 안정성 향상 효과를 기대할 수 있다. 프록시 서버는 Forward Proxy Server와 Reverse Proxy Server로 나눌 수 있다.
Forward Proxy Server
우리가 일반적으로 지칭하는 프록시 서버는 Forward Proxy Server를 의미한다. 포워드 프록시 서버는 클라이언트 앞에 연결된 부분이다. 아래 그림과 같이 사용자(You)에 해당하는 클라이언트가 인터넷 웹서버에 요청을 보내면 그 중간에 포워드 프록시 서버가 먼저 요청을 수신한 뒤 프록시 서버가 다시 웹 서버에 해당 요청을 전달하는 구조이다. 그리고 다시 프록시 서버는 인터넷으로부터 응답을 받고 사용자(클라이언트)에게 해당 내용을 전달한다.
왜 굳이 한단계 거쳐 서비스를 수행하는지는 위에서 설명했듯 보안과 성능과 연결 안정성과 같은 이점이 있기 때문이다.
예를 들어 학창시절 컴퓨터 실습 시간에 학생들이 다른 행동을 못하게 막기 위한 방화벽에 의해 특정 주소 요청 후 튕겨져 나온 경험이 있을 것이다. 이때 포워드 프록시 서버를 이용해 접근 제한을 수행할 수 있다.
또한 포워드 프록시 서버를 통해 유저의 정체를 숨길 수 있다. 즉, 익명성을 위해 사용될 수 있다는 말이다. 포워드 프록시 서버를 사용하면 IP 추적을 시도해도 프록시 서버만 보이기 때문에 IP 주소를 역추적해도 사용자의 정체를 파악하기 어렵다.
Reverse Proxy Server
Reverse Proxy Server는 외부에서 내부 서버가 제공하는 서비스에 접근할 경우 프록시 서버를 통해서 들어오는 방식이다. 접근하는 사용자는 실제로 어디에 접근하는지가에 상관없이 운영자가 제공해준 방법에 따라서 서비스를 제공할 수 있어 보안이 뛰어나고 로드 밸런싱을 통해 효율적인 부하분산을 수행할 수 있다.
위 그림에서 리버스 프록시 서버는 웹서버 앞에 연결된 부분이다. 웹 서버는 요청을 받아 평소처럼 처리하지만 응답은 클라이언트로 보내지 않고 Reverse Proxy로 반환한다. 요청을 받은 Reverse Proxy는 그 응답을 클라이언트로 반환한다. 즉, Forward Proxy 서버는 LAN to WAN의 요청을 대리로 수행하지만 Reverse Proxy는 WAN to LAN의 요청을 중계한다. 클라이언트로부터의 요청이 웹서버로 전달되는 도중의 처리에 끼어들어서 다양한 전후처리를 시행할 수가 있게 된다.
위에서 언급한 리버스 프록시 서버 사용 시 얻게 되는 이점을 정리하면 아래와 같다.
- 로드 밸런싱(load balancing)
- 보안
- 캐시 데이터를 저장
- SSL 암호화
리버스 프록시를 사용하면 본래 서버의 IP 주소가 노출되지 않아 DDoS 공격과 같은 공격을 막는데 유용하다. 다만 CDN과 같은 리버스 프록시 서버가 공격의 타겟이 될수는 있다.
또한 캐시 데이터를 리버스 프록시 서버에 저장하여 성능 향상을 기대할 수 있다. 예를 들어 어떤 한국에 있는 유저가 미국에 웹서버를 두고 있는 사이트에 접속할 때, 리버스 프록시 서버가 한국에 있다면 한국에 있는 유저는 한국에 있는 리버스 프록시 서버와 통신하게되어 더 빠른 연결을 지원할 수 있다.
또한 SSL 암호화에도 유리한데, 서버가 클라이언트들과 통신을 할때 SSL(or TSL)로 암호화, 복호화를 할 경우 비용이 많이 든다. 그러나 리버스 프록시를 사용하면 들어오는 요청을 모두 복호화하고 나가는 응답을 암호화해주므로 클라이언트와 안전한 통신을 할수 있으며 본래 서버의 부담을 줄여줄 수 있다.
대표적으로 Nginx가 이 프록시 서버를 운영할 수 있도록 도와준다. Flask나 Express.js 등 자체적으로 serving을 지원하는 프레임워크를 사용 시 따로 웹 서버 없이 포트를 개방하고 접근이 가능하다. 하지만 SPA 프론트엔드 코드를 분리해서 운영하거나, 3rd party 서비스를 따로 운영하는 등 코드 내에서 라우팅 하기 힘든 상황이 많이 발생한다. 이때 각각의 서비스 운영에만 집중하도록 하고, serving에 관한 문제는 Nginx에서 다루도록 하면 보다 편하고 우수한 성능으로 원하는 기능들을 수행할 수 있다.
참고 자료
https://brainbackdoor.tistory.com/113
https://icerabbit.tistory.com/116