JSTL fmt 태그에서 EL 사용 시 XSS 방지 방법 정리
JSP 개발 시 JSTL의 <fmt:message>
나 <fmt:formatNumber>
등의 fmt 태그 내부에서 EL(Expression Language)을 사용하게 되는 경우, 사용자 입력이 포함될 수 있어 XSS(크로스 사이트 스크립팅) 공격에 취약할 수 있다. 이를 예방하기 위해 아래와 같은 방법들을 적용할 수 있다.
✅ 1. <c:out> 태그를 이용한 HTML 이스케이프 처리
<c:out>
태그는 출력 시 기본적으로 HTML 이스케이프 처리를 해주므로 안전하게 출력할 수 있다.
<fmt:message key="welcomeMessage" var="msg"/>
<c:out value="${msg}" />
✅ 2. fn:escapeXml() 함수 사용 (JSTL 1.1 이상)
JSTL의 함수 라이브러리를 활용하여 EL 내부에서도 이스케이프 처리를 할 수 있다.
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
<fmt:message key="welcomeMessage" var="msg"/>
${fn:escapeXml(msg)}
✅ 3. 서버 측 필터 또는 입력 검증
서버 측에서 사용자 입력을 받을 때 HTML/JS 코드를 제거하거나 escape 처리하는 XSS 필터를 설정해두는 것이 좋다. 예를 들어 필터를 적용하거나 OWASP의 HTML Sanitizer 같은 라이브러리를 사용할 수 있다.
✅ 4. EL 자체는 자동 이스케이프가 아니다
기본 EL 표현식(${...}
)은 JSTL이나 JSP에서 자동 이스케이프 처리를 해주지 않기 때문에 반드시 <c:out>
이나 fn:escapeXml()
을 통해 명시적으로 처리해야 한다.
예:
<fmt:message key="someKey" var="msg"/>
${msg} <!-- 위험함 -->