오늘은 SpringBoot 기반, 웹 어플리케이션에 SSL을 적용하는 방법에 대해 배워보도록 하겠다.
기본적으로 우리가 만드는 프로젝트는 별도의 ssl 적용을 하지 않는 이상 http://~로 시작하게 된다.
그렇다면 http와 https의 차이는 무엇일까?
- http: Hyper Text Transfer Trotocol
- https: Hyper Text Transfer Trotocol Secure
차이점은 위에 소개된 약자를 통해서도 알 수 있듯이 핵심은 Secure이다.
https는 기존 http 프로토콜에 데이터 암호화가 추가된 프로토콜이다.
https는 대칭키 암호화 or 비대칭키 암호화 방식을 통해 네트워크 상에서 중간에 제 3자가 정보를 볼 수 없도록 암호화를 지원한다.
http는 기본적으로 80 포트를 사용한다.
https는 기본적으로 443 포트를 사용한다.
우선, Spring Initializr를 통해 신규 프로젝트를 하나 생성한다.
- Spring Initialize 주소
https://start.spring.io
https로 ssl을 적용하기 위해선 keystore를 생성해야 한다.
이제부터 만들 keystore 파일이 해당 웹사이트의 보안을 책임질 중요한 부분이라고 볼 수 있다.
아래 명령어를 본인이 만든 프로젝트의 root경로에서 실행시킨다.
keytool -genkey -alias spring -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 4000
만약 정상적으로 명령어가 실행되었다면 위와 같이 패스워드를 입력하라는 창이 뜰 것이다.
우리는 개인적으로 사용할 부분이기 때문에 패스워드만 정확히 기억하고 있으면 된다.
위와 같이 입력한 후, 마지막에 yes를 입력해주면 keystore.p12가 현재 경로에서 생성된 것을 확인할 수 있다.
이제 springboot 프로젝트에서 현재 만들어진 keystore를 인식할 수 있도록 바꿔주기만 하면 된다.
server.port: 8084 // 개인적으로 포트를 8084로 바꿔줌 (ssl과 무관)
server.ssl.key-store:keystore.p12
server.ssl.key-store-type=PKCS12
server.ssl.key-store-password=qwerty1!
- server.ssl.key-store: keystore.p12가 위치한 경로 (default: 현재 프로젝트 root)
- server.ssl.key-store-type: keystore의 storetype
우리는 앞선 명령어에서keytool ~ -storetype PKCS12 ~
로 설정했기 때문에 PKCS12로 잡아준다.- server.ssl.key-store-password: 앞서 설정한 keystore password
이제 ssl을 적용하기 위한 모든 준비가 끝났다.
서버 재기동을 통해 확인해보자.
IF) http://localhost:8084 로 접근하는 경우
위와 같이 이제 본 프로젝트는 https를 기반으로 움직이기 때문에 http로 접근하면 Bad Request 문구가 뜨며 접근이 불가하다.
IF) https://localhost:8084 로 접근하는 경우
최초 해당 경로로 접근하는 경우, 보안관련 어쩌구 저쩌구 문구가 뜨는 경우가 발생한다.
이는 우리가 만든 keystore가 약식으로 만들어진 것이기 때문에 경고가 뜨는 것이라고 이해하면 된다.
무시하고 페이지를 열면 위와 같이 SpringBoot를 실행했을 때, 첫 페이지가 뜨는 것을 확인할 수 있을 것이다.