JSP페이지 URL로 직접 접근
URL을 통해서 JSP 페이지에 직접 접근하는 것을 차단해야하는 경우가 있습니다.
특히 스트러츠처럼 프론트 콘틀롤러 패턴을 적용한 시스템에서는 서블릿 콘트롤러만이
JSP를 실행할 수 있어야하죠.
그런데 JSP 페이지를 일반 HTML 페이지와 동일하게 취급하여 배치하게 되면,
영리한(?) 사용자가 JSP 경로를 알아내어 서블릿을 통하지 않고 실행할 수가 있습니다.
JSP 페이지를 매핑된 경로(*.do)를 통해 호출하는 것이 정상이지만, 여전히 JSP페이지는
URI접근에 노출되어 있기 때문에 사용자가 매핑경로를 통하지 않고 JSP 페이지를
실행하는 것을 막지는 못한다는 얘깁니다.
이를 해결할 여러 가지 방법이 있습니다.
(1) JSP를 WEB-INF 디렉토리 밑에 두는 방법
모든 JSP 페이지를 WEB-INF 디렉토리 아래에 두는 방법입니다. WEB-INF 디렉토리는 클라이언트에게는 접근이 금지되어 있으나, 컨테이너는 접근이 허용됩니다. 다시 말하면 사용자는 WEB-INF 아래의 JSP 페이지를 URI 로 접근하여 실행할 수 없으나 컨테이너는 실행 가능하다는 것입니다. 스트러츠의 경우는 아래처럼 JSP 페이지를 /WEB-INF 아래에 배치하여 매핑을 정의하면 됩니다.
<action path="/saveSubscription" type="example.SaveSubscriptionAction"> <forward="/WEB-INF/jsp/subscription.jsp"/> </action>
이 방법은 그러나 JSP 페이지와 HTML/이미지 파일이 분리되어 존재하므로 다소
혼란스럽고, 화면개발시 상대경로를 확인하기 위해 JSP 페이지의 매핑경로를 알아야하는
불편이 있습니다.
※ WebLogic 6.1에서는 WEB-INF 밑의 JSP파일은 서블릿에서 포워딩하는 것이 불가능하더군요.(웹로직 6.1의 버그로 생각됩니다.)
(2) web.xml에서 JSP페이지에 보안설정을 하는 방법
web.xml에 *.jsp 패턴의 모든 URL에 대해서 누구도 실행을 할 수 없게 설정해줄 수
있습니다. 아래 처럼 세팅하면 됩니다.
<security-constraint> <display-name>JSP Protection</display-name> <web-resource-collection> <web-resource-name>SecureJSPPages</web-resource-name> <url-pattern>*.jsp</url-pattern> </web-resource-collection> <auth-constraint> <role-name>nobody</role-name> </auth-constraint> </security-constraint> <security-role> <description> Nobody should be in this role so JSP files are protected from direct access. </description> <role-name>nobody</role-name> </security-role>
어떤 의도를 가진 사용자가 JSP 페이지를 URL로 직접 접근하게 되면 서버는
HTTP 응답코드 401번(Unauthorized) 페이지를 보여줍니다.
좀더 우아하게 처리하려면 401번 응답 페이지를 예쁘게 만들어서 등록하면 되겠죠.
<!-- 접근 권한없음 : UNAUTHORIZED--> <error-page> <error-code>401</error-code> <location>/error/unauthorized.html</location> </error-page></pre>
Posted in JSP