Nginx는 Apache에서 불필요한 기능을 최대한 덜어내고 빠르게 웹서버를 구동시킬 수있는 웹 서버 프로그램입니다. 두 서버간 대표적인 차이점은 제공하는 proxy 기능에 있습니다. Apache의 경우 mod_proxy에서 forward proxy와 reverse proxy 기능 둘다 제공하지만 Nginx에서는 Reverse Proxy만 제공합니다. 그럼 forward / Reverse Proxy는 어떤 차이가 있을까요?
Proxy란?
proxy는 클라이언트의 요청을 대리 해주는 중계자 역할을 합니다. 즉 클라이언트와 서버간 직접적인 통신이 확립되는 것이 아니라, 클라이언트의 프록시 서버와 서버간의 통신이 만들어지는 것입니다.
웹 애플리케이션에서 프록시를 쓰는 이유는 여러가지가 있습니다.
1. 보안 이슈
클라이언트가 서버에게 요청을 보낼 때 프록시를 제끼고 직접적으로 요청을 보내면 서버의 경로가 그대로 노출되게 됩니다. 악의적인 사용자는 서버의 정보 요청경로를 통해 DDos 같은 공격을 쉽게 보낼 수 있게 됩니다. 프록시를 통해 요청을 보내게 되면 경로를 쉽게 알 수 없게 됩니다.
2. 데이터 캐시
캐시는 자주 사용하는 데이터를 저장한 후 재사용하는 개념입니다. 클라이언트가 자주 사용하는 /GET /value 요청이 있다고 가정하면, 프록시 서버에서는 요청들을 저장한 후 재사용하면서 서버를 거치지 않고도 데이터를 전달받을 수 있게 됩니다.
Forword Proxy VS Reverse Proxy
이렇게 Proxy는 다양한 이유로 사용이 되고 있습니다. 지금은 거의 필수적인 웹 서버의 기능이라고 할 수 있는데요, 프록시에는 두가지 종류가 있습니다.
1. Forward Proxy
먼저 포워드 프록시는 클라이언트측에서 요청을 보낼 때 사용되는 프록시 서버를 의미합니다. 포워드 프록시에는 캐싱(cache) 기능이 있어서 사용자가 자주 요청하는 요청들은 서버를 거치지 않고도 응답할 수 있게 됩니다. 서버의 응답시간이 단축되는 효과가 있습니다.
추가적으로 포워드 프록시에서는 사용자가 접근할 수 있는 사이트들을 지정할 수 있어 보안 관리에 신경을 쓸수가 있습니다. 특히 인트라넷을 이용하는 군대, 기업에서 내부망에서 접근할 수 있는 사이트들을 관리할 수 있습니다. (회사에서 쇼핑몰 사이트 접속 차단시키는 .. 등등)
2. Reverse Proxy
포워드 프록시와 반대로 서버에서 클라이언트 측으로 데이터를 전달할 때 사용되는 프록시입니다. Reverse Proxy를 이용하면 서버에 들어오는 요청 트래픽을 효율적으로 분산하는 Load Balance를 구현할 수 있습니다. 10대의 서버가 있다고 가정하면 그 중 가장 트래픽이 적은 서버를 찾아서 효율적인 데이터 응답을 구현할 수 있습니다.
Reverse Proxy를 이용하면 크리티컬한 보안 이슈가 발생할 수 있는 DB 접근을 어느정도 막을 수 있습니다. Reverse Proxy 설정을 한 웹 서버를 방화벽으로 둘러싼 후 혹시나 웹 서버가 털리더라도 DB까지 함께 털릴 일을 줄일 수 있습니다.
물론 Reverse Proxy에서도 서버로의 요청 경로를 숨길 수가 있기 때문에 서버의 보안을 구현해낼 수도 있습니다.
Proxy 구현
React 애플리케이션에서 서버로 요청을 보낼 때 proxy를 설정할 수 있습니다.
예를 들어 서버의 주소가 https://localhost 라고 가정합니다.
클라이언트는 프록시 서버의 주소로 https://localhost/api/v1이라고 지정합니다.
이제 사용자 정보를 반환하는 서버 API 경로가 https://localhost/api/v1/auth라고 가정합니다.
이제 클라이언트는 서버로 부터 사용자 정보를 받아오기 위해 전체 경로를 입력할 필요가 없습니다.
axios('/auth')만 입력해주면 클라이언트의 프록시 서버에서 경로를 전달받아 전체 경로를 입력해 서버로 부터 요청을 받아올 수가 있게 됩니다.
'Programming' 카테고리의 다른 글
Error: ENOSPC: System limit for number of file watchers reached 문제 해결 (0) | 2022.09.25 |
---|---|
Node.js 웹서버 배포 버전 만들기 production mode (1) | 2022.09.22 |
Nginx 란? 웹 서버 개념 이해하기 (1) | 2022.09.20 |
bash: sudo: command not found 해결 (0) | 2022.09.20 |
Ubuntu Version 확인 명령어 (terminal 에서 버전 정보 체크 방법) (0) | 2022.09.19 |
댓글