개발
전자정부프레임워크 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