[Spring Security] Enable SSL/HTTPS - Spring Boot (5)

반응형

이번 글에서는 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


추천서적

 

스프링5 레시피:스프링 애플리케이션 개발에 유용한 161가지 문제 해결 기법

COUPANG

www.coupang.com

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음


반응형

댓글

Designed by JB FACTORY