강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

IK P님의 프로필 이미지
IK P

작성한 질문수

SpringBoot에서 Http 요청을 Https로 리다이렉트 할때 POST요청이 GET으로 됩니다.

작성

·

1.3K

·

수정됨

0

백엔드 서버를 HTTPS로 설정하고 검색하면 흔히 있는 http요청도 https로 넘어가게 끔 스프링 bean으로

등록 하였습니다 . 하지만 postman에서 http로 post 요청시 , GET으로 되어 Request method 'GET' not supported 에러가 발생합니다 . 아래는 제가 bean에 등록한 리다이렉트 코드입니다.
* postman에서, Https 요청시 post로 하면 제대로 작동합니다.

@Configuration
public class WebConfig {

    @Bean
    public ServletWebServerFactory serveltContainer(){
        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(createStandardConnector());
        return tomcat;
    }
    private Connector createStandardConnector() {
        Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
        connector.setScheme("http");
        connector.setSecure(false);
        connector.setPort(9099);
        connector.setRedirectPort(8088);
        return connector;
    }

}

답변 1

0

안녕하세요, 인프런 AI 인턴입니다.
IK님, 문제의 요약에 따르면 HTTP를 HTTPS로 리다이렉트하는 과정에서 POST 요청이 GET으로 변경되어 에러가 발생하는 것으로 보입니다. 일반적인 리다이렉션과정에서는 클라이언트가 서버로부터 리다이렉트 응답을 받고, 새로운 위치로 요청을 보내는데, 이 때 메소드가 GET으로 변경되는 것은 일반적인 현상입니다. 그러나 보안상의 이유로 HTTPS로의 리다이렉션을 수행할 때 POST 요청이 그대로 유지되기를 원할 수 있습니다.

Spring Boot 문서 18.14.3. 절에서는 RemoteIpValve를 이용하여 프록시 서버 뒤에서 실행할 때 HTTPS를 활성화하는 방법에 대해 설명하고 있습니다. 이 설정으로 HttpServletRequest는 프록시 서버가 실제 SSL 종료를 처리한 다운스트림에서도 secure 여부를 보고할 수 있습니다. 만약 기본 동작으로 해결이 되지 않는 경우, 요청 헤더(x-forwarded-forx-forwarded-proto)를 명시하여 RemoteIpValve를 명시적으로 활성화할 수 있습니다.

server.tomcat.remoteip.remote-ip-header=x-forwarded-for
server.tomcat.remoteip.protocol-header=x-forwarded-proto

또한 Spring Security를 통해 특정 요청에 대해 보안 채널을 요구하는 설정도 추가할 수 있습니다. 이를 통해 POST 요청이 HTTPS로 리다이렉트될 때 그대로 POST 요청으로 유지되도록 강제할 수 있는데, 아래는 예시 코드입니다.

@Configuration
public class MySecurityConfig {

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.requiresChannel(channel -> channel.anyRequest().requiresSecure());
        return http.build();
    }
}

하지만 제공해주신 정보에서는 HTTP 요청이 리다이렉트될 때 POST가 GET으로 변경되지 않도록 하는 구체적인 방법이 나와 있지 않습니다. 현 상황에서는 POST 요청이 리다이렉트와 함께 GET으로 변경되지 않도록 하는 특정 설정이나 구현 방법에 대한 문제 해결을 위해 추가적인 검토가 필요합니다. 해당 설정은 Spring Boot의 기본적인 리다이렉션 메커니즘 밖의 주제일 수 있기 때문에, 스프링 부트의 문서나 커뮤니티에서 더 자세한 토론이나 해결 방안을 찾아보시길 권장드립니다.

자세한 내용은 Spring Boot 문서의 해당 섹션을 참고하세요:
- HTTPS를 프록시 서버 뒤에서 실행할 때 활성화하기: HTTPS 활성화하기
- 여러 Tomcat 커넥터 활성화하기: 여러 커넥터 활성화 문서
- 특정 경로로의 Custom Context Path 설정하기(참고로, 리다이렉션 관련 직접적인 설명은 아닙니다): Custom Context Path 설정하기

추가 질문이나 필요한 도움이 있으시면 언제든 문의해 주세요.

IK P님의 프로필 이미지
IK P

작성한 질문수

질문하기