본문 바로가기

errorLog

xss filter 적용 후 multipart/form-data 파일이 서버로 전송되지 않을 때

spring 프로젝트에서 web.xml에 아래와 같이 필터를 적용했다.

파일 업로드를 위해 multipartFilter가 필요했고 보안을 위해 xssFilter가 필요했다.

 

<filter>
    <filter-name>multipartFilter</filter-name>
    <filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
    <init-param>
        <param-name>multipartResolverBeanName</param-name>
        <param-value>multipartResolver</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>multipartFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<!-- Encoding filter -->
<filter>
    <filter-name>encodingFilter</filter-name>
    <filter-class>
        org.springframework.web.filter.CharacterEncodingFilter
    </filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>

<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>*.do</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>encodingFilter</filter-name>
    <url-pattern>*.action</url-pattern>
</filter-mapping>


<!-- XSS filter -->
<filter>
    <filter-name>XSS</filter-name>
    <filter-class>egovframework.template.common.utils.XssFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>XSS</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

<filter>
    <filter-name>xssEscapeServletFilter</filter-name>
    <filter-class>com.navercorp.lucy.security.xss.servletfilter.XssEscapeServletFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>xssEscapeServletFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 

 

다양한 필터 설정 시 위치도 영향을 미치게 되는데,

 

1. multipart도 xssFilter를 타기 위해 보다 상단에 위치해야 한다.

2. xssEscapeServletFilter는 CharacterEncodingFilter 뒤에 위치해야 한다.

 

이 순서를 지켜서 돌려봤더니 xssFilter는 적용되는데 서버에서 파일을 받아오지 못했다.

확인해보니 multipart로 전송되는 파일 스트림은 한번만 사용할 수 있는데 필터에서 사용해버리기 때문에 컨트롤러에서는 사용할 수 없게 된다.

 

해결방법은

1. multipartFilter에 초기값으로 설정한 multipartResolverBeanName을 삭제한다.

    <init-param>
        <param-name>multipartResolverBeanName</param-name>
        <param-value>multipartResolver</param-value>
    </init-param>

 

2. multipartResolver bean 등록 시 bean id를 filterMultipartResolver로 수정한다.

<bean id="multipartResolver"
 class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <property name="maxUploadSize" value="100000000" />
    <property name="maxInMemorySize" value="100000000" />
</bean>