본문 바로가기
java

URL 직접 접근 모두 막기

by 새로운 도전을 위한 한걸음 2015. 5. 10.

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>