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} <!-- 위험함 -->

🔗 참고 링크

  1. jstl _ <c:out> 을 사용하는 이유와 XSS(크로스 사이트 스크립팅)
  2. 자바스크립트 내에서 쓰이는 EL과 JSTL에 대하여 질문 …
  3. jstl을 통한 xss 방어하기 | pen

댓글 남기기