[Spring Security] Spring Boot를 이용한 SSL/HTTPS 적용하기

dev-log·2021년 10월 4일
4

Spring Security

목록 보기
5/6
post-custom-banner

Spring Boot App에 SSL/HTTPS를 적용하는 방법에 대해 알아보도록 한다.

1. SSL/HTTPS

SSL/HTTPS에 대한 이론적인 내용은 여기에서 확인할 수 있다.

Spring Boot App에 SSL/HTTPS를 적용하기 위해서는 아래와 같은 절차를 거쳐야 한다.

  1. SSL 인증서 얻기
  2. application.yml 수정하기
  3. ServletWebServerFactory을 @Bean으로 등록하기

1-1) SSL 인증서 얻기

실제로 배포하는 app은 정식 인증을 받은 SSL 인증서를 사용하지만 여기서는 Self Signed SSL 인증서를 사용한다.

self-signed SSL 인증서의 대표적인 종류 2가지 

* JKS (JAVA KeyStore)의 줄임말로 PKCS12와 비슷하지만 JAVA환경에서만 사용이 가능하다.

* PKCS12 (Public Key Cryptograhic Standards)의 줄임말로 패스워드로 보호된 형식으로써, 여러 인증서 및 키를 포함할 수 있다. Java뿐만 아니라 여러 플랫폼에서 사용 가능하다.

PKCS12를 생성하는 명령어는 java의 keytool을 이용하는 것이므로, OS의 제약을 받지 않는다.
윈도우와 Linux모두 아래 명렁어를 사용해 키스토어를 생성할 수 있다.

PKC12생성하기

keytool -genkeypair -alias bootsecurity -keyalg RSA -keysize 2048 -storetype PKCS12 -keystore bootsecurity.p12 -validity 3650
  • alias : 파일 별칭으로 자신이 원하는 이름으로 하면된다.
  • keyalg : 키 알고리즘을 RSA로 설정한다.
  • keystore : 개인키 파일

위의 명령어를 입력한 후 비밀번호를 입력하면 되고 이후에 묻는 정보는 각자 정보에 맞게 대답하고 마지막 확인하는 질문에 yes를 입력하면 keystore 생성이 완료된다.

생성된 SSL인증서를 spring boot 프로젝트의 resources 하위에 두면된다.

1-2) application.yml 수정하기

이제 위에서 생성한 SSL 인증서 정보를 application.yml에 입력한다.

application.yml

server:
  port: 443
  ssl:
    enabled: true
    key-store: src/main/resources/bootsecurity.p12
    key-store-password: 
    key-store-type: PKCS12
    key-alias: bootsecurity

1-3) ServletWebServerFactory을 @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. 실행화면


정식 인증을 받은 SSL 인증서를 사용하지 않고 Self Signed SSL 인증서를 사용했기 때문에 연결이 차단된다. 나중에 정식 인증을 받은 SSL 인증서를 사용하면 이 문제가 해결된다.

지금은 설정 -> 개인정보 및 보안 -> 인증서관리에 들어가서 자신이 등록한 self SSL 인증서를 항상 신뢰함으로 체크해주면 된다.

인증서를 등록해주면 localhost(안전하지 않음)으로 이동 버튼이 나온다. 이걸 눌러서 접속해주면 된다.

https로 정상적으로 접속한 화면이다.

Reference

https://minholee93.tistory.com/entry/Spring-Security-Enable-SSLHTTPS-Spring-Boot-5?category=924032
https://galid1.tistory.com/604

profile
배운 걸 기록하는 곳입니다.
post-custom-banner

1개의 댓글

comment-user-thumbnail
2024년 7월 27일

PKC12 생성하기는 어떻게 하는지 몰라 해맸었지만 이후에 도움이 많이 되었습니다 감사합니다

답글 달기