공부/HTTP

HTTP ⁉ HTTPS ‼ HTTPS 개념과 NGINX, SPRING BOOT 어플리케이션 적용하기

jihyee 2022. 2. 22. 13:32

 

 

오늘 GDSC 10 min Tech seminar가 진행됐는데

 

 

주제가 HTTP와 HTTPS 였다.

 

 

예전에 이 문제로 사이트 배포를 다 해두고도 프로젝트 제출을 못했던 안타까운 경험이 있었기 때문에..,,

 

항상 정리해야지 해야지 했는데 이번 기회에 발표 내용도 정리하고 기록할 겸 포스팅을 올리려고 한다!

 

 

 

 

GDSC 10min 세션 링크 ↓

 

http와 https

목차 HTTP와 HTTPS의 개념 HTTPS의 특징 - ① 보안성 HTTPS의 특징 - ② 암호화 기술 HTTPS의 동작 과정 HTTP와 HTTPS의 개념 HTTP (Hypertext Transfer Protocol) 우리가 잘 알고 있는 http는 서로 다른 시스템들..

dsc-sookmyung.tistory.com

 

 

 

HTTPS 는 HTTP에서 secure, 보안이 강화된 프로토콜이라고 이해하면 된다.

 

 

계층 구조 위치

 

 

 

보안이 강화된

 

보안이 강화됐다는 것은 패킷이 암호화돼서 중간에 다른 사용자가 이를 가로채 악용할 가능성이 없다는 것을 의미하며

(이미지 참고!)

 


이런 이유로 믿을 수 있는 사이트임을 보장한다.

 

 

 

적용 방식 : 어떻게 secure 보안을 강화할까?

 

우선 웹 사이트 동작 과정을 보면

클라이언트 (사용자) ↔ 서버 (사이트) 가 각자 데이터를 주고받으며 상호작용한다.

 

하지만 이는 데이터가 암호화되어 있는지 사용자는 알 방법이 없다.

 

 

따라서 인증을 위한 제삼자를 둬야 한다.

 

제삼자? 제삼자가 왜 필요해?

 

 

 

예시를 들어 설명하면 나랑 민수는 서로 비밀 일기장을 교환하는 사이다.

근데 아무래도 일기장을 교환하는 중간중간에 철수가 우리의 일기장을 몰래 보는 것 같다 !!

나와 민수는 우리의 일기장을 지키기 위한 보안의 필요성을 느꼈고 머리를 굴렸다

 

그때 저 멀리 놀고 있는 영희가 눈에 띄었다. 

나는 영희에게 간식을 바치는 조건으로 일기장을 열 수 있는 열쇠를 좀 보관해달라고 부탁했다.

 

이후 나와 민수는 영희의 키를 이용해 일기장을 열어 공유했고

영희에게 받은 키가 없는 철수는 더 이상 우리의 일기장을 몰래 보는 것을 포기할 수밖에 없었다.

 

 

 

 

맞는 예시인지 모르겠지만 대칭키 비대칭키 제외하고 최대한 간단하게 과정을 설명하면 이와 같을 것 같다.

 

 

 

제삼자인 인증 기관(Let's Encrypt) → 영희

인증키 발급 (TTL/SSL 인증서) → 열쇠

사용자 → 나와 민수

 

 

 

 

 

 

원리는 여기까지고

nginx, java 각각의 적용 방식을 설명하면

 

 

 

※ 우선 무조건 도메인이 연결되어 있어야 한다.

❌ localhost 153.548.21.15 ❌

 

 

NGINX 기반 애플리케이션 HTTPS 적용

 

 

Cerbot 설치
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo add-apt-repository universe
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update

$ sudo apt-get install certbot python3-certbot-nginx

 

Nginx Configuration 설정
$ sudo vi /etc/nginx/sites-available/default

이 파일 내부에 server_name 에 HTTPS 로 적용하고 싶은 사이트의 도메인 주소를 넣어준다.

 

$ sudo nginx -t
// 파일 변경이 잘 적용되었는지 확인
$ sudo systemctl reload nginx
// nginx reload

 

SSL 인증서 받기
$ sudo certbot --nginx -d {적용할 도메인 주소} -d {www.적용할 도메인 주소}

아까 설치한 cerbot 을 사용해서 도메인을 위한 인증서를 받는다.

$ sudo service nginx restart

nginx 재실행

 

 

 

 

 

 

Spring Boot 기반 애플리케이션 HTTPS 적용

 

인증키 옮기기
$ sudo su
# cp -r /etc/letsencrypt/archive/[domain_name] /home/secure

아까 인증키 발급받았던 것을 스프링 부트에 적용하기 위해 home/secure 로 옮겨 준다.

 

파일 변환
# openssl pkcs12 -export -in fullchain2.pem -inkey privkey2.pem -out cert_and_key.p12 -name ttp -CAfile chain2.pem -caname root
# keytool -importkeystore -deststorepass [사용할 암호] -destkeypass [사용할 암호] -destkeystore [생성할 jks 파일명] -srckeystore cert_and_key.p12 -srcstoretype PKCS12 -srcstorepass [PKCS12에서 사용한 암호 (위에서 입력한 암호)]
keytool -importkeystore -deststorepass mymy -destkeypass mymy -destkeystore letsencrypt.jks -srckeystore cert_and_key.p12 -srcstoretype PKCS12 -srcstorepass password

 

Application.properties 추가
server.port=8080
server.ssl.enabled=true
server.ssl.key-store={키 파일 위치 ex) /home/secure/letsencrypt.jks}
server.ssl.key-store-password= {인증키 비밀번호}
server.ssl.key-password= {인증키 비밀번호}

 

 

 

끝~~

 

٩( ᐛ )و