[JSP]<c:out>을 사용하는 이유

2020년 03월 08일 by Xion

    [JSP]<c:out>을 사용하는 이유 목차

문든 JSP view페이지를 작성하면서 궁금점이 생겼다

왜 ${}를 사용해도 되는데 굳이 c:out value를 이용하여 출력할까?

 

결론은 , 보안성때문이 크다.

XSS(Cross-site Scripting) 란 ?

-XSS공격은 웹사이트에 스크립트 코드를 주입시키는 방법으로 웹사이트 공격방법 중 기초적인 것에 해당됩니다.

해결 방법은 html코드를 해석하지 않게 만들면 간단히 방어할 수 있습니다.

 

즉, JSP view페이지를 만들 때 XSS공경 방지를 위해 " <c:out> "을 사용하여 막을 수 있습니다.

 

 

 

실시간 베스트 글

 

 

혹시 국비지원이나 사설학원 (패스트 캠퍼스 등) 다니는 중이신가요?

 

현직 5년차가 직접 겪은 국비지원 패스트캠퍼스 후기 보러가기

 

국비지원 패스트캠퍼스 후기 현직 5년차 개발자가 알려주는 코딩학원 현실

국비지원 패스트캠퍼스 후기 현직 개발자가 경험한 코딩학원 선택 기준 및 현실에 대해 알려드립니다. 이런 분들은 절대 수업 듣지도 마세요.

www.allinfospace.com

 

 

| JSP<c:out>을 사용하는 이유 ?

  • 1)html이나 스크립트가 실행되어 위험합니다.
  • 2)엄격한 태그 규칙을 위해 사용합니다.
  • 3)개행문자 파싱의 차이 때문에 사용합니다.
  • 4)보안성 때문에 사용합니다.

 

c:out은 다음과 같이 문제(?)가 될 수 있는 HTML 문자를 탈락(escape)시키는 기능도 가지고 있기 때문입니다.

>  - &lt;
<  - &gt;
&  - &amp;
'  - &#039;
'' - &#034;

 

아래와 같은 게시판 사이트가 있다고 가정해보면

 

 

게시판에 글을 등록을 할 때 다음과 같이 스크립트 코드를 집어 넣어 봤습니다.

 

 

 

결과는

 

 

 

자바스크립트 코드가 실행된 것을 볼 수 있다.

이러한 자바스크립트 코드를 실행을 막으려면

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라 지정하지 않아도 됩니다.

 

결과는 다음과 같습니다.