앞선 시리즈 글 API Gateway를 사용해야하는 이유 을 통해서 API Gateway를 만들어야 할 필요성에 대해 설명하였다. 이 시리즈에서는 NGINX의 reverse proxy
기능을 사용하여 gateway를 만들어보는 예시를 진행해보려 한다. 그 전에 forward proxy
와 reverse proxy
의 개념에 대해서 짚어보고 가보자.
이 글은 forward proxy와 reverse proxy에 대해 훌륭하게 정리된 다음 링크 의 내용을 번역 및 정리하였습니다.
이 글은 두 종류의 proxy(forward, reverse)에 대해서 설명하지만 우리가 이 글을 읽는 초점은 reverse proxy를 이해하기 위함이고 forward proxy는 그것의 대조군으로써 이해하고 넘어갔으면 좋겠다.
Web server들의 앞단에 존재하여 client의 request를 web server들에게 전달해준다. Reverse proxy는 주로 security, performance, reliability를 증진시켜주는 방향으로 사용된다.
Forward proxy, 종종 proxy, proxy server, web proxy라고 불리는 것은 client machine들의 group의 앞에 존재한다. 이런 computer들이 인터넷에 있는 사이트나 서비스들에 request를 보내게 되면 proxy server가 그 request를 intercept 하여 중간자가 되어 client들을 대신하여 web server들과 소통한다.
아래의 그림을 보자:
표준의 internet communication에 의하면 client는 origin server에 직접 request를 보내고 origin server는 client에게 직접 response를 보내는 방식으로 computer A와 computer C는 소통한다.
Forward proxy가 위치하게 되면, A는 B에게 request를 보내게 되고, B는 C에게 request를 forward 한다. C는 B에게 response를 보내고, B는 A에게 response를 전달한다.
무슨 이유로 이런 중간자(middleman)를 추가하는 걸까? 거기에는 몇가지 이유가 있다:
정부, 학교 및 다른 단체에서는 방화벽을 사용하여 사용자들을 제한된 버전의 인터넷을 사용하게 한다. 사용자는 직접 자신이 방문하려는 사이트에 연결되는 것 대신 proxy와 연결되는 것이다. 이를테면 학교의 인터넷으로는 Facebook이나 다른 social media site에 접속을 못하게 하거나 이들에게서 오는 response를 block 하는 것이다.
정치적 반체제 인사들이 웹 포럼이나 social media에서 벌이는 활동은 이들을 투옥으로 이끄는 경우도 있다. 이런 경우 이들은 자신의 신원을 숨기기 위해서 forward proxy server를 사용하고, 그렇게 되면 tracking 하기 어렵다는 점이 있다.
Reverse proxy는 하나 이상의 web server들의 앞에 존재하여 client로부터 오는 request를 intercept 한다. Forward proxy는 client들의 앞에 존재한다는 점에서 다르다.
Forward proxy와 reverse proxy의 차이는 미묘하지만 매우 중요하다. 단순하게 설명하자면 proxy server가 존재하면 client와 server가 직접적으로 communicate를 하는 경우를 막는다. Forward proxy는 client의 앞에 이것이 존재하고 reverse proxy는 server의 앞에 이것이 존재하는 것이다. Client를 숨기느냐 server를 숨기느냐의 문제이다.
아래는 reverse proxy를 표현한 그림이다:
Reverse proxy를 사용하면 D로부터 나오는 모든 request는 E로 가고, E는 F로 request를 보내고 response를 받아온다. E는 이 response를 D에게 전달한다.
아래는 reverse proxy를 사용했을 때의 장점이다:
하루에 몇백만명이 방문하는 유명한 웹사이트의 경우에는 한대의 서버가 모든 트래픽을 감당할 수 없다. 대신 여러대의 서버로 구성된 풀에 의해서 사이트가 처리된다. 이런 경우 reverse proxy가 load balancing solution을 제공하여 한대의 서버가 overload 되는 것을 막을 수 있다. 한대의 서버가 fail하면 다른 서버들이 이 트래픽을 처리할 수 있다는 장점도 있다.
Reverse proxy를 사용하면 origin server의 IP 주소를 바깥에 공개할 필요가 없다. 이것은 DDos 공격같은 것을 하기 어렵게 만든다. 공격자들은 오직 reverse proxy를 타겟으로 잡을수 밖에 없고 여기에 엄격한 보안을 적용하여 막을 수 있기 때문이다. 여러대의 서버가 존재하는데 reverse proxy가 없다면 모든 서버에 보안 사항을 적용해야 하기 때문이다.
Load balancing의 측면에서, 지구상의 여러 지역에 서버가 분산되어 있는 경우 client는 지정학적으로 가장 가까운 서버로 요청을 보낼 수 있다. 이것은 load 시간을 단축시켜준다.
Content를 caching 해두어서 더 빠른 performance를 가져다줄수도 있다.
SSL encrypting과 decrypting은 computationally expensive한 작업이다. 들어오는 모든 request에 대해서 decrypting을 하고 나가는 모든 response에 대해 encryption을 하면 서버의 리소스를 적게 쓴다는 장점이 있다.