개발

전자정부프레임워크 3.x 버전 XSS(크로스 사이트 스크립팅) 방어 필터를 적용

피터JK 2025. 3. 13. 13:37
728x90

전자정부프레임워크 3.x에서 XSS(크로스 사이트 스크립팅) 방어 필터를 적용하는 방법
전자정부프레임워크는 EgovWebUtil 또는 Spring Security 기반의 XSS 필터를 활용할 수 있다.


1. 전자정부프레임워크의 기본 XSS 방어 적용

전자정부프레임워크 3.x에서는 기본적으로 XSS 방어 필터를 제공하며, 이를 web.xml에 설정하여 적용할 수 있다.

① web.xml에서 XSSFilter 적용

전자정부프레임워크에서 제공하는 XSS 필터를 사용하려면 web.xml에 다음과 같이 필터를 등록한다.

<filter>
    <filter-name>CrossScriptingFilter</filter-name>
    <filter-class>egovframework.com.cmm.filter.HTMLTagFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>CrossScriptingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

② HTMLTagFilter 클래스 역할

  • **전자정부프레임워크의 HTMLTagFilter**는 입력값에서 <script>, <iframe> 등의 태그를 제거하여 XSS 공격을 방어한다.
  • 모든 요청(/*)에 대해 적용되므로 전반적인 보안을 강화할 수 있다.

2. 커스텀 XSS 필터 적용 방법

기본 필터 외에도, 사용자 정의 XSS 필터를 만들어 보다 강력한 필터링을 적용할 수도 있습니다.

① 사용자 정의 XSSFilter 클래스 생성

전자정부프레임워크에서 제공하는 기본 필터보다 강력한 XSS 방어 기능을 원한다면, 아래와 같이 필터 클래스를 직접 구현할 수 있다.

XSSFilter.java

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

public class XSSFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        XSSRequestWrapper wrappedRequest = new XSSRequestWrapper((HttpServletRequest) request);
        chain.doFilter(wrappedRequest, response);
    }

    @Override
    public void destroy() {
    }
}

② XSSRequestWrapper 클래스 생성

이 클래스는 입력값을 검사하고 XSS 위험 요소를 제거하는 역할을 한다.

XSSRequestWrapper.java

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import org.apache.commons.text.StringEscapeUtils;

public class XSSRequestWrapper extends HttpServletRequestWrapper {

    public XSSRequestWrapper(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String getParameter(String name) {
        String value = super.getParameter(name);
        return sanitize(value);
    }

    @Override
    public String[] getParameterValues(String name) {
        String[] values = super.getParameterValues(name);
        if (values == null) {
            return null;
        }
        String[] sanitizedValues = new String[values.length];
        for (int i = 0; i < values.length; i++) {
            sanitizedValues[i] = sanitize(values[i]);
        }
        return sanitizedValues;
    }

    private String sanitize(String input) {
        return (input != null) ? StringEscapeUtils.escapeHtml4(input) : null;
    }
}
  • StringEscapeUtils.escapeHtml4(input) : HTML 태그를 이스케이프 처리하여 <script> 등의 실행을 방지한다.

③ web.xml에 필터 등록

위에서 만든 XSSFilter를 web.xml에 추가한다.

<filter>
    <filter-name>XSSFilter</filter-name>
    <filter-class>com.example.security.XSSFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>XSSFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

3. Spring Security를 활용한 XSS 방어

전자정부프레임워크에서 Spring Security를 사용하고 있다면, Spring Security의 XSS 필터를 적용하는 방법도 있다.

① Spring Security 설정 파일 (security-context.xml)에서 XSS 방어 적용

<bean id="xssFilter" class="org.owasp.esapi.filters.SecurityWrapperRequest">
    <constructor-arg ref="xssFilterConfig"/>
</bean>

<bean id="xssFilterConfig" class="org.owasp.esapi.filters.SecurityWrapperRequest">
    <property name="useXssProtection" value="true"/>
</bean>

② HTML 태그 이스케이프 설정

JSP 파일에서 Spring의 spring:escapeBody 태그를 사용하여 출력 시 XSS 방어를 적용할 수도 있습니다.

<%@ taglib uri="http://www.springframework.org/tags" prefix="spring" %>
${param.inputValue}

4. 결론

전자정부프레임워크 3.x에서 XSS 방어를 적용하는 방법은 다음과 같다.

방법  설명
기본 제공 HTMLTagFilter 사용 web.xml에서 HTMLTagFilter 등록
커스텀 XSS 필터 적용 XSSFilter.java, XSSRequestWrapper.java 생성 후 web.xml에 등록
Spring Security 적용 security-context.xml에서 SecurityWrapperRequest 설정
JSP에서 XSS 방어 <spring:escapeBody> 태그 사용하여 HTML 이스케이프

추천 방법

  • 간단한 적용: HTMLTagFilter (전자정부프레임워크 기본 제공)
  • 보안 강화: XSSRequestWrapper 커스텀 필터
  • Spring Security 사용 시: SecurityWrapperRequest 설정
  • JSP에서도 방어: <spring:escapeBody> 활용

이 방법을 활용하면 전자정부프레임워크 3.x에서 효과적으로 XSS를 방어할 수 있다.

728x90