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 자동 처리
- <, > → <, > 변환
- 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차 보안 방어선 구축
- 팀 내 출력 표준 가이드 정리
'일 > JAVA' 카테고리의 다른 글
| SQL Injection 취약점 개선 (0) | 2026.04.27 |
|---|---|
| JSP/JSTL에서 파일명 확장자 제거 처리 (0) | 2026.03.02 |
| JSP에서 특정 URL 포함 여부에 따른 조건 분기 처리 (0) | 2026.03.02 |
| JSP 분리 구조에서 선택된 카테고리를 <title>에 동적으로 반영하기 (0) | 2026.03.02 |
| java16.stream.aggregate (0) | 2023.05.30 |