jsp 페이지 내에서
받은 모델을 출력하기 위해서
HTML 문 안에
${모델명} 을 기입해서 사용하는데
이때 <c:out value="${모델명}" /> 로 사용하는 경우가 있다,
결론은 , 보안성 때문에 그렇다.
XSS(Cross-site Scripting) 란 ?
-XSS공격은 웹사이트에 스크립트 코드를 주입시키는 방법으로 웹사이트 공격방법 중 기초적인 것에 해당됩니다.
해결 방법은 html코드를 해석하지 않게 만들면 간단히 방어할 수 있습니다.
즉, JSP view페이지를 만들 때 XSS공경 방지를 위해 " <c:out> "을 사용하여 막을 수 있습니다.
| JSP<c:out>을 사용하는 이유 ?
- 1)html이나 스크립트가 실행되어 위험합니다.
- 2)엄격한 태그 규칙을 위해 사용합니다.
- 3)개행문자 파싱의 차이 때문에 사용합니다.
- 4)보안성 때문에 사용합니다.
추가적으로
c:out은 다음과 같이 문제(?)가 될 수 있는 HTML 문자를 탈락(escape)시키는 기능도 가지고 있기 때문입니다.
> - <
< - >
& - &
' - '
'' - "
아래와 같은 게시판 사이트가 있다고 가정해보면
게시판에 글을 등록을 할 때 다음과 같이 스크립트 코드를 집어 넣어 봤습니다.
결과는
자바스크립트 코드가 실행된 것을 볼 수 있다.
이러한 자바스크립트 코드를 실행을 막으려면
EL 밖에 <c:out value=' '/>태그를 씌워서
자바스크립트 태그가 실행되지 않게 만들고
글자 그대로 출력되게 하면 된다.
<c:out value='${값}'/>에는 디폴트로 escapeXml옵션이 true로 되어있어
출력 문자열에 HTML 특수문자(예: <, >, &, ' 또는 ") 포함되어 있을 경우
HTML을 해석하지 않고 그대로 출력되도록 해줍니다.
혹시나 <c:out value=' ${값}' escapeXml = false />로 입력하면
HTML 코드를 그대로 해석해서 내보내주기 때문에 주의할 필요가 있습니다.
XSS보안을 방어한 게시판은 다음과 같이 자바스크립트 코드가 그대로 출력되어 나옵니다.
예시를 위해 단순한 alert창을 띄었지만
쿠키에 들어있는 개인정보를 전송하거나
엉뚱한 곳으로 접속하게 만드는 등
악성코드가 심어져 있다면
문제를 일으킬 수 있습니다.
그러나 이 방법은 워낙 기초적인 거라 대부분 웹사이트들이 막았기에 걱정하지 않아도 됩니다.
따라서 똑같은 jstl을 쓰더라도
그냥 ${a}라고 하는 것과
<c:out value="${a}"/>라고 하는 것은 큰 차이가 있는데
그냥 ${a}라고 하면 escape 기능이 지원이 되지 않아서 XSS 공격에 노출될 수 있습니다.
예를들어,HTML Entity로 치환이 되어야할 부분에 대해 escapeXml 속성을 true로 부여 해보면,
<%
String greeting = "<b>hello, world!</b>";
request.setAttribute("greeting", greeting);
%>
// escapeXml 속성을 "false"로 했을 경우 "
<h2>escapeXml false</h2>
<c:out escapeXml="false" value="${greeting}" />
// escapeXml 속성을 "true"로 했을 경우 "
<h2>escapeXml true</h2>
<c:out escapeXml="true" value="${greeting}" />
// escapeXml 속성을 지정하지 않았을 경우
<h2>default</h2>
<c:out value="${greeting}" /> //이 경우에 default 값은 "true"이다
실제로는 escapeXml 속성의 default가 true라 지정하지 않아도 됩니다.
결과는 다음과 같습니다.
참고 사이트 : https://scorpio-mercury.tistory.com/
'개발 Tips' 카테고리의 다른 글
vs code에서 주석처리 (0) | 2024.04.17 |
---|---|
높은 해상도에서 이클립스 아이콘 및 메뉴 작아지는 문제 해결 방법 (0) | 2024.04.17 |
23.02.16 Oracle DB cmd 창 사용 시 한글 깨짐 또는 줄 짤림 방짐 설정 (0) | 2023.02.16 |
23.02.16 오라클 DB 포트 변경 (0) | 2023.02.16 |
23.02.16 default interface 가 필요한 이유 (5번 참고) (0) | 2023.02.16 |