복붙노트

[SPRING] 스프링 부트로 자동으로 https로 리디렉션하는 방법

SPRING

스프링 부트로 자동으로 https로 리디렉션하는 방법

http 트래픽을 모두 https로 리디렉션하도록 임베디드 tomcat 서버를 쉽게 구성 할 수 있습니까? 탄성 부트 밸런서 뒤에있는 ec2 인스턴스에서 실행되는 스프링 부트를 가지고 있습니다. 나에게 ssl을 처리하도록 ELB를 구성했다. (멋진데) X-FORWARDED-PROTO 헤더를 "https"로 설정한다. 나는 그것이 설정되지 않았을 때를 감지하고 사용자가 아직 https를 사용하지 않도록 강제로 리디렉션합니다.

지금까지, 나는 행운과 함께 내 application.properties 파일에 다음을 추가하려고 시도했다.

server.tomcat.protocol-header=x-forwarded-proto
security.require-ssl=true

해결법

  1. ==============================

    1.내 답변은 조금 늦었지만 최근에는이 문제가있어서 나를 위해 일한 솔루션을 게시하고 싶습니다.

    내 답변은 조금 늦었지만 최근에는이 문제가있어서 나를 위해 일한 솔루션을 게시하고 싶습니다.

    원래 Tomcat을 X-Forwarded 헤더를 사용하도록 설정하는 것으로 충분할 것이라고 생각했지만 Tomcat의 RemoteIPValue는 정상적으로이 케이스를 처리해야합니다.

    내 솔루션은 EmbeddedServletContainerCustomizer를 추가하고 ConnectorCustomizer를 추가하는 것이 었습니다. (여기서 나는 Tomcat 8을 사용하고있다)

        @Component
    public class TomcatContainerCustomizer implements EmbeddedServletContainerCustomizer {
    
        private static final Logger LOGGER = LoggerFactory.getLogger(TomcatContainerCustomizer.class);
    
        @Override
        public void customize(final ConfigurableEmbeddedServletContainer container) {
            if (container instanceof TomcatEmbeddedServletContainerFactory) {
                    final TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
                    tomcat.addConnectorCustomizers(connector -> { 
                        connector.setScheme("https");
                        connector.setProxyPort(443);
                    });
                    LOGGER.info("Enabled secure scheme (https).");
            } else {
                LOGGER.warn("Could not change protocol scheme because Tomcat is not used as servlet container.");
            }
        }
    }
    

    중요한 점은 Scheme을 https로 설정할뿐만 아니라 Spring Boot의 모든 내부 리다이렉션을 포트 80으로 라우팅하지 않은 ProxyPort를 설정한다는 것입니다.

    희망은 도움이 :-)

  2. ==============================

    2.기본 인증을 사용하지 않으면 (최소한 Spring Boot의 이전 버전에서는) 구성 등록 정보 security.require-ssl이 작동하지 않습니다. 따라서 다음과 비슷한 코드를 사용하여 수동으로 모든 요청을 보호해야합니다.

    기본 인증을 사용하지 않으면 (최소한 Spring Boot의 이전 버전에서는) 구성 등록 정보 security.require-ssl이 작동하지 않습니다. 따라서 다음과 비슷한 코드를 사용하여 수동으로 모든 요청을 보호해야합니다.

    @Configuration
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Inject private SecurityProperties securityProperties;
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            if (securityProperties.isRequireSsl()) http.requiresChannel().anyRequest().requiresSecure();
        }
    }
    

    내 대답은 여기에서 확인할 수 있습니다 : Spring Boot from HTTP to HTTPS

  3. ==============================

    3.키 저장소 파일과 몇 개의 구성 클래스가 필요합니다.

    키 저장소 파일과 몇 개의 구성 클래스가 필요합니다.

    아래 링크에서 자세히 설명합니다.

    임베디드 바람둥이에 대한 Https

  4. ==============================

    4.HTTP의 https에 대한 Spring Boot 2.0 리디렉션 :

    HTTP의 https에 대한 Spring Boot 2.0 리디렉션 :

    @Configuration에 다음을 추가하십시오.

       @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(redirectConnector());
            return tomcat;
        }
    
        private Connector redirectConnector() {
            Connector connector = new Connector(
                    TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
            connector.setScheme("http");
            connector.setPort(8080);
            connector.setSecure(false);
            connector.setRedirectPort(8443);
            return connector;
        }
    
  5. from https://stackoverflow.com/questions/22625699/how-to-redirect-automatically-to-https-with-spring-boot by cc-by-sa and MIT license