본문 바로가기
web/SpringBoot

HTTPS(SSL) 적용

by 뽀리님 2023. 9. 11.

http 가 아닌 https 통신을 하기위해 로컬에 SSL 적용하는 법을 정리했다.

일반적인 정보는 Http로 통신해도 상관이 없지만, 개인정보나 ID/PW 같은 민감한 정보는 암호화를 통해 통신을 해야하기에 SSL을 적용해보고자 한다.

이것만 봐도 왜써야 하는지 알 수 있다.

 

 

Java에는 릴리스에 keytool 유틸리티가 포함되어 있으므로 굳이 따로 설치할 필요는 없다.

아래 명령어를 이용하여 만들자

keytool -genkey -alias bmex-ssl -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore bmaxkeystore.p12 -validity 3650

 

  • -alias bmex-ssl : alias 를 bmex-ssl 로 지정 
  • -keystore bmaxkeystore.p12 : 키스토어를 bmaxkeystore.p12 로 지정

 

물어보는대로 잘 입력해준다.

생성되면 프로젝트 폴더에 키스토어가 생긴다.

 

application.properties 에 SSL 설정을 해준다

 

# SSL Config
server.http.port=8080
server.port=8443
server.ssl.enabled=true
server.ssl.key-store=bmaxkeystore.p12
server.ssl.key-store-password=000000
server.ssl.key-store-type=PKCS12
server.ssl.key-alias=bmex-ssl
security.require-ssl=true

 

설정 후 실행

 

아래와 같이 뜬다.

에러난다.

 

해당 포트(8080)는 이제 더이상 http 요청을 받지않도록 설정했기 때문이다.

하지만 나는 프로젝트에서 HTTP , HTTPS 요청 2개다 받고 싶다.

 

로컬에서 진행하므로 나는 내장된 톰캣의 설정을 변경하는 방법으로 가겠다.

 

 

1.  톰캣 커넥터 생성

@Bean
public ServletWebServerFactory servletContainer() {

    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(){
        @Override
        protected void postProcessContext(Context context) {
            SecurityConstraint securityConstraint = new SecurityConstraint();
            securityConstraint.setUserConstraint("CONFIDENTIAL");
            SecurityCollection collection = new SecurityCollection();
            //collection.addPattern("/*");
            collection.addPattern("/api/auth/*");
            securityConstraint.addCollection(collection);
            context.addConstraint(securityConstraint);
        }
    };
    tomcat.addAdditionalTomcatConnectors(createSslConnector());
    return tomcat;
}

private Connector createSslConnector() {
    Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
    connector.setScheme("http");
    connector.setSecure(false);
    connector.setPort(httpPort);
    connector.setRedirectPort(httpsPort);
    return connector;
}

모든 URL 에 Https 를 적용하고 싶다면 collection.addPattern 에 "/*" 를 추가하면 된다.

하지만 나는 로그인과 비밀번호 변경등 특정 URL 에만 Https 를 적용하고자 하기에 따로 설정하였다.

 

 

2. (생성 후 HTTPS 를 postman에서 테스트) setting option 에서 SSL인증 검증 체크를 꺼야 SSL Error를 보지 않는다.

 

 

 

 

3. (Swagger 에서 확인) 옵션 설정에서 서버 하나를 더 추가한다.

@OpenAPIDefinition(
        servers = {@Server(url = "${server.springdoc.httpURL}", description = "Default Server URL"),
                    @Server(url = "${server.springdoc.httpsURL}", description = "HTTPS Server URL") },

 

* CORS 설정을 통해 설정하는 방법도 있으나, 통신시에 그냥 Https  / Http 인지 유저가 구분만 해주면 되기에 딱히 설정하진 않았다.

 

-끝-

 

참고 : 

https://blog.wishket.com/http-vs-https-%EC%B0%A8%EC%9D%B4-%EC%95%8C%EB%A9%B4-%EC%82%AC%EC%9D%B4%ED%8A%B8%EC%9D%98-%EB%A0%88%EB%B2%A8%EC%9D%B4-%EB%B3%B4%EC%9D%B8%EB%8B%A4/

https://velog.io/@code12/Spring-Security-SSLHTTPS-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0

https://m.blog.naver.com/writer0713/221987570106

'web > SpringBoot' 카테고리의 다른 글

Properties 암호화하기  (0) 2023.10.12
HttpOnly + Secure Cookies 생성  (0) 2023.09.12
Maven VS Gradle  (0) 2023.09.07
ErrorContoller 오류처리  (0) 2023.09.06
Global Exception 처리  (0) 2023.09.06