이번 글에서는 Spring Boot App에 SSL/HTTPS를 적용하는 방법에 대해 알아보도록 하겠습니다.
1. SSL/HTTPS
SSL/HTTPS 개념은 이 글에서 확인하시길 바랍니다. 😎
Spring Boot App에 SSL/HTTPS를 적용하기위해선 아래와 같은 절차를 수행하게 됩니다. 순서대로 살펴보겠습니다.
• Get SSL Certificate
• Modify application.yml
• Add ServletWebServerFactory as @Bean
1-1) get SSL certificate
저는 Self Signed SSL Certificate를 사용하겠습니다.
먼저 윈도우 기준으로 cmd 창을 관리자 권한으로 열어 jdk의 bin directory로 이동합니다. 다음으로 아래의 명령어를 입력해 SSL Certificate를 생성합니다.
.\keytool -genkey -alias bootsecurity -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore bootsecurity.p12 -validity 3650
사용된 변수는 각자 환경에 맞게 변경해 사용하시면 됩니다.
입력을 완료하면 아래와 같이 bin directory에 SSL Certificate가 생성된 것을 확인할 수 있습니다.
다음으로 생성된 SSL Certificate를 Spring Boot App의 resource에 복사합니다.
1-2) modify application.yml
이제 위에서 생성한 SSL Certificate 정보를 application.yml에 입력하겠습니다.
application.yml에 아래의 내용을 추가해줍니다.
application.yml
server:
port: 443
ssl:
enabled: true
key-store: src/main/resources/bootsecurity.p12
key-store-password: [password]
key-store-type: PKCS12
key-alias: bootsecurity
위의 password에는 각자 key 생성시 사용한 비밀번호를 입력하면 됩니다.
1-3) add ServletWebServerFactory as @Bean
마지막으로 ServletWebServerFactory를 생성하도록 하겠습니다.
간단히 main application에 @Bean을 작성하도록 하겠습니다. 내용은 아래와 같습니다.
SecurityApplication
@SpringBootApplication
public class SecurityApplication {
public static void main(String[] args) {
SpringApplication.run(SecurityApplication.class, args);
}
@Bean
public ServletWebServerFactory servletContainer() {
// Enable SSL Trafic
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory() {
@Override
protected void postProcessContext(Context context) {
SecurityConstraint securityConstraint = new SecurityConstraint();
securityConstraint.setUserConstraint("CONFIDENTIAL");
SecurityCollection collection = new SecurityCollection();
collection.addPattern("/*");
securityConstraint.addCollection(collection);
context.addConstraint(securityConstraint);
}
};
// Add HTTP to HTTPS redirect
tomcat.addAdditionalTomcatConnectors(httpToHttpsRedirectConnector());
return tomcat;
}
/*
We need to redirect from HTTP to HTTPS. Without SSL, this application used
port 8082. With SSL it will use port 8443. So, any request for 8082 needs to be
redirected to HTTPS on 8443.
*/
private Connector httpToHttpsRedirectConnector() {
Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
connector.setScheme("http");
connector.setPort(8080);
connector.setSecure(false);
connector.setRedirectPort(443);
return connector;
}
}
• ServletWebServerFactory @Bean을 선언해 SSL Traffic을 open 합니다.
• httpToHttpsRedirectConnector을 생성해 8080(HTTP)의 request를 443(HTTPS)로 redirect 합니다.
2. Test
이제 어플리케이션을 실행시켜보겠습니다. 😎
실행후 https로 접근하면 위와 같이 정상적으로 접근하는 것을 확인할 수 있습니다.
현재 'Not secure' 경고가 발생하는 이유는 Self Signed SSL Certificate를 사용했기 때문입니다. 실제 운영환경에서 사용하는 정식 SSL Certificate를 사용할 경우 위의 경고는 없어지게 됩니다.
이로써 간단히 spring boot app에 SSL/HTTPS를 적용할 수 있게 되었습니다. 👏👏👏
참고 자료 : https://www.youtube.com/playlist?list=PLVApX3evDwJ1d0lKKHssPQvzv2Ao3e__Q
추천서적
파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음
'Spring > Security' 카테고리의 다른 글
[Spring Security] Form Authentication - Spring Boot (7) (0) | 2020.09.08 |
---|---|
[Spring Security] Database Authentication - Spring Boot (6) (0) | 2020.09.08 |
[Spring Security] Authority Based Authorization - Spring Boot (4) (0) | 2020.09.08 |
[Spring Security] Role Based Authorization - Spring Boot (3) (0) | 2020.09.08 |
[Spring Security] HTTP Basic Authentication - Spring Boot (2) (0) | 2020.09.08 |