can I ask something
304
2021-05-10 10:23:02
2
239

Request의 종류는 누가 결정합니까 ??


안녕하세요.

너무 궁금한 점이 있어서 여기까지 왔습니다. ㅠㅠ 


현재 궁금한 점 

-> 파일 업로드 코드를 만들다가 문득 궁금한 점이 생겼습니다 .

요청이 들어올 때 Request의 객체가 변하는게 신기하고 원리를 파악하고 싶습니다. 


생각없이 공부를 하다가 

1. controller에서는 HttpServletRequest  들어오는 경우가 있고 ,

2. 파일업로드 관련에서는 HttpServletRequest, MultipartRequest 을 구현한 MultipartHttpServletRequest 들어오는 경우가 있고 , 

3. 어떤 경우는 Security와 관련하여 WrapperRequest가 들어오는 경우가 있습니다. 


그렇다면 저는 현재 요청클래스는 client가 가지고 있는 세션에 따라서 달라진다고 생각을 하고 있었습니다. 

하지만 이렇게 생각하는 정확한 근거는 제가 말을 못하고 있더라고요. 


그래서 여쭤보고 싶습니다.

Q1. 요청 Request의 객체는 client에 세션에 따라 달라지는게 맞는 것인지 ??!

또 Q2. Request의 객체를 개발자가 원하는대로 수정할 수 있는지 궁금합니다. 


구선생에게 물어봐도 다들 Request가 뭔지만 알려주는 글들만 잔뜩 있어 답답한 마음에 글을 질문드립니다. 

더하여 미리 답글을 달아주는 분들께 감사의 말씀 전합니다. 

감사합니다 !! :) 


0
  • 답변 2

  • Dierslair
    5k
    2021-05-10 10:38:33 작성 2021-05-10 10:44:46 수정됨

    문맥상 자바 스프링인것 같네요. FormContentFilter를 보시면,

    @Override
    protected void doFilterInternal(
        HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
        throws ServletException, IOException {
    
        MultiValueMap<String, String> params = parseIfNecessary(request);
        if (!CollectionUtils.isEmpty(params)) {
            filterChain.doFilter(new FormContentFilter.FormContentRequestWrapper(request, params), response);
        }
        else {
            filterChain.doFilter(request, response);
        }
    }

    parseIfNecessary 메서드에서 요청 헤더에 Accept: application/x-www-form-urlencoded 가 포함되었는지 확인하고 form 데이터가 있으면 해당 기능을 하는 래퍼 객체로 감싼 request를 다음 체인에 넘겨 주는 것을 확인할 수 있습니다.

    시큐리티도 마찬가지로 해당 경로가 시큐리티에서 관리해야하는 경로인 경우, FIlterChainProxy 에서 시큐리티 관련 래퍼로 감싸서 체인에 넘겨주게 됩니다.

    만약 본인이 원하는 ServletRequest 기능을 데코레이팅하기 위해서는 커스텀 필터를 추가하여 래퍼로 감싸 처리할 수 있습니다.

    예를 들어 Nginx같은 프록시에서 전달하는 프록시 헤더를 HttpServletRequest.getRemoteAddr 메서드로 얻고 싶은 경우 다음과 같은 필터를 추가해서 사용할 수 있습니다.


    public class ProxyHeaderExposureFilter extends OncePerRequestFilter {
    
        @Override
        protected void doFilterInternal(HttpServletRequest request,
                                        HttpServletResponse response,
                                        FilterChain filterChain) throws ServletException, IOException {
            filterChain.doFilter(
                new ProxyHeaderExposureRequestWrapper(request),
                response
            );
        }
    
        public static class ProxyHeaderExposureRequestWrapper extends HttpServletRequestWrapper {
    
            ProxyHeaderExposureRequestWrapper(HttpServletRequest request) {
                super(request);
            }
    
            @Override
            public String getRemoteAddr() {
                String proxyRemoteAddr = super.getHeader("X-Forwarded-For");
                if (proxyRemoteAddr != null) {
                    return proxyRemoteAddr;
                }
                
                return super.getRemoteAddr();
            }
    
        }
    
    }


  • can I ask something
    304
    2021-05-10 11:12:31

    John Suhr 님 우선 답글 달아주신 점 다시 한 번 감사드립니다. 
    일단 위에서 filter , chain을 더 찾아보겠습니다. 

    filter에 대해서 70% 이해가 되었으며, 

    사실 chain에 대한 이해는 부족하여 100% 이해하지는 못했습니다. 여하튼 위 내용들 참고해서 더 찾아보도록 하겠습니다. 


    감사합니다 :) 

  • 로그인을 하시면 답변을 등록할 수 있습니다.