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