🖥️ 실무 : IP:8080은 이제 그만! 내 Spring Boot 프로젝트에 도메인과 HTTPS(무료) 자물쇠 달아주기🔒

공부하는 개발자

about 오늘도 뚝딱🔨 뚝딱 하는 주니어 개발자👩🏻‍💻

북마크

고정글

최근 글

🖥️ 실무 : IP:8080은 이제 그만! 내 Spring Boot 프로젝트에 도메인과 HTTPS(무료) 자물쇠 달아주기🔒

category 🖥️ DevOpѕ
date
read
반응형

 

 

 

 

 

🤔 배포는 했는데.. 뭔가 아쉽지 않나요?

열심히 만든 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 도메인을 사용했습니다!)

글쓴이이 무료로 진행한 도메인 사이트 : 내도메인한국

  1. 도메인 구매처(가비아, Namecheap 등)에 접속
  2. DNS 관리(레코드 설정) 메뉴로 이동
  3. 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이 알아서 내용을 변경(마개조?!)해 놓은 것을 볼 수 있습니다.

 

 

  1. 포트 443 (HTTPS) 리스너 추가
  2. SSL 인증서 파일 경로 매핑
  3. http:// 접속 시 → https:// 로 자동 리디렉션 처리!

 

 

게다가 Let's Encrypt 인증서는 90일 만기인데

Certbot이 서버 백그라운드 스케줄러(cron)에 자동 갱신 작업까지 알아서 등록해 줍니다.

앞으로 갱신 걱정도 끝! 😎

 

 

 

 

 

 

 


 

 

 

 

 

 

 

🎉 마무리

이제 브라우저 주소창에 내 멋진 도메인을 입력해 봅니다.

주소창 옆에 초록색 🔒 자물쇠 아이콘이 빛나는 걸 보니

이제야 진짜 서비스를 런칭한 기분이 듭니다!

 

 

 

더 이상 http://아이피:8080 알려주면서

"조금 조잡해 보여도 돌아가긴 해.." 라고 변명하지 않아도 됩니다.

여러분의 소중한 사이드 프로젝트에도 어서 예쁜 도메인과 자물쇠를 달아주세요!

 

 

반응형