Proxy란?
- 이번 프로젝트를 진행하며 어려움을 겪던 도중, 프록시 라는 단어를 자주 접하게 되었다. 사실 수업에서도 들어본 적 없고, 지나가다 한번씩 눈으로만 봤던 단어라 생소했지만, 프록시가 뭔지도 모르고 넘어가기엔 내가 "단순히 코드를 찍어내는 코더인지, 배우고자 하는 개발자인지"를 다시 한번 떠올리며 프록시가 뭔지 한번 보고 넘어가기로 했다.
- Proxy?
프록시란 영어로 ‘대리인’을 의미합니다. 프록시 서버(proxy server)는 서버를 통해 다른 네트워크 서비스에 간접적으로 접속할 수 있게 해 주는 컴퓨터 시스템이나 응용프로그램을 말합니다.
프록시 서버는 방문 중인 웹사이트와 기기 사이에서 중개자 역할을 하며, 트래픽은 호스트 서버 연결에 사용되는 원격 시스템을 통해 전달됩니다. 프록시 서버를 이용하면 실제 IP 주소를 숨길 수 있으며 웹사이트에서는 원래 IP 주소가 아닌 프록시 서버의 IP 주소를 인식하게 됩니다.
그러나 프록시는 응용프로그램 수준에서만 동작하기 때문에 프록시 서버를 설정한 앱에서 발생하는 트래픽만 재라우팅할 수 있으며 사용자의 인터넷 트래픽을 암호화할 수는 없습니다.
위 그림처럼 프록시 서버는 클라이언트와 서버의 중간에 위치하는 "중개인"의 역할이며, 프록시 서버 중 일부는 프록시 서버에 요청된 내용들을 캐시를 이용하여 저장해 둔다. 이렇게 캐시를 해 두고 난 후에, 캐시 안에 있는 정보를 요구하는 요청에 대해서는 원격 서버에 접속하여 데이터를 가져올 필요가 없게 됨으로써 전송 시간을 절약할 수 있게 됨과 동시에 불필요하게 외부와의 연결을 하지 않아도 된다는 장점을 갖게 된다. 또한 외부와의 트래픽을 줄이게 됨으로써 네트워크 병목 현상을 방지하는 효과도 얻을 수 있게 된다. 이 외에도, 프록시는 보안 강화를 위해 사용된다.
프록시 서버가 중간에 위치함으로써, 클라이언트는 프록시를 "서버"라고 인식 할 것이고, 마찬가지로 서버도 프록시를 "클라이언트"로 인식 할 것이다.
프록시는 어디에 위치 하느냐에 따라 포워드 프록시, 리버스 프록시로 나뉜다.
- Forward Proxy
-일반적으로 프록시를 말할때 "Forward Proxy"를 뜻한다. 클라이언트가 서버에 리소스를 요청할때, 요청이 서버에 직접 도달하기 전에 프록시 서버에서 요청을 처리한다. 이 경우 서버에서 받는 IP는 클라이언트의 IP가 아닌 프록시 서버의 IP이기 때문에 서버는 클라이언트가 누군지 알 수 없다. 즉, 서버에게 클라이언트가 누구인지 감춰주는 역할을 한다. -> 기업 사내서버에서 자주 이용된다. - 포워드 프록시의 특징 / 역할
- 캐싱 : 첫 번째 요청 이후부터는 동일한 요청이 들어올 경우, 프록시 서버에 캐싱된 내용을 전달해줌으로써 성능을 향상시킬 수 있다.
웹 서비스에서 요청이 발생할 때마다 1) 요청 → 2) 요청 전송 → 3) 요청 접수 → 4) 응답 생성 → 5) 응답 전송 → 6) 응답 수신 과 같은 과정을 반복해서 거친다. 요청이 한 번 뿐일 때는 괜찮지만, 중복되는 요청을 매번 처리하기에는 심한 자원낭비가 생기고, 웹 서버의 부하가 증가할 것이다.
(지금 내가 프로젝트를 진행하며 문제를 겪고 있었다. 백엔드의 코드를 모두 comment하고, 실행중인 노드를 모두 종료시키고, 백엔드 서버가 구동중인 포트번호의 프로세스도 kill -9로 강제 종료를 시켰는데도 불구하고 백엔드쪽 로직이 정상 동작 한다는 것이다. 나는 아무것도 모르고 "어떻게 도대체 왜 백엔드 서버가 실행중도 아닌데 왜 모든 기능이 정상 동작을 하는거지? 라고 생각했는데 아마 이 프록시가 이전의 내용들을 이미 캐싱해 같은 요청이 들어오면 서버에 요청하는 대신 프록시에 캐싱된 데이터들을 꺼내 쓰는것 같다. 프록시 설정을 바꿔보고 다시 알아내도록 하겠다.)
이를 위해 포워드 프록시는 정적 데이터를 저장해두고 동일한 요청의 경우 웹서버 까지 가지 않고 포워드 프록시에서 처리할 수 있는 캐싱 역할을 수행한다.
IP 우회 : 위에 언급했듯이 클라이언트 측에서 프록시 서버를 거쳐 웹 서비스를 이용할 경우, 서버 측에서는 요청을 받을 때 클라이언트의 IP가 아닌 프록시 서버의 IP를 전달받게 된다. 즉, 서버 측에 클라이언트의 정보를 숨길 수 있게 되는 것이다.
제한 : 보안이 중요한 사내망에서 정해진 사이트에만 연결 할 수 있도록 설정하는 등 웹 사용 환경을 제한할 수 있다.
- Reverse Proxy
리버스 프록시(Reverse Proxy)는 클라이언트 요청을 받아 내부 서버로 전달하고, 서버의 응답을 클라이언트로 반환하는 중간 서버 역할이다. 클라이언트와 서버 사이에 위치하여 클라이언트의 요청을 받아 실제 서버로 전달한 후, 서버의 응답을 다시 클라이언트에게 반환하는 서버이다. 클라이언트는 리버스 프록시 서버와만 통신하며, 실제 서버의 존재나 위치를 알 필요가 없다.
특징
1. 로드 밸런싱 (Load Balancing):
- 리버스 프록시는 여러 대의 서버에 클라이언트 요청을 분산시켜 서버의 부하를 균형 있게 유지한다. 이를 통해 성능 향상과 고가용성을 보장한다.
2. 보안 강화 (Security Enhancement):
- 실제 서버의 IP 주소와 구조를 클라이언트로부터 숨겨 보안을 강화한다. 또한, SSL/TLS 암호화를 통해 데이터 전송의 보안을 강화할 수 있다.
3. 캐싱 (Caching):
- 리버스 프록시는 정적 콘텐츠나 빈번히 요청되는 데이터를 캐싱하여 서버 부하를 줄이고 응답 시간을 단축할 수 있다.
4. SSL 종단 (SSL Termination):
- 리버스 프록시는 클라이언트와의 SSL 연결을 종료하고 내부 서버와는 평문 통신을 할 수 있다. 이를 통해 서버의 SSL 처리 부담을 줄일 수 있다.
5. 애플리케이션 방화벽 (Application Firewall):
- 리버스 프록시는 웹 애플리케이션 방화벽 기능을 제공하여 클라이언트의 악의적인 요청을 필터링하고 보안을 강화한다.
6. 압축 (Compression):
- 클라이언트로 전달되는 데이터를 압축하여 네트워크 대역폭을 절약하고 전송 속도를 향상시킬 수 있다.
예시
- NGINX: 리버스 프록시, 웹 서버, 로드 밸런서 등 다양한 기능을 제공하는 소프트웨어.
- Apache HTTP Server: 모듈을 통해 리버스 프록시 기능을 제공.
- HAProxy: 높은 성능의 TCP 및 HTTP 로드 밸런서와 프록시 서버.
작동 원리
1. 클라이언트 요청: 클라이언트는 리버스 프록시 서버에 요청을 보낸다.
2. 리버스 프록시 처리: 리버스 프록시는 요청을 처리하고 적절한 백엔드 서버로 전달한다.
3. 서버 응답: 백엔드 서버는 요청을 처리하고 응답을 리버스 프록시 서버로 보낸다.
4. 응답 반환: 리버스 프록시 서버는 받은 응답을 클라이언트에게 반환한다.