프록시 서버란?
Proxy의 사전적 의미는 '대리'입니다. 이름 그대로 프록시 서버는 클라이언트가 다른 네트워크 서비스에 간접적으로 접속할 수 있도록 해주는 서버를 말해요.
간단하게 말하면 클라이언트와 서버 사이의 중계 역할을 하는 서버라고 이해할 수 있어요.
프록시 서버의 종류는 2가지로 나뉘어요.
1.
포워드 프록시(Forward Proxy)
2.
리버스 프록시(Reverse Proxy)
이 둘의 차이점은 이것만 기억하면 쉽게 이해할 수 있어요.
포워드 프록시는 클라이언트가 서버를 속이는 것이고,
리버스 프록시는 서버가 클라이언트를 속이는 것이다.
포워드 프록시 서버란?
포워드 프록시는 클라이언트와 외부 서버 사이에 위치하여 클라이언트의 요청을 대신 전달하는 서버입니다.
이 서버는 클라이언트 대신 웹사이트에 접속하여 요청된 자원을 가져오고, 이를 다시 클라이언트에게 전달해요.
주요 기능
•
보안 (IP 우회): 포워드 프록시를 사용함으로써 원격 서버는 클라이언트의 진짜 IP 주소를 알 수 없게 되므로, 사용자의 익명성을 보장할 수 있어요.
이런 측면에서 VPN과 유사한 부분이 있어요.
•
접속 제한: 프록시 서버에서 기업이나 교육 기관 등에서 원하지 않는 사이트의 접근을 차단하거나 허용하는 정책을 실행할 수 있어요.
•
캐싱: 서버에 동일한 요청이 반복될 경우, 포워드 프록시 서버에 저장된 캐시를 통해 빠르게 응답할 수 있어 네트워크 트래픽과 응답 시간을 줄일 수 있어요.
즉, 포워드 프록시는 클라이언트가 서버를 속이는 방식으로 보안과 캐싱 등의 이점을 얻는 수단입니다.
리버스 프록시 서버란?
리버스 프록시는 외부 클라이언트의 요청을 받아 내부 서버(예: 웹 애플리케이션 서버)로 전달하고, 그 응답을 클라이언트에게 돌려주는 역할을 해요.
예를 들어, 클라이언트가 까비 사이트에 접속 요청을 보내면, 이는 리버스 프록시 서버에 도달하고, 리버스 프록시는 이 요청을 처리하기에 가장 적합한 내부의 서버로 전달하여 처리한 후 결과를 클라이언트에게 반환해요.
주요 기능
•
로드 밸런싱: 리버스 프록시 서버는 뒤에 위치한 여러 서버로부터 부하를 균등하게 분산시킬 수 있어 서비스의 안정성과 처리 속도를 개선할 수 있어요.
까비가 AWS의 ALB(Application Load Balancer)를 사용하고 있는 것도 이런 이유중의 하나입니다!
•
보안: 클라이언트는 내부 서버의 실제 IP나 구조를 알 수 없기 때문에, 리버스 프록시 서버가 보안 강화에 기여해요.
즉, 리버스 프록시는 서버가 클라이언트를 속이는 방식으로 로드 밸런싱과 보안 등의 이점을 얻는 수단입니다.
까비 로컬 개발 환경에서 Nginx를 리버스 프록시로 사용하는 이유
1.
통합된 접점 제공: 로컬 개발 환경에서 모든 서비스(백엔드 서버, 프론트엔드 서버 등)에 대한 접점을 하나로 통합하여 관리할 수 있어요. 이를 통해 개발 환경의 복잡성을 줄이고, 서비스 간의 상호 작용을 더 쉽게 구성할 수 있어요.
2.
CORS 문제 해결: 다른 출처(Origin) 간의 리소스 공유 시 발생할 수 있는 CORS(Cross-Origin Resource Sharing) 에러를 방지할 수 있어요. Nginx를 통해 모든 요청을 같은 도메인으로부터 오는 것처럼 처리하여, 브라우저의 보안 정책에 의한 제약을 회피할 수 있어요.
3.
설정의 유연성: Nginx는 다양한 요청 경로에 따라 다른 서버로 라우팅할 수 있는 URL 경로 기반 라우팅 기능을 제공해요. 이를 통해 개발자는 특정 엔드포인트 요청을 적절한 대상 서버(백엔드 서버 또는 프론트엔드 서버)로 유연하게 전달할 수 있어요.
즉, CORS 에러나 다른 추가적인 설정에 대한 걱정 없이 쉽고 편리하게 백엔드와 프론트엔드를 연동하여 로컬 개발환경의 편의성을 제공하기 위해서 리버스 프록시 서버를 두고 사용하여 개발하고 있어요.
다른 웹서버도 비슷한 솔루션을 제공해주긴 하지만 특별히 Nginx를 선택한 이유는 사용 사례가 많아 설정 문제로 인해 이슈를 겪더라도 트러블 슈팅이 용이할 것이라고 판단했기 때문입니다.
까비에서 Nginx 리버스 프록시 설정 예제
다음은 로컬 환경에서 Nginx를 리버스 프록시 서버로 사용하는 설정 예제입니다.
실제로 까비에서 설정하고 있는 예시로 가져왔어요.
/auth, /vN, /api로 시작하는 경로의 요청은 백엔드 서버(2424 포트)로 보내고, 그 외의 요청은 프론트엔드(4242 포트)로 보내도록 구성하였어요.
server {
listen 80;
location / {
# 기본적으로 프론트엔드 서버로 요청을 전달
proxy_pass http://host.docker.internal:4242;
}
location ~ ^/(auth|api|v[0-9]+) {
# /auth, /api, vN (N은 숫자)로 시작하는 요청은 백엔드 서버로 전달
proxy_pass http://host.docker.internal:2424;
}
}
Plain Text
복사
사용 예시
실제로 어떻게 적용되나 볼까요?
http://localhost/login 해당 경로는 프론트엔드에서 관리하는 라우트입니다.
따라서 클라이언트가 이 경로를 요청하면 Nginx 서버는 프론트엔드 서버에게 리소스를 요청해요.
프론트엔드 서버는 그에 맞는 리소스를 Nginx 에게 넘겨주고 Nginx가 최종적으로 클라이언트에게 리소스를 전달해주어 이런 로그인 화면이 나타났어요.
http://localhost/v4/cabinets/buildings/floors 해당 경로는 백엔드에서 관리하는 라우트입니다.
따라서 클라이언트가 이 경로를 요청하면 Nginx 서버는 백엔드 서버에게 리소스를 요청해요.
백엔드 서버에서는 인증 수단없이 들어온 요청에 대해 401 에러를 응답해요.
그래서 이 응답을 Nginx에게 넘겨주고 Nginx가 최종적으로 클라이언트에게 리소스를 전달해주어 이런 오류 화면이 나타났어요.
결론
포워드 프록시, 리버스 프록시 서버의 개념과 로컬 개발 환경에서의 Nginx와 같은 리버스 프록시 서버를 두어 얻을 수 있는 이점에 대해서 알아보았어요.