[백엔드 기술 면접 대비] - 3.Nginx를 사용한 리버스 프록시는 왜 필요할까?
리버스 프록시란?
클라이언트 요청을 대신 받아 내부 서버로 전달해주는 것을 리버스 프록시(Reverse Proxy) 라고 한다.
그렇다면 프록시란?
프록시란 대리라는 의미로, 정보를 대신 전달해주는 주체라고 생각하면 되는데, 만약 이 프록시 없이 웹 서버를 운영한다고 가정해보자.
localhost:3000
라고 하는 웹서버를 열어서 운영했을 때, 사용자가 갑자기 많아지거나, 웹서버가 그대로 노출되어 있기 때문에 보안적으로 위험성이 증가한다. nginx를 사용하면 로드 밸런싱으로 부하를 줄여줄 수 있고, 분산 처리 또한 가능하며 웹서버의 SSL 인증도 적용할 수 있다. (SSL이란?)
따라서 아래와 같이 사용자 -> nginx -> 웹서버로 구성해서 사용자의 요청을 nginx가 대신 웹서버로 전달해주도록 구성한다.
예시
리버스 프록시는 사용자가 도메인.com 으로 요청했을때, 요청 분기에 맞도록 Front,Back 요청을 처리하는 것이다.
만약 Front측 에서 Back에 다음과 같이 API 요청을 보낸다고 가정하자
도메인.com:8081/api/v1/Americano
Front에서 Get요청으로 위와같은 요청을 보낸다고 했을때, 기존에 우리는 정확히 보낼 포트를 명시하여 요청해 준다. 하지만 리버스 프록시 요청을 통해 포트를 숨겨 요청할 수 있다.
도메인.com/api/v1/Americano
리버스 프록시를 적용하면, 프론트에서 API 요청을 보낼때 이렇게 보낼 수 있다.
Q. 포트가 없는데 어떤 포트로 요청을 보낼지 어떻게 알지?
A. /api 를 분기로 해서, 해당 분기가 붙은 요청은 8081포트로 보내겠다고 설정하면 됨!
이처럼, 어떤 분기처리를 해주어서 우리가 서버내부에서 어떤 요청을 어떤 포트로 처리할지 분기처리를 해주면된다.
리버스 프록시를 쓰는 이유
리버스 프록시는 다음 이유 때문에 사용한다.
- 로드 밸런싱 : Nginx는 클라이언트의 요청을 프록시 서버에 분산하기 위해 로드 밸런싱을 수행하여 성능, 확장성 및 신뢰성을 향상시킬 수 있습니다.
- 캐싱 : Nginx를 리버스 프록시로 사용하면 미리 렌더링된 버전의 페이지를 캐시하여 페이지 로드 시간을 단축할 수 있습니다. 이 기능은 프록시 서버의 응답에서 수신한 콘텐츠를 캐싱하고 이 콘텐츠를 사용하여 매번 동일한 콘텐츠를 프록시 서버에 연결할 필요 없이 클라이언트에 응답하는 방식으로 작동합니다.
- SSL 터미네이션 : Nginx는 클라이언트와의 연결에 대한 SSL 끝점 역할을 할 수 있습니다. 수신 SSL 연결을 처리 및 해독하고 프록시 서버의 응답을 암호화합니다.
- 압축 : 프록시 서버가 압축된 응답을 보내지 않는 경우 클라이언트로 보내기 전에 응답을 압축하도록 Nginx를 구성할 수 있습니다.
- DDoS 공격 완화 : 수신 요청과 단일 IP 주소당 연결 수를 일반 사용자에게 일반적인 값으로 제한할 수 있습니다. 또한 Nginx를 사용하면 클라이언트 위치와 "User-에이전트" 및 "Referer"와 같은 요청 헤더 값을 기준으로 액세스를 차단하거나 제한할 수 있습니다.
reference
- https://velog.io/@chickenfondue/nginx-docker-compose%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EB%A6%AC%EB%B2%84%EC%8A%A4-%ED%94%84%EB%A1%9D%EC%8B%9C-%EA%B5%AC%EC%84%B1
- https://narup.tistory.com/238
- https://velog.io/@dgh03207/Nginx-%EB%A6%AC%EB%B2%84%EC%8A%A4-%ED%94%84%EB%A1%9D%EC%8B%9C%EB%B0%B1%EC%97%94%EB%93%9C%EB%9E%91-%ED%94%84%EB%A1%A0%ED%8A%B8%EB%A5%BC-%EA%B0%99%EC%9D%80-%ED%8F%AC%ED%8A%B880%ED%8F%AC%ED%8A%B8%EB%A1%9C-%EC%97%B0%EA%B2%B0