inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

1412

IK P

작성한 질문수 2

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 인턴

안녕하세요, 인프런 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 설정하기

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

강의 추천해주세요

2

29

1

케이테스트 서버 운영 방법

2

51

1

맥유저 입장의 고려해주세요

2

45

1

Image Only Query

1

32

2