리버스 프록시(Reverse Proxy) Nginx 설정: SSL 인증서 자동 갱신과 포트 포워딩 탈피
복잡한 포트 번호와 안녕을 고하는 시간
집이나 사무실에서 작은 서버를 운영해 본 적이 있다면 주소 뒤에 붙는 익숙하지 않은 숫자들을 기억할 것입니다. http://192.168.1.100:8080 이나 http://mydomain.com:3000 처럼 말입니다. 웹서핑을 할 때 네이버나 구글 주소 뒤에 콜론과 함께 숫자가 붙어 있는 것을 본 적은 거의 없을 것입니다. 우리가 평소에 접속하는 웹사이트들은 모두 깔끔하게 기본 주소만으로 접속되는데 유독 내가 만든 서버나 홈서버는 포트 번호를 주렁주렁 달고 살아야만 했습니다.
이런 번거로움에서 벗어날 수 있게 해주는 마법 같은 기술이 바로 리버스 프록시입니다. 여기에 더해 매번 귀찮게 손으로 직접 갱신해주어야 했던 보안서버 인증서까지 자동으로 관리할 수 있게 된다면 서버 운영의 질이 완전히 달라지게 됩니다. 오늘은 복잡한 포트 포워딩의 지옥에서 탈출하고 안전한 웹 환경을 구축하는 방법에 대해 아주 쉽고 자세하게 알아보겠습니다.
리버스 프록시가 무엇이고 왜 필요한지 알아보기
프록시라는 단어는 대리인이라는 뜻을 가지고 있습니다. 우리가 흔히 아는 프록시는 회사에서 직원의 인터넷 사용을 통제하거나 우회할 때 쓰는 포워드 프록시입니다. 반대로 리버스 프록시는 외부 사용자가 우리 서버에 접속할 때 가장 먼저 맞닥뜨리는 문지기 역할을 하는 서버를 말합니다.
집안에 여러 개의 방이 있다고 가정해 봅시다. 첫 번째 방에서는 블로그를 운영하고 두 번째 방에서는 개인 클라우드를 돌리고 세 번째 방에서는 미디어 서버를 구동 중입니다. 외부 손님이 찾아왔을 때 이 방들의 번호를 일일이 알려주며 찾아오라고 하는 것이 기존의 포트 포워딩 방식입니다. 하지만 리버스 프록시를 도입하면 정문 안내데스크를 하나 세우는 것과 같습니다. 손님이 안내데스크에 오면 블로그를 보러 왔는지 클라우드를 쓰러 왔는지 파악해서 알맞은 방으로 조용히 연결해 줍니다.
이 방식을 사용하면 얻을 수 있는 장점은 다음과 같습니다.
- 주소창이 깔끔해집니다. 포트 번호를 숨기고 예쁜 도메인 이름만으로 서비스에 접근할 수 있습니다.
- 보안성이 대폭 향상됩니다. 실제 내부 서버의 IP 주소와 포트가 외부로 노출되지 않아 해킹의 위험을 크게 줄여줍니다.
- 여러 개의 웹서버를 하나의 공인 IP 뒤에서 동시에 운영할 수 있습니다.
- SSL 인증서 처리를 한 곳에서 일괄적으로 담당하게 만들어 관리가 편해집니다.
Nginx를 활용하여 만능 관문 세우기
수많은 리버스 프록시 도구 중에서도 Nginx는 전 세계 수많은 웹사이트가 선택한 가장 강력하고 가벼운 프로그램입니다. 설정 방법도 생각보다 그리 어렵지 않으며 한 번 익혀두면 평생 써먹을 수 있는 유용한 기술입니다.
Nginx를 설치하고 리버스 프록시를 설정하는 기본적인 개념은 외부에서 들어오는 요청의 도메인 주소를 보고 정해진 내부 포트로 토스해주는 것입니다. 예를 들어 blog.myhome.com이라는 주소로 접속이 들어오면 이를 내부에서 3000번 포트로 돌리고 cloud.myhome.com으로 들어오면 8080번 포트로 연결해 주는 식입니다.
설정 파일은 보통 간단한 텍스트 형태로 이루어져 있으며 특정 블록 안에 다음과 같은 규칙을 적어주면 됩니다.
- 서버 블록을 선언하여 어떤 도메인 이름에 반응할지 지정합니다.
- 프록시 패스 명령어를 사용하여 요청을 보낼 내부 서버의 주소와 포트를 적어줍니다.
- 클라이언트의 원래 IP 주소와 프로토콜 정보를 내부 서버에 제대로 전달하기 위한 헤더 설정을 추가합니다.
이렇게 설정해 두고 나면 Nginx가 알아서 교통정리를 해주기 때문에 사용자는 뒤에서 어떤 복잡한 프로그램들이 돌아가고 있는지 전혀 알 필요 없이 매끄럽게 서비스를 이용할 수 있습니다.
매년 다가오는 인증서 갱신의 공포에서 벗어나기
웹사이트를 운영한다면 HTTPS 보안 접속은 이제 선택이 아닌 필수가 되었습니다. 브라우저 주소창에 자물쇠 아이콘이 뜨지 않으면 방문자들은 불안해하며 사이트를 떠나버리곤 합니다. 무료 SSL 인증서 발급 기관인 Let’s Encrypt가 등장하면서 비용 부담은 사라졌지만 90일마다 찾아오는 인증서 만료일은 여전히 서버 관리자들을 괴롭히는 숙제였습니다.
인증서 유효기간이 끝나기 전에 갱신 명령어를 수동으로 입력하거나 스크립트를 짜야 했는데 자칫 깜빡하기라도 하면 갑자기 사이트가 마비되거나 브라우저 경고창이 뜨는 대참사가 일어나곤 했습니다. 하지만 Nginx와 자동 갱신 프로그램을 결합하면 이 모든 과정이 완벽하게 자동화됩니다.
Certbot이라는 도구를 사용하면 Nginx와 완벽하게 연동되어 인증서 발급부터 갱신까지 손가락 하나 까딱하지 않고 해결할 수 있습니다. Certbot은 Nginx의 설정 파일을 읽어들여 인증서 발급에 필요한 검증 과정을 스스로 처리하고 인증서가 만료되기 30일 전부터 알아서 갱신 작업을 시도합니다. 심지어 갱신이 완료된 후에 Nginx가 새로운 인증서를 즉시 인식할 수 있도록 재시작 명령어까지 알아서 실행해 줍니다.
시스템 내부의 크론탭이나 타이머 기능을 이용해 하루에 두 번씩 갱신 대상인지 확인하는 작업을 걸어두기만 하면 됩니다. 이후로는 인증서 만료일 걱정 없이 발 뻗고 잘 수 있는 평화가 찾아옵니다.
흔히 저지르는 실수와 명쾌한 해결책
리버스 프록시와 SSL 자동 갱신을 처음 구축하면서 많은 초보자들이 겪는 시행착오들이 있습니다. 몇 가지 흔한 오해와 진실을 알면 삽질하는 시간을 대폭 줄일 수 있습니다.
첫 번째 오해는 포트 포워딩을 아예 안 해도 된다는 생각입니다. 리버스 프록시를 도입하면 내부 서버로 향하는 포트 포워딩은 필요 없지만 공유기나 방화벽 설정에서 80번과 443번 포트는 여전히 Nginx 서버로 향하도록 열어주어야 합니다. 외부에서 들어오는 웹 트래픽의 문은 오직 이 두 개뿐이며 Nginx가 이 문을 지키고 서서 안쪽으로 배달해주는 구조이기 때문입니다.
두 번째는 SSL 인증서를 갱신할 때 웹서버를 무조건 꺼야 한다는 걱정입니다. 과거에는 인증서를 갱신하려면 Nginx를 잠시 멈추어야 했지만 요즘은 웹서버를 끄지 않고도 인증서 검증을 완료할 수 있는 플러그인 방식이 잘 되어 있습니다. 서비스 중단 시간 없이 물 흐르듯 자연스럽게 갱신이 이루어집니다.
세 번째는 웹소켓이나 스트리밍 방송 같은 실시간 통신은 리버스 프록시를 쓰면 안 된다는 편견입니다. Nginx는 기본적으로 HTTP 요청을 처리하지만 약간의 추가 설정만 더해주면 웹소켓 연결도 완벽하게 지원합니다. 실시간 채팅이나 알림 기능도 포트 번호 없이 깔끔하게 도메인만으로 이용할 수 있습니다.
비용 한 푼 들이지 않고 프로급 서버 환경 구축하기
전문가들이 쓰는 상용 솔루션을 도입하려면 수많은 라이선스 비용이 들기 마련입니다. 하지만 Nginx와 Let’s Encrypt 조합은 100% 오픈소스이면서도 대기업 서비스 못지않은 강력한 성능을 자랑합니다. 라즈베리파이 같은 저렴한 소형 컴퓨터나 안 쓰는 남는 PC에 리눅스를 설치하고 이 환경을 구축하면 유지비가 전혀 들지 않습니다.
전력 소모가 적은 미니 PC에 홈서버를 구축하고 리버스 프록시를 적용해 두면 외부 카페나 지하철에서도 집안에 있는 파일 서버나 개발 중인 웹 프로젝트에 마치 전용 클라우드처럼 안전하게 접속할 수 있습니다. 외부망과 내부망을 분리하는 방패막이 역할까지 톡톡히 해내기 때문에 보안 수준도 전문가 수준으로 끌어올릴 수 있습니다.
처음에는 설정 파일의 괄호 하나, 세미콜론 하나 때문에 에러가 나고 화면에 502 Bad Gateway 에러가 반겨줄 수도 있습니다. 하지만 그 과정을 한 번 이겨내고 나면 내 손으로 직접 완벽한 웹 트래픽 제어 시스템을 만들었다는 엄청난 성취감을 느낄 수 있을 것입니다. 복잡한 포트 번호와 수동 인증서 갱신의 시대는 이제 뒤로 하고 훨씬 스마트하고 안전한 서버 운영의 세계로 발을 내딛어 보세요.
댓글 0
첫 댓글을 남겨보세요.