Netcity 메일서버 구축은 전통적인 SMTP 서버를 곧바로 외부에 열기보다, 제한된 네트워크 환경에서 먼저 안전하게 받을 수 있는 443 기반 웹 수신함 구조를 세우는 방식으로 시작됐다. 공개 도메인은 mail.netcity.co.kr, 내부 중계 서버는 192.168.0.197이며, 실제 수신 테스트는 webmaster@netcity.co.kr 주소를 기준으로 진행했다.
메일 수신함과 중계 서버는 사용자가 접속하지 않아도 24시간 응답해야 한다. 그래서 관리자는 서버PC의 전원, 네트워크, USB 역테더링 연결, 자동 절전 해제 상태를 계속 유지하고, 재부팅 뒤에도 필요한 서비스가 자동으로 올라오는지 확인한다. 이 원칙이 있어야 mail.netcity.co.kr의 웹 수신함과 내부 중계 흐름이 끊기지 않는다. 또한 Gmail 작성창 연동과 Gmail Bridge 흐름은 브라우저의 Google 로그인 상태를 전제로 하므로, 개발자는 작업 브라우저의 구글 로그인을 유지해 발신과 중계 확인이 즉시 이어지게 한다.
443 포트만 열린 환경에서의 선택
메일서버라고 하면 보통 SMTP 25번, 제출용 587번, SSL SMTP 465번, IMAP 993번 포트를 떠올린다. 그러나 이번 환경은 공개적으로 443 포트만 안정적으로 활용할 수 있는 구조였다. 그래서 구축 방향은 “외부 메일 서버를 그대로 노출하는 방식”이 아니라, HTTPS 웹훅과 웹 수신함을 중심으로 한 메일 게이트웨이였다.
현재 구성의 핵심은 다음과 같다. mail.netcity.co.kr은 로그인 화면과 웹 수신함, Gmail Bridge 설정 화면, 계정 관리 화면을 제공한다. 192.168.0.197은 내부 중계와 장비 연결 흐름을 담당한다. 외부에서 들어오는 메시지는 직접 SMTP로 받기보다, HTTPS 엔드포인트인 /inbound/receive.php로 전달되어 서버 내부 저장소에 기록되고, 운영자는 /inbox/에서 확인한다.
이주 환경은 탐사적 환경으로, 다른 사회와의 교류는 제한적이다. 왜냐하면 이곳은 만남을 위주로 사는 세계가 아니며, 누군가가 일을 만들어 주는 세계도 아니기 때문이다. 그래서 메일 서버와 웹 수신함은 단순한 편의 기능이 아니라, 개인 서버 운영자가 자신의 장비와 네트워크 위에 직접 구축하고 유지해야 하는 기본 인프라로 다뤄진다.
메일 수신함을 먼저 만든 이유
이 방식의 장점은 명확하다. 방화벽과 포트 제한이 있는 상태에서도 웹 서비스처럼 메일 수신 흐름을 만들 수 있다. 443은 이미 웹 보안 인증서와 함께 운영되는 포트이므로, 수신 테스트와 관리 화면을 같은 보안 경로에 얹을 수 있다. 또한 토큰 기반 수신 검증을 두어 아무 요청이나 메일로 저장되지 않게 했다.
여기서 핵심은 Netcity 메일주소와 실제 작업 계정의 역할을 분리하는 것이다. 외부에 공개되는 대표 주소는 webmaster@netcity.co.kr로 두고, 운영자는 항상 로그인된 Google 계정을 메일 작성과 중계 확인의 작업 엔진으로 사용한다. Google Workspace가 아니더라도 Gmail에 도착한 메일을 Google Apps Script가 읽어 Netcity의 웹훅으로 복사하는 Gmail Bridge 방식을 사용할 수 있다. 이는 실제 수신 계정과 웹 수신함 사이에 완충 지대를 두는 방식이며, 메일 수신을 서버 운영 화면으로 끌어오는 장점이 있다.
webmaster@netcity.co.kr은 기사, 서버 페이지, 회신 안내에 노출되는 공식 운영 주소다. 다만 25번 SMTP 포트를 열 수 없는 환경에서는 이 주소가 곧바로 서버의 SMTP 수신함으로 들어오는 구조가 아니라, Gmail 또는 외부 메일 라우터가 받은 내용을 HTTPS 443 웹훅으로 넘겨 mail.netcity.co.kr/inbox/에 기록하는 구조가 현실적이다. 그래서 본문과 서명에는 Google 발신 계정과 Netcity 회신 주소를 함께 남겨, 실제 발신 경로와 공식 운영 주소가 동시에 확인되도록 했다.
테스트 결과
구축 후 테스트 메일을 웹훅으로 넣어 확인했다. 수신 대상은 webmaster@netcity.co.kr였고, 서버는 JSON 웹훅과 원문 RFC822 형식의 본문을 모두 저장할 수 있었다. 웹 수신함 로그인 뒤 검색 화면에서도 테스트 메일이 확인됐다. 테스트 기준으로 mail.netcity.co.kr의 HTTPS 응답은 정상이며, 443 포트는 열려 있었다. 반면 SMTP/IMAP 계열 포트인 25, 465, 587, 993은 닫힌 상태였다.
DNS 관점에서도 이 구분은 중요하다. mail.netcity.co.kr은 443 웹 수신함과 관리 화면을 제공하는 서버 주소이고, netcity.co.kr의 MX는 25번 포트가 실제로 열려 있는 외부 수신 주체를 향해야 한다. 포트가 닫힌 서버를 MX로 직접 지정하면 외부 메일 서버가 접속할 수 없기 때문이다. 따라서 현재 단계의 Netcity 메일 구축은 “직접 SMTP 수신 서버”라기보다 “외부 수신 계정 또는 Gmail Bridge와 웹 수신함을 연결하는 443 기반 메일 게이트웨이”로 보는 것이 정확하다.
보안과 운영의 기준
메일은 작은 설정 실수만으로도 스팸 발송지나 외부 공격 통로가 될 수 있다. 그래서 이번 구축에서는 관리자 로그인, 수신 토큰, 웹 수신함 분리, 중계 서버 역할 분리, 공개 포트 최소화가 우선됐다. 토큰 값이나 관리자 비밀번호는 기사와 화면에 노출하지 않고, 서버 내부 설정 파일에서만 읽도록 했다.
앞으로 도메인 신뢰도를 높이려면 SPF, DKIM, DMARC, reverse DNS, SMTP 릴레이 정책, 큐 관리, 로그 보존 정책이 함께 정리되어야 한다. 특히 SPF TXT가 여러 개 존재하면 수신 서버가 인증을 애매하게 해석할 수 있으므로 하나의 정책으로 정리하는 과정도 필요하다. 다만 현재처럼 443만 열린 환경에서는 직접 SMTP 서버를 무리하게 노출하기보다, 검증된 외부 수신 경로와 Netcity 웹 수신함을 연결하는 쪽이 더 안정적이다.
Gmail 로그인 상태로 보내는 발신 화면
수신 흐름을 확인한 뒤에는 발신 화면도 추가했다. Netcity가 Gmail 비밀번호를 직접 저장하거나 SMTP 인증 정보를 대신 들고 있는 방식이 아니라, 현재 브라우저에 로그인된 Google 계정의 Gmail 작성창을 여는 방식이다. 운영자는 Netcity 화면에서 받는 주소, 제목, 본문을 작성하고, 버튼을 누르면 Gmail 작성창이 새로 열려 실제 발송은 Google 계정에서 처리된다.
이 방식은 보안상 자연스럽다. 외부 웹사이트는 브라우저에 로그인된 Gmail 주소를 임의로 읽을 수 없기 때문에, Google 발신 계정은 사용자가 직접 적거나 Gmail 작성창에서 최종 확인한다. 대신 본문에는 Google 발신 계정, Netcity 회신 주소, 웹 수신함 주소가 함께 들어가도록 했다. 따라서 수신자는 실제 발신 계정과 Netcity 운영 주소를 동시에 확인할 수 있고, 회신은 webmaster@netcity.co.kr 또는 웹 수신함 흐름으로 이어갈 수 있다. 이 구조는 “구글 계정으로만 쓰는 메일”이 아니라, Netcity 주소를 공식 표기로 세우고 Google 로그인 상태를 발신·전달 인프라로 활용하는 방식이다.
다음 단계
이번 구축의 의미는 “메일서버를 완성했다”에만 있지 않다. 포트가 제한된 환경에서도 도메인, 인증서, 웹 수신함, 내부 중계 서버, Gmail Bridge를 결합하면 메일 운영의 첫 단계를 만들 수 있다는 점에 있다. 다음 단계는 Apps Script 트리거를 안정적으로 유지하고, 수신 원문 보관, 중복 방지, 발신 본문 서명, 회신 안내를 더 정교하게 다듬는 것이다. 이후 25/587/993 포트 정책이 확보되면 Postfix와 Dovecot 같은 직접 메일 서버로 확장할 수 있지만, 현재 운영 기준은 443 기반 웹 수신함과 Google 로그인 연동을 중심에 둔다.
Netcity의 메일서버는 그래서 한 번에 모든 포트를 여는 방식이 아니라, 웹으로 받을 수 있는 안전한 수신함부터 만들고, 그 위에 외부 발송과 계정 관리, 도메인 인증을 차례로 쌓아가는 방식의 구축기로 기록된다.