spring / / 2022. 12. 23. 07:37

zuul filter를 이용해서 http method 변경하기

금융권에서는 보안상의 이유로 GET, POST만 허용하고 PUT, DELETE를 사용하지 못하게 하는 경우가 있다.

zuul gateway를 사용하는 경우 zuul filter를 사용하여 http method를 변경하는 방법이 있다.

예를 들어
UI -> Gateway(zuul) -> App 방식으로 호출하는 경우

UI에서는 GET, POST만 사용하고 Gateway에서 App을 호출하는 경우 실제 HTTP Method로 변경해주는 방법이다.

요청 헤더에 change-method=PUT 으로 요청하면 Gateway 호출시는 POST로 호출하고 zuul에서 App 호출할 때는 PUT으로 변경한다.

예) UI에서 아래와 같이 호출한다.
POST http://localhost:8080/users/users
change-method: PUT

이런 경우
UI (POST) -> Gateway(PUT) -> App

zuul filter에 대한 예제코드이다.

@Component
public class ChangeHttpMethodFilter extends ZuulFilter {

    private static List<String> VALID_METHOD = Arrays.asList("GET", "POST", "PUT", "DELETE");

    @Override
    public String filterType() {
        return "route";
    }

    @Override
    public int filterOrder() {
        return 0;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        HttpServletRequest requestWrapper = new PostHttpServletRequest(request);
        ctx.setRequest(requestWrapper);

        return null;
    }

    static class PostHttpServletRequest extends HttpServletRequestWrapper {
        private String method;
        public PostHttpServletRequest(HttpServletRequest request) {
            super(request);
            String changeMethod = request.getHeader("change-method");
            if (changeMethod != null && VALID_METHOD.contains(changeMethod.toUpperCase())) {
                this.method = changeMethod;
            } else {
                this.method = request.getMethod();
            }
        }

        @Override
        public String getMethod() {
            return method;
        }
    }
}
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유