티스토리 뷰
캡스톤 졸업 프로젝트를 진행하다가 AWS EC2를 활용해 스프링부트 애플리케이션을 배포하게 되었는데, 초기에는 HTTP 프로토콜을 통해 서비스를 제공했다. 그러나 HTTP는 암호화되지 않은 통신 방식으로, 사용자 데이터가 네트워크 상에서 쉽게 노출될 위험이 있었다. 이 때문에 HTTPS로 전환의 필요성을 느꼈고, 보안 강화를 위해 HTTPS를 적용하게 되었다.
0. HTTPS를 쓰는 것이 보안상 안전한 이유
HTTPS(HTTP Secure)는 HTTP에 SSL/TLS 암호화를 더한 프로토콜로, 클라이언트와 서버 간의 통신을 안전하게 보호한다. HTTP와 달리 HTTPS는 데이터를 암호화하여 네트워크 상에서 가로채거나 변경하는 것을 방지하며, 클라이언트가 접속하려는 서버의 신뢰성을 인증서를 통해 검증할 수 있다. 결과적으로 HTTPS는 데이터 유출, 중간자 공격, 피싱 공격 등 다양한 보안 위협으로부터 사용자를 보호하는 데 필수적인 역할을 한다.
1. 사전 준비
먼저, 당연하겠지만 AWS EC2 인스턴스가 생성된 환경을 전제로 진행하겠다.
AWS 콘솔로 들어가 EC2의 보안 그룹에서 80번(HTTP)과 443번(HTTPS) 포트를 허용해주었다.
2. 기본 환경 세팅
터미널로 ec2 인스턴스에 접속해준다.
- Java 설치
스프링부트 애플리케이션을 실행하려면 Java 런타임 환경이 필요하다. 나는 OpenJDK 17을 설치했다.
sudo apt update sudo apt install openjdk-17-jdk
- Nginx 설치
Nginx는 리버스 프록시 역할을 하며, HTTPS 설정에도 필수적인 요소이다.
sudo apt install nginx
- Certbot 설치
Certbot은 무료로 SSL 인증서를 발급받을 수 있는 도구이다. 아래 명령어로 설치해준다.
sudo snap install certbot --classic
3. 도메인 연결 및 DNS 설정
HTTPS 설정을 위해서는 도메인이 필요하다. 나는 무료 도메인 제공 사이트를 사용했다.
https://xn--220b31d95hq8o.xn--3e0b707e/
내도메인.한국 - 한글 무료 도메인 등록센터
한글 무료 도메인 내도메인.한국, 웹포워딩, DNS 등 무료 도메인 기능 제공
xn--220b31d95hq8o.xn--3e0b707e
원하는 도메인을 등록한 뒤 DNS 설정에서 AWS EC2 퍼블릭 IP를 연결해주었다. IP연결(A)의 예 부분에 EC2 퍼블릭 IP주소를 넣어주면 된다.
차례대로 설명해보자면,
- 도메인 검색 및 선택: 원하는 이름으로 검색하여 등록할 수 있는 도메인을 선택한다.
- DNS 설정: 도메인의 IP 주소를 AWS EC2의 퍼블릭 IP로 설정한다. AWS 관리 콘솔에서 EC2 인스턴스 요약을 확인해 퍼블릭 IP를 확인할 수 있다.
- 도메인 연결 확인: 브라우저에서 도메인 이름으로 EC2에 접속 가능한지 확인한다.
4. Nginx 설정 및 HTTPS 적용
다시 터미널로 돌아가
- Nginx 설정 파일 수정
Nginx 설정 파일을 열어 도메인과 프록시 설정을 추가한다.
sudo vim /etc/nginx/sites-available/default
주요 수정 사항
1. server_name 뒷 부분을 방금 등록해준 도메인 이름으로 변경해주었다.
사용자가 브라우저에 입력한 도메인 이름이 server_name에 설정된 값과 일치해야 Nginx가 해당 요청을 처리해주기 때문이다.
2. 스프링부트 애플리케이션 포트를 프록시로 설정해주었다.
Nginx는 클라이언트의 요청을 백엔드 서버로 전달하는 리버스 프록시 역할을 한다.
더 자세히 설명해보자면,
- Nginx는 HTTP/HTTPS 요청을 수신하며, 실제로 애플리케이션은 EC2 내에서 포트 8080에서 실행 중이다.
- 클라이언트는 스프링부트 애플리케이션의 내부 포트(8080)에 직접 접근할 수 없기 때문에, Nginx가 요청을 받아 8080 포트로 전달(proxy_pass)한다.
이를 통해 다음과 같은 장점을 얻을 수 있다.
- 보안 강화: Nginx가 외부와 내부 애플리케이션 사이에 방화벽 역할을 해주기 때문이다!
- HTTPS 처리: Nginx는 HTTPS 요청을 처리하고, 스프링부트는 HTTP만 처리하도록 간소화할 수 있다.
- 부하 분산: Nginx는 여러 백엔드 서버로 요청을 분산할 수 있다.
Certbot을 이용한 HTTPS 설정
Certbot을 실행하여 SSL 인증서를 발급받고, Nginx에 적용해준다.
sudo certbot --nginx
이 명령어를 실행하면 여러가지 질문이 나올텐데, 질문에 따라 이메일 입력 및 약관 동의를 진행하고, 도메인을 선택하면 인증서가 발급된다.
Nginx 재시작
설정을 저장하고 Nginx를 재시작합니다.
sudo service nginx restart
Nginx 설정 파일을 변경한 뒤에는 반드시 Nginx를 다시 시작하거나 재로드해야 변경 사항이 적용된다.
프로젝트를 진행하다 보면 설정을 다 바꿔준 후에 nginx restart를 까먹어 고생을 몇 번 한 경험이 있는데...^^ 까먹지 않고 해야겠다!
5. 성공
바꾼 도메인으로 요청이 잘 되는 것을 확인할 수 있다!
'Spring' 카테고리의 다른 글
[Elasticsearch 적용기] #2 Elasticsearch 검색 정확도 높이기: Nori와 Edge n-gram을 활용한 검색 최적화 (0) | 2025.03.14 |
---|---|
[Elasticsearch 적용기] #1 Spring에서 Elasticsearch로 검색 성능 최적화하기 (1) | 2025.02.18 |
[SPRING] Spring Data JPA로 동적 쿼리와 페이징 최적화하기: Specification과 @EntityGraph 활용 (0) | 2024.11.05 |
[SPRING] Hibernate 지연 로딩으로 인한 JSON 직렬화 오류 해결하기 (0) | 2024.06.07 |
[SPRING] 로깅에 AOP 적용해보기 (3) | 2024.06.01 |
- Total
- Today
- Yesterday
- SQL
- SQL 레벨업
- 준영속
- 자바 스프링
- JPA
- elasticsearch
- 로깅
- 다이나믹 프로그래밍
- 커뮤니티
- 프론트엔드
- 인텔리제이
- 스프링
- 백준 파이썬
- SQLD
- 자바
- 파이썬
- DP
- 스프링 커뮤니티
- 웹 MVC
- 북마크
- 로그아웃
- 영속
- 비영속
- EnumType.ORDINAL
- 스프링부트
- 회원탈퇴
- 지연로딩
- 스프링 북마크
- 웹MVC
- 백준
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |