SpringFramework/Spring

Spring Jsonp 관련 확인한 내용

lovineff 2021. 4. 13. 14:48

요약

AbstractJsonpResponseBodyAdvice을 상속받아 사용하는 프로젝트는 Spring 버전을 2.0.x로 유지하거나, 버전업 이후 JSONP 응답을 직접 개발해야 레거시 시스템에서 Ajax jsopn 호출히 오류가 발생하지 않는다.

(SpringBoot 2.1 부터는 JSONP 응답을 지원하지 않음, 라이브러리 또한 미지원)

 

 

내용

레거시 시스템 고도화 작업중 CORS 소스가 존재함을 확인

 

레거시 CORS 소스

@ControllerAdvice
public class JsonpAdvice extends AbstractJsonpResponseBodyAdvice {
    public JsonpAdvice() {
        super("callback");
    }
}

 

해당 소스를 리팩토링하여 아래 코드로 변경함.

@Configuration
public class WebConfig implements WebMvcConfigurer {
    // Spring Boot 버전업 대응으로 처리해두었음. JsonpAdvice 클래스 제거 후 사용
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**") // 모든 요청을 뜻한다.
                .allowedOrigins("*")   // 전체 허용
                .allowedHeaders("*")
                .allowedMethods("*")
                .allowCredentials(true)
                ;
    }
}


시스템 운영 중 크롬에서 CORB 오류 발생하여 내용 확인 결과.

AJAX의 jsonp를 사용하는 코드를 확인함. 

$.ajax({
        dataType: 'jsonp',
        url: 'url',
        success: function (res) {
            console.log("topad contents play ---- ");
            console.log(res);
        },
        error:function(request,status,error){
            console.log("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error:"+error);
        }
});

 

리팩토링된 소스는 jsonp 방식을 지원하지 않고, 응답값이 jsonp 형식이 아닌 json 응답 형태를 갖추게 되어 브라우저내 오류 발생

위 오류로 CORS 부분과 라이브러리 버전을 롤백함

 

참고자료

Spring jsonp 응답 : https://www.baeldung.com/spring-jackson-jsonp

jsonp 미사용관련 공식 문서(AbstractJsonpResponseBodyAdvice Removed) : https://docs.spring.io/spring-framework/docs/4.3.17.RELEASE_to_4.3.18.RELEASE/Spring%20Framework%204.3.18.RELEASE/org/springframework/web/servlet/mvc/method/annotation/AbstractJsonpResponseBodyAdvice.html