본문 바로가기

아키텍처 Architecture/Software Architecture

Spring Boot HTTP, HTTPS 모두 사용하기 ( tomcat redirection )

0. 결론 요약

1) Spring Boot에 @Configuration 파일을 생성해 TomcatServletWebServerFactory의 설정을 변경 → 리다이렉션 적용

2) application.properties에 server.port=443, server.port.http=80 둘 다 명시

3) Docker 환경의 경우 추가설정 : docker-compose.yml에 port 2개 다 명시 80:80, 443:443

 

- Docker 사용 유무와 상관없이 적용 가능. 

- 스프링부트 내장 tomcat의 옵션을 조정하는 방법

 

1. 문제상황

SSL 적용으로 HTTPS 접속이 가능해졌으나 HTTP로 접속한 사용자들은 접속이 안되는 상황.

* HTTPS 적용 방법 : https://subbak2.tistory.com/110

 

SpringBoot 무료 SSL 인증서 적용하기 (Certbot)

1. 필요성 SSL 인증서 없이 웹 어플리케이션을 서버에 올리면 http로 접속이 되고 아래와 같은 경고가 나타난다. "주의요함" 클릭해보면 보안이 취약하다는 문구가 뜨는게 내가 만들었지만 들어가

subbak2.tistory.com

 

 

2. 시행착오 (실패한 방법)

실패했던 방법이지만 비슷한 시행착오를 겪을 수 있으니 기록.

 

* Docker의 port 설정을 이용하면 되지 않을까?

  → docker-compose.yml에서 ports 부분에 80:443, 443:443 으로 설정 

      → 실패

HTTP로 접속했을때  

Bad Request This Combination of host and port requires TLS. 라는 문구가 뜨며 실패한다.

 

 

3. 스프링부트 embeded tomcat을 활용하는 방법 

1) application.properties에 http, https 포트를 모두 사용한다.

server.port=443
server.port.http=80

 

2) Configuration 파일을 아래처럼 작성한다.

import org.apache.catalina.Context;
import org.apache.catalina.connector.Connector;
import org.apache.tomcat.util.descriptor.web.SecurityCollection;
import org.apache.tomcat.util.descriptor.web.SecurityConstraint;
import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.servlet.server.ServletWebServerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class ConnectorConfig {
	
	 @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("/*");
	                securityConstraint.addCollection(collection);
	                context.addConstraint(securityConstraint);
	            }
	        };
	        tomcat.addAdditionalTomcatConnectors(createSslConnector());
	        return tomcat;
	    }

	    private Connector createSslConnector() {
	        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
	        connector.setScheme("http");
	        connector.setSecure(false);
	        connector.setPort(80);
	        connector.setRedirectPort(443);
	        return connector;
	    }
}

 

3) 브라우저 개발자도구에서 302 Redirect를 통한 https 접속 확인 ( URL : http → https ) 

 

4) Docker를 활용할 경우 아래와 같이 docker-compose.yml에 작성했다. 

* docker-compose.yml
ports:
      - 80:80
      - 443:443