[AWS] 배포한 스프링 부트 3 게시판 HTTPS 전환

목차

앞선 글에서 AWS EC2에 스프링 부트 3 게시판을 배포했다. 그런데 지금 상태로는 EC2 인스턴스의 IP에 :8080을 붙여야만 접속할 수 있는 불완전한 형태다. 이 글에서는 AWS에 배포한 게시판을 Nginx 리버스 프록시로 80번 포트에 연결하고, 도메인과 Let’s Encrypt 인증서를 적용해 HTTPS로 전환하는 과정을 정리한다.

일반적인 웹 사이트는 HTTP/HTTPS로 접속하며, 정상적인 서비스는 통신을 암호화하는 HTTPS로 접속한다.

HTTP와 HTTPS 비교

HTTP/HTTPS의 개념은 Cloudflare의 설명 문서를 참고하자.

Nginx로 80번 포트 웹 서비스 운영하기

Nginx(엔진엑스)나 Apache(아파치) 같은 웹 서버를 앞단에 두고, 80번 포트로 들어온 요청을 8080 포트의 스프링 부트로 전달(리버스 프록시)하려고 한다. Nginx는 높은 성능을 위해 개발된 웹 서버로 설정이 간단하고 쉽게 사용할 수 있다.

EC2에 SSH로 접속해서 루트 권한으로 Nginx를 설치한다.

sudo apt install nginx
cd /etc/nginx/sites-available/

SBB 서비스의 Nginx 설정 파일을 루트 권한으로 생성한다.

/etc/nginx/sites-available$ sudo vi sbb

sbb 파일의 내용을 다음과 같이 작성한다.

server {
    listen 80;
    server_name localhost;
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }
}

작성한 sbb 파일을 Nginx가 설정 파일로 읽을 수 있도록 /etc/nginx/sites-enabled 디렉터리에 심볼릭 링크를 건다.

sudo ln -s /etc/nginx/sites-available/sbb /etc/nginx/sites-enabled/sbb

/etc/nginx/sites-enabled$ ls
sbb

Nginx를 재시작해서 변경 사항을 적용한다.

sudo systemctl restart nginx

이제 :8080을 빼고 웹 브라우저에서 AWS 고정 IP로 접속해 보자.

http://3.17.239.146

도메인 연결 및 HTTPS 전환

도메인 연결

웹 사이트를 HTTPS로 접속하게 하려면 우선 도메인이 필요하다. 그리고 통신을 암호화하기 위해 SSL/TLS 인증서도 발급받아야 하는데, 여기서는 무료 인증서 발급 도구인 Let’s Encrypt를 사용한다.

도메인은 가비아 등의 도메인 구매·발급 사이트에서 받을 수 있다. 필자는 내도메인.한국에서 무료로 도메인을 발급받았다. 도메인을 발급받고 AWS EC2 인스턴스의 퍼블릭 IP를 연결한다.

무료 도메인에 AWS EC2 퍼블릭 IP 연결

Nginx 설정 파일의 server_name을 발급받은 도메인으로 변경한다.

sudo vi /etc/nginx/sites-available/sbb

server {
    listen 80;
    server_name jshsbbproject.p-e.kr;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }
}

Nginx를 다시 시작한다.

sudo systemctl restart nginx

Let’s Encrypt로 HTTPS 전환

무료로 SSL 인증서를 발급해주는 Let’s Encrypt 서비스를 사용한다. 터미널에서 certbot과 python3-certbot-nginx를 설치한다.

sudo apt install certbot
sudo apt install python3-certbot-nginx

Nginx 웹 서버에서 사용할 Let’s Encrypt 인증서를 발급한다.

sudo certbot certonly --nginx
[이메일 주소 입력]
[엔터]

순서대로 내용을 입력하면 다음 위치에 인증서가 생성된다.

/etc/letsencrypt/live/[도메인명]/fullchain.pem
/etc/letsencrypt/live/[도메인명]/privkey.pem

이제 Nginx 설정에 SSL을 적용한다. 80번 포트로 들어온 HTTP 요청을 443번 포트의 HTTPS로 리다이렉트하고, 발급받은 인증서를 적용한다.

sudo vi /etc/nginx/sites-available/sbb

server {
    listen 80;
    server_name jshsbbproject.p-e.kr;
    rewrite ^ https://$server_name$request_uri? permanent;
}

server {
    listen 443 ssl;
    server_name jshsbbproject.p-e.kr;

    ssl_certificate     /etc/letsencrypt/live/jshsbbproject.p-e.kr/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/jshsbbproject.p-e.kr/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
    }
}

Nginx 설정을 바꿨으므로 다시 시작한다.

sudo systemctl restart nginx.service
스프링 부트 게시판 HTTPS 전환 성공

이제 브라우저에서 https://jshsbbproject.p-e.kr/ 주소로 접속할 수 있다. 이전에 표시되던 ‘주의 요함’ 경고가 사라지고, SSL 인증이 적용되었음을 의미하는 자물쇠 아이콘이 표시된다.

정리 및 다음 단계

Nginx 리버스 프록시로 8080 포트를 80번 포트에 연결하고, 도메인과 Let’s Encrypt 인증서로 HTTPS 전환까지 마쳤다. 이제 게시판은 도메인 기반의 안전한 HTTPS로 서비스된다.

다음 글에서는 개발용으로 쓰던 H2 DB를 운영용 DBMS인 PostgreSQL(AWS RDS)로 전환한다.

💬 댓글 0

💬 댓글을 남기려면?
첫 댓글을 남겨보세요 ✨

이 콘텐츠가 도움이 됐나요?

누스쿨 커뮤니티에서 더 많은 커리어 전략을 나눠요