JSP 예외 처리하기
JSP에서는 페이지의 내용을 처리하다가 예외가 발생하는 경우 별다른 설정이 없다면 예외의 내용을 그대로 출력스트림인 out 객체로 출력하기 때문에 클라이언트(브라우저) 에 예외의 내용이 그대로 노출됩니다.


nullEx.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
      
<!DOCTYPE html>
<html>
<head>
      <meta charset="UTF-8">
</head>
<body>
      <%
            String nullStr = null;
            System.out.println(nullStr.toString());
      %>
</body>
</html>
cs


위 JSP 페이지는 nullStr 변수에 null값을 할당하고 toString() 메서드를 사용하려 하고 있습니다. 당연히 null값을 참조하려 했으므로 java.lang.NullPointerException 이 발생하게 됩니다. 예외는 서블릿 컨테이너인 톰캣의 터미널에도 출력되지만 동시에 스트림을 통해 클라이언트에도 전달이 되기 때문에 브라우저에서 예외 내용을 볼 수 있습니다.



개발 단계에서는 JSP 페이지를 개발하는데 있어서 개발자가 자신의 브라우저를 통해 예외 내용을 확인하므로써 자신의 개발 로직에 어떤 문제점이 있는지 쉽게 파악할 수 있는 장점이 있지만, 만약 이상태로 개발이 완료되어 제품이 판매되고 예외가 발생했을때 사용자가 이러한 내용을 보게 된다면 상당히 프로그램에 대한 신뢰도를 잃게 될 수 있습니다.

또한 악의적인 공격자가 이러한 내용을 보게된다면 해당 웹서비스가 어떤 플랫폼에 기반하여 동작하는 웹서비스인지(예: java환경에 Tomcat) 알게되어 취약점을 알아낼 수 있고, 오픈소스 라이브러리를 사용하는 부분에서 예외가 발생한다면 해당 오픈소스에 대한 취약점을 파악하여 공격할 수도 있습니다.



JSP page 디렉티브를 이용한 예외 처리 방법
Servlet/JSP 에서 예외를 처리하는 방법에는 몇 가지가 있지만 try - catch 문을 통해 미리 예외를 예측하고 처리할 수 있는 것이 아닌 경우 page 디렉티브의 errorPage 속성과 isErrorPage 속성을 가지고 예외에 대한 대응을 할 수 있습니다.

isErroPage - 이 속성값이 true이면 현재 JSP 페이지가 예외 처리 페이지라는 것을 명시하며 exception 객체를 이용할 수 있게되어 예외에 대한 정보를 얻을 수 있게 됩니다.

errorPage - 현재 JSP 페이지에서 예외가 발생했을 때 사용자에게 보여줄 예외 화면을 처리할 JSP 페이지의 경로를 지정합니다.


먼저 앞서 보았던 nullEx.jsp 페이지에 다음과 같이 errorPage 옵션에 예외가 발생했을때 처리를 요청할 exception.jsp 경로를 명시합니다. 웹어플리케이션 경로부터 절대경로 또는 nullEx.jsp 페이지의 위치로부터 상대경로로 지정해줄 수 있습니다. 경로의 맨 앞에 /를 붙이지 않으면 상대경로로 현재 같은 위치에 있는 exception.jsp 페이지를 에러 처리 페이지로 지정해 주었습니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
<%@ page errorPage="exception.jsp" %>
      
<!DOCTYPE html>
<html>
<head>
...생략...
cs


당연히 exception.jsp 페이지는 따로 작성해 주어야 합니다. page 디렉티브의 isErrorPage 옵션의 값에 true 를 주어 현재 페이지가 예외 처리 페이지라는 것을 명시합니다. 이때부터는 exception 내부 객체를 이용할 수 있으며, 예외가 발생한 페이지로부터 제어가 넘어오면 해당 페이지에서 발생한 예외 내용을 exception 객체에 담아 사용할 수 있습니다.
<%@ page language="java" contentType="text/html; charset=UTF-8"  pageEncoding="UTF-8"%>
<%@ page isErrorPage="true" %>
      
<!DOCTYPE html>
<html>
<head>
      <meta charset="UTF-8">
</head>
<body>
서버에 문제가 발생하였습니다.
 
 
문제가 계속 되면 고객센터에 문의해주시기 바랍니다.
<%
      System.out.println("예외 클래스 : " +  exception.getClass().getName());
      System.out.println("예외 내용 : " + exception.getMessage());
%>
</body>
</html>
cs


이전의 nullEx.jsp페이지를 다시 한 번 요청합니다.



이전과 같이 예외가 발생하여 exception.jsp 페이지로 제어가 넘어가 exception.jsp 의 처리 내용이 브라우저로 출력되었습니다. 톰캣 서버의 터미널에는 System.out.println으로 출력했던 예외 내용이 출력됨을 알 수 있습니다.
예외 클래스 : java.lang.NullPointerException                                                        
예외 내용 : null
cs

블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,