Backend Dev./Project Impl

Spring Boot 개발노트: 프로젝트 HTTPS 적용 2편

문괜 2023. 12. 14. 10:00
반응형

Spring Boot 개발 노트 : 프로젝트 HTTPS 적용 1

 

Spring Boot 개발 노트 : 프로젝트 HTTPS 적용 1

Spring Boot의 경우 8080번 Port를 사용하고 React 같은 경우 3000번 Port를 사용한다. HTTP의 경우 80번 Port를 사용하고 SSH의 경우 22번 포트를 사용한다. 그러면 HTTPS의 경우 몇 번 Port를 사용할까? 그리고 여

youcanbeable.tistory.com

도대체 Nginx는 뭘까요?

 

도대체 Nginx는 뭘까요?

HTTPS를 적용하기 위해서 그리고 웬만한 Backend 개발에 있어 Nginx는 한 번쯤은 무조건 들어봤을 것이다. 추가적으로 WAS, Web Server와 HTTPS관련해서 무조건 들어봤을 것이다. 그러면 도대체 WAS, Web Server

youcanbeable.tistory.com

 

이 두 글을 바탕으로 이제 본격적인 HTTPS 적용에 들어갈 예정이다.

 

두 글의 핵심은 아래와 같다.

  1. 암호화를 진행할 단독적인 서버가 필요하다
    • 이 서버는 암호화를 진행해야 한다.
    • 암호화된 요청들의 전용 포트에서 요청을 처리해 주는 프로젝트의 포트로 전환을 해줘야 한다.
  2. 서버 내에서 요청에 대한 암호화를 진행할 장치가 필요하다.

그래서 1번을 위해 우리는 Nginx를 사용하고 2번을 이용해 Cerbot을 활용한 SSL/TLS인증서를 Nginx 웹서버에 설치할 것이다.

 

그러면 우리가 시작하기 전 필요한 것들은 아래와 같다.

  1. Nginx
  2. 도메인주소
  3. EC2서버(Server Instance: 프로젝트가 돌아가고 있는 서버)
  4. Certbot SSL/TLS Certificate 설치를 위한

 

EC2에 Nginx 설치

먼저 EC2에 들어간다.(이걸 모르리라고 생각하지는 않는다.)

그다음 아래의 명령어로 EC2에 nginx를 설치한다.

# 자주 해주면 좋은 Update 명령어다. EC2 서버를 최신화 해준다.
sudo apt update
# nginx 설치
sudo apt install nginx
# nginx 설치 확인 
nginx -v 
# nginx version: nginx/1.18.0 (Ubuntu) 이런식으로 나온다.

 

* 여기서 추가적으로 말하자면 Shell 명령어에서 sudo가 있고 없고의 차이가 크다. sudo는 최상위 명령어로 정말 컴퓨터가 문제가 되지 않는 다면 무조건 실행하게 만들어준다. 그래서 추가적인 팁을 쓰자면 정말 수정할게 아니라면 sudo 없이 쓰는 게 좋다. 만약 수정을 해야 하고 설치를 해야 한다면 EC2 환경에서 sudo가 필요하지만 EC2 환경에서는 우리가 사용하는 로컬과는 다르게 하나의 변경 사항도 찾기가 어렵기 때문에 sudo 없이 READ ONLY모드를 사용하는 걸 추천한다. 물론 수정해야 하면 sudo를 꼭 붙여야 한다. READ ONLY 모드나 수정한 걸 취소한 채로 나가고 싶으면 ESC + : + q! 순서대로 눌러주면 된다.

 

그다음 아래의 순서로 우리가 설치한 nginx의 설정을 수정해줘야 한다. 

# nginx 설정 디렉토리로 이동
cd /etc/nginx/conf.d 
# default.conf에 nginx설정 추가 수정해야하니 sudo를 붙친다.
sudo vim default.conf

 

그리고 아래와 같은 내용으로 입력해 주면 된다.

server {
    listen 80;
    server_name yourdomain.com;

    location / {
        proxy_pass http://yourdomainIP: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;
    }
}

 

위에서부터 설명을 하자면 

listen 80: 80번으로 들어오는 요청을 들어라

server_name (yourdomain.com 우리가 구매한 도매인으로 설정한다.): yourdomain.com으로 들어오는

location /  : yourdomain.com/ 으로 시작하는 모든 요청 이안의 내용으로 들어간다.

  • proxy_pass http://yourdomainIP:8080 : yourdomain.com/ 으로 시작하는 모든 요청을 8080으로 보내라.
  • 밑의 내용은 지금 굳이 알 필요 없다

그러면 위의 내용을 이번 프로젝트에서 사용한 willyouback.shop을 예로 설명해 보겠다. 

server_name은 willyouback.shop이다.

그리고 willyouback.shop/ 으로 시작하는 모든 요청은 http://14.14.15.165:8080으로 돌린다.

 

그럼 위의 내용을 기반으로 직접 작성해 보면 아래와 같이 된다.

server {
    listen 80;
    server_name willyouback.shop;
    
    location / {
    	proxy_pass http://43.201.10.115: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;
        proxy_set_header Connection '';
        proxy_http_version 1.1;
	}
}

 

 

Certbot으로 Nginx에 SSL/TLS 인증서 적용

위에서 언급했듯이 이제 Nginx를 설치했으니 SSL/TLS만 적용해 주면 끝난다.

 

아래의 링크를 따라 하면 끝이다.

Certbot Instructions

 

Certbot Instructions

Tagline

certbot.eff.org

 

영어로 돼있고 이상한 잡설명이 많으니 무시하고 아래와 같이 따라 하면 된다.

 

먼저 2개가 필요하다.

  1. Certbot을 설치하기 위한 snap
  2. 그리고 snap으로 설치한 Certbot

Snap 설치

snap은 간단히 설치 툴이라고 생각하면 된다.

# 기본적으로 항상 해주면 좋다.
sudo apt upodate
# 설치 명령어
sudo apt install snapd
# snap이 잘 작동하는지 hello-world를 설치해보자
sudo snap install hello-world
# Hello World!가 출려되면 된다.
hello-world

 

그리고 혹시나 하는 경우가 있으니 최신버전으로 바꾸어주자

sudo snap install core; sudo snap refresh core

 

Certbot 설치

기존 EC2 Ubuntu OS에서 가지고 있는 certbot을 삭제해줘야 한다. 그리고 새로운 certbot을 깔아주면 된다.

# 기존의 Cerbot삭제
sudo apt-get remove certbot
# 새로운 Certbot 추가
sudo snap install --classic certbot
# Certbot 명령어 작동 가능하게 만들기 
sudo ln -s /snap/bin/certbot /usr/bin/certbot

 

그다음 아래의 명령어를 입력하면 된다.

sudo certbot --nginx

 

이다음에는 간단하다.

먼저 이메일을 입력을 하라 하고 해당하는 도메인 주소를 입력하라고 한다. 그럼 아래와 같은 메시지가 뜬다.

Congratulations! You have successfully enabled https://example.com and https://www.example.com 

-------------------------------------------------------------------------------------
IMPORTANT NOTES: 

Congratulations! Your certificate and chain have been saved at: 
/etc/letsencrypt/live/example.com/fullchain.pem 
Your key file has been saved at: 
/etc/letsencrypt/live/example.com//privkey.pem
Your cert will expire on 2017-12-12.

 

90일의 https인증서가 발급된다. 추가적으로 재인증 없이는 90일 이후 인증서가 만료된다는 점을 알아야 한다. 그러니 추후에 재발급 혹은 자동 갱신 하는 방법을 올리겠다.

 

이렇게 만들어진 SSL/TLS인증서를 확인하기 위해서는 첫 번째로 

# 수정을 하지 않을 것이니 안전하게 sudo 없이 vi만
vi /etc/nginx/conf.d/default.conf

 

그다음 아래와 같이 #managed by Certbot으로 써져 있는 부분이 아래와 같으면 된 거다.

추가적으로 직접 인증서를 찾을 수 있는데 신경 쓰지 말자

자물쇠가 걸려있는 영롱한 URL을 볼 수 있으니 확인해 보자.

만약 돼 있지 않다면 간단하다. 

sudo systemctl restart nginx

 

위 명령어로 nginx를 재시작을 해준다.

그리고 EC2에 돌아가는  프로젝트를 다시 RUN 해줘야 한다.

 

참고자료

NGINX와 Certbot을 이용해 로드밸런싱과 https를 적용해 보자

 

NGINX와 Certbot을 이용해 로드밸런싱과 https를 적용해 보자

ec2 서버에서 NGINX와 Certbot을 이용해 https와 로드 밸런싱을 적용해 보자

velog.io

Let’s Encrypt 인증서로 NGINX SSL 설정하기

 

Let’s Encrypt 인증서로 NGINX SSL 설정하기

이 모범 사례에서는 Let’s Encrypt 클라이언트를 사용하여 인증서를 생성하는 방법과 이를 사용하도록 NGINX 오픈소스 및 NGINX Plus를 사용하여 nginx ssl 설정을 자동으로 구성하는 방법을 다룹니다.

nginxstore.com

 

 

* 항상 정확한 정보를 드리고 싶지만 실수가 있을 수도 있습니다! 

* 실수를 찾게 되거나 질문이 있으시면 댓글 달아주세요!!

반응형