본문 바로가기

일/JAVA

JSP EL vs <c:out> 차이 및 XSS 대응 정리

JSP EL vs <c:out> 차이 및 XSS 대응 정리

1️⃣ 문제 배경

JSP 화면 개발 중 게시글 제목을 출력할 때 아래 두 가지 방식이 혼용되고 있었다.

 
${article.articleTitle}
 
 
<c:out value="${article.articleTitle}"/>
 

겉보기에는 동일하게 동작하지만, 보안 및 출력 처리 방식에서 중요한 차이가 존재한다.


2️⃣ 기술적 차이 분석

🔹 1. EL(Expression Language) 직접 출력

 
${article.articleTitle}
 
  • 단순히 객체의 프로퍼티 값을 출력
  • null일 경우 아무것도 출력하지 않음
  • HTML escape 처리 없음
  • 사용자 입력값 포함 시 XSS 취약 가능성 존재

예시:

 
<script>alert('XSS')</script>
 

위 값이 DB에 저장되어 있다면 브라우저에서 그대로 실행될 수 있음.


🔹 2. JSTL <c:out> 사용

 
<c:out value="${article.articleTitle}"/>
 
  • EL 값을 출력하는 JSTL 태그
  • 내부적으로 HTML escape 자동 처리
  • <, > → &lt;, &gt; 변환
  • null일 경우 빈 문자열 반환
  • default 속성으로 기본값 지정 가능

예시:

 
<c:out value="${article.articleTitle}" default="제목 없음"/>
 

3️⃣ 보안 관점 정리 (XSS 대응)

구분EL 출력<c:out>
HTML Escape
XSS 방지
null 기본값 지정
단순 출력 편의성 보통

결론: 사용자 입력 데이터가 포함된 화면 출력에는 <c:out> 사용이 안전하다.


4️⃣ 프로젝트 적용 기준 수립

실무 적용 시 다음 기준을 정리함:

✅ <c:out> 사용

  • 게시글 제목
  • 댓글 내용
  • 사용자 입력값
  • DB에서 조회한 외부 입력 데이터

⚠️ EL 직접 출력 허용

  • 내부적으로 가공된 안전한 값
  • HTML 태그 렌더링이 필요한 경우
  • 보안 검토 완료된 데이터

5️⃣ 기술적 의의

  • 단순 화면 출력 차이로 보이지만,
    보안 취약점(XSS) 방지와 직결되는 문제
  • JSP 레벨에서의 출력 전략을 명확히 정립
  • 화면 단에서 1차 보안 방어선 구축
  • 팀 내 출력 표준 가이드 정리