메뉴 건너뛰기

app

[CWE-116 분석] 부적절한 출력 인코딩: 왜 ${var}보다 <c:out>이 안전한가?

suritam92026.01.16 08:58조회 수 4댓글 0

    • 글자 크기

웹 보안의 기초: XSS 취약점 분석과 JSP 대응 전략

웹 애플리케이션 보안에서 가장 빈번하게 발생하는 위협 중 하나는 사용자의 브라우저를 공격 대상으로 삼는 XSS(Cross-Site Scripting)입니다. 본 장에서는 XSS의 공격 패턴을 분석하고, JSP(JavaServer Pages) 환경에서 이를 방어하기 위한 실무적인 조치 방법을 학습합니다.

1. XSS 공격 패턴의 이해

XSS는 공격자가 의도한 악성 스크립트가 검증되지 않은 채 피해자의 브라우저에서 실행될 때 발생합니다. 주요 패턴은 다음과 같습니다.

 * 저장형 XSS (Stored XSS): 악성 스크립트가 서버의 DB나 파일 시스템에 영구적으로 저장됩니다. 게시판 글이나 프로필 정보에 스크립트를 삽입하여, 해당 페이지를 조회하는 모든 사용자에게 피해를 입힙니다.

 * 반사형 XSS (Reflected XSS): URL의 파라미터나 폼 데이터에 포함된 스크립트가 서버로부터 즉시 '반사'되어 출력될 때 발생합니다. 주로 피싱 메일에 포함된 악의적인 링크를 통해 시도됩니다.

 * DOM 기반 XSS (DOM-based XSS): 서버를 거치지 않고 브라우저 측의 자바스크립트가 데이터를 처리하는 과정에서 발생하는 취약점입니다.

2. JSP에서의 보안 조치: <c:out> 태그 활용

JSP 환경에서 XSS를 방어하는 가장 효과적이고 표준적인 방법은 JSTL의 <c:out> 태그를 사용하여 데이터를 출력하는 것입니다.

2.1 기본 출력 보안

일반적인 EL 식(${data})은 HTML 태그를 그대로 렌더링하므로 위험합니다. 반면 <c:out>은 HTML 특수 문자를 치환(Entity Encoding)하여 스크립트 실행을 원천 차단합니다.

<%-- 위험: 스크립트가 그대로 실행됨 --%>

${userComment} 

 

<%-- 안전: <script>가 &lt;script&gt;로 변환되어 텍스트로만 출력됨 --%>

<c:out value="${userComment}" />

 

2.2 보안 미준수 사례: escapeXml="false"

<c:out> 태그에는 escapeXml이라는 속성이 존재합니다. 이 속성의 기본값은 true이며, 이를 명시적으로 false로 설정하는 것은 보안 미준수 사항에 해당합니다.

> 보안 경고: escapeXml="false"를 설정하면 특수 문자 필터링 기능이 해제되어 XSS 공격에 무방비 상태가 됩니다. HTML 디자인 유지를 위해 태그 허용이 꼭 필요한 경우에는 <c:out>이 아닌 별도의 HTML Sanitizer 라이브러리를 사용해야 합니다.

3. 반복문 내 변수 처리 전략

리스트나 배열 데이터를 처리하는 c:forEach 반복문 내부에서도 보안 원칙은 동일합니다. 반복문 안에서 사용되는 개별 요소의 속성값들 역시 모두 <c:out>으로 감싸야 합니다.

실무 적용 예시

사용자 목록을 출력하는 테이블 구조에서 반복문 내부 변수를 처리하는 방법입니다.

<table>

    <thead>

        <tr><th>번호</th><th>사용자 아이디</th></tr>

    </thead>

    <tbody>

        <c:forEach var="user" items="${userList}" varStatus="status">

            <tr>

                <td>${status.count}</td> <%-- 시스템 생성 값은 상대적으로 안전 --%>

                <td>

                    <%-- 사용자 입력 기반 데이터는 반드시 c:out 적용 --%>

                    <c:out value="${user.userId}" />

                </td>

            </tr>

        </c:forEach>

    </tbody>

</table>

 

4. 요약 및 권고 사항

 * 모든 사용자 입력 출력에 <c:out> 사용: 단순 텍스트 출력은 반드시 JSTL 태그를 이용합니다.

 * escapeXml="false" 금지: 보안 필터를 무력화하는 옵션 사용을 엄격히 통제합니다.

 * 반복문 내 철저한 방어: 루프를 도는 모든 데이터 요소에 대해 개별적으로 인코딩을 적용합니다.

 * 다중 방어 체계: 서버단에서의 입력값 검증(Validation)과 HttpOnly 쿠키 설정을 병행하여 보안성을 극대화합니다.

 

    • 글자 크기
CWE-754: 시스템 안정성을 위협하는 부적절한 예외 처리 (by suritam9) XML의 위험한 초대장 : CWE-611 부적절한 XML 외부개체 참조 (feat. CWE-112) (by suritam9)

댓글 달기

첨부 (0)
위로