
🤔 배포는 했는데.. 뭔가 아쉽지 않나요?
열심히 만든 Spring Boot 애플리케이션을 AWS나 GCP 같은 클라우드 VM에 배포하고 나면, 이런 주소를 받게 됩니다.
👉 http://123.45.67.89:8080
동작은 잘 하지만, 뭔가 진짜 서비스 같은 느낌이 안 듭니다. IP 주소 외우기도 힘들고, 접속하면 브라우저에 '주의 요함(안전하지 않음)'이라는 무시무시한 빨간 글씨가 뜨죠.
오늘은 Nginx(리버스 프록시)와 Let's Encrypt(무료 SSL 인증서)를 이용해 내 프로젝트에 멋진 커스텀 도메인을 연결하고, 안전한 HTTPS 초록색 자물쇠를 다는 방법을 정리해보겠습니다! 🚀

🤖 전체 아키텍처: 어떻게 연결될까?
우리가 구현할 통신 흐름은 다음과 같습니다.
[사용자]
↓ (1) https://my-domain.com 접속
[도메인 (DNS 레코드)]
↓ (2) 내 GCP VM의 외부 IP로 매핑
[Nginx (80 / 443 포트)]
↓ (3) Nginx가 요청을 받아 8080 포트로 토스 (Reverse Proxy)
[Spring Boot (8080 포트)]
핵심은 Nginx가 문지기 역할을 한다는 것입니다.
외부의 HTTP(80) / HTTPS(443) 요청을 대신 받아서
내부에 돌고 있는 Spring Boot(8080)로 안전하게 토스(Proxy)해줍니다.
Step 1. 도메인 구매 및 DNS A 레코드 설정
먼저 나만의 도메인이 필요합니다.
(저는 연습용으로 저렴한 .p-e.kr 도메인을 사용했습니다!)
글쓴이이 무료로 진행한 도메인 사이트 : 내도메인한국
- 도메인 구매처(가비아, Namecheap 등)에 접속
- DNS 관리(레코드 설정) 메뉴로 이동
- A 레코드를 추가하여 내 VM의 외부 IP를 등록합니다.
- 타입:
A/ 호스트:@(또는 비워둠) / 값:VM 외부 IP
💡 주의: 나중에
www.my-domain.com도 함께 쓰고 싶다면,
호스트 이름에www를 넣은 A 레코드를 하나 더 추가하셔야 합니다.
(이걸 안 해서 나중에 삽질(?)을 겪게 되는데, 글 후반부에 나옵니다!)
Step 2. Nginx 설치 및 리버스 프록시 설정
이제 서버(VM)에 접속하여 Nginx를 설치합니다.
sudo apt update
sudo apt install nginx -y
설치가 끝났으면, Spring Boot로 요청을 넘겨줄 Nginx 설정 파일을 만듭니다.
sudo nano /etc/nginx/sites-available/my-project
아래와 같이 proxy_pass를 설정합니다.
server {
listen 80;
server_name my-domain.com; # 본인 도메인 입력!
location / {
proxy_pass http://localhost:8080; # 내부 스프링부트로 전달!
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
설정을 저장한 뒤, 심볼릭 링크를 걸고 Nginx를 재시작합니다.
sudo ln -s /etc/nginx/sites-available/my-project /etc/nginx/sites-enabled/
sudo nginx -t # 구문 검사 (syntax is ok가 나오면 성공)
sudo systemctl reload nginx
이제 http://my-domain.com으로 접속하면 스프링부트 화면이 잘 뜹니다! 하지만 아직 '안전하지 않음' 상태죠.
Step 3. Certbot으로 무료 HTTPS 인증서 발급받기 🔒

드디어 자물쇠를 달 시간입니다!
Let's Encrypt에서 제공하는 무료 SSL 인증서를 발급받기 위해 Certbot을 설치합니다.
sudo apt install certbot python3-certbot-nginx -y
그리고 대망의 인증서 발급 명령어를 입력합니다.
sudo certbot --nginx -d my-domain.com -d www.my-domain.com
🚨 트러블슈팅: 다 된 밥에 NXDOMAIN 뿌리기?

저도 이 과정에서 예상치 못한 에러를 만났습니다.
DNS problem: NXDOMAIN looking up A for www.my-domain.com - check that a DNS record exists for this domain

알고 보니, 도메인 DNS 설정(Step 1)에서
www가 붙은 A 레코드를 추가하지 않았기 때문이었습니다.
Certbot은 명령어에 적힌 도메인들의 소유권을 깐깐하게 모두 확인하는데
존재하지 않는 서브도메인을 검증하려니 에러를 뱉은 것이죠.
✅ 해결 방법:
정말 간단합니다. 굳이 www가 필요 없다면, 실제 연결된 메인 도메인 하나만 요청하면 됩니다!
sudo certbot --nginx -d my-domain.com
이메일을 입력하고 약관에 동의(Y)하면 발급이 진행됩니다. 성공하면 화면에 기분 좋은 폭죽 메시지가 뜹니다! 🎉
Congratulations! You have successfully enabled HTTPS on https://my-domain.com



Step 4. Nginx 설정 마법과 자동 갱신
Certbot이 대단한 이유는 인증서 발급만 해주는 게 아니라는 점입니다.

아까 우리가 만들었던 Nginx 설정파일(/etc/nginx/sites-available/my-project)을
열어보면 Certbot이 알아서 내용을 변경(마개조?!)해 놓은 것을 볼 수 있습니다.
- 포트
443(HTTPS) 리스너 추가 - SSL 인증서 파일 경로 매핑
http://접속 시 →https://로 자동 리디렉션 처리!
게다가 Let's Encrypt 인증서는 90일 만기인데
Certbot이 서버 백그라운드 스케줄러(cron)에 자동 갱신 작업까지 알아서 등록해 줍니다.
앞으로 갱신 걱정도 끝! 😎
🎉 마무리
이제 브라우저 주소창에 내 멋진 도메인을 입력해 봅니다.
주소창 옆에 초록색 🔒 자물쇠 아이콘이 빛나는 걸 보니
이제야 진짜 서비스를 런칭한 기분이 듭니다!

더 이상 http://아이피:8080 알려주면서
"조금 조잡해 보여도 돌아가긴 해.." 라고 변명하지 않아도 됩니다.
여러분의 소중한 사이드 프로젝트에도 어서 예쁜 도메인과 자물쇠를 달아주세요!