[JSP] 시큐리티

시큐리티

  • 허가된 사용자만이 접근할 수 있도록 제한하는 보안 기능

프로세스

  • 사용자가 웹 페이지에 접근
  • JSP 컨테이너(Tomcat)는 요청된 페이지에 보안 제약(Constraints)이 있는지 확인
  • 사용자에게 인증(authentication)을 요청
  • 권한 부여(authorization) : JSP 컨테이너는 사용자가 해당 페이지에 접근할 수 있는지 확인. 승인

역할

  • 사용자가 권한이 없는 데이터에 접근하는 것을 막음
  • 스니핑(sniffing) : 웹 공격자가 전송 데이터를 중간에 가로채는 것 방지

그래서 시큐리티란?

허가된 사용자만이 특정 웹 페이지에 접근할 수 있도록 제한하는 보안 기능
사용자가 권한이 없는 데이터에 접근하는 것을 막아줌
웹 공격자가 전송 데이터를 중간에 가로채는 것을 방지(스니핑 방지)

선언적 시큐리티

web.xml 파일(웹 애플리케이션(JSPBook) 배포 설명자)에 보안 구성을 작성하여 수행
보안 역할(role), 보안 제약 사항(constraint), 인증 처리(login.jsp, login-failed.jsp) 설정

  • tomcat-users.xml에

    추가해준다

  • JSPBook에 있는 web.xml에 추가해준다.
    1) BASIC 인증 처리 기법

<security-constraint>
		<web-resource-collection>
			<!-- 프로젝트 명  -->
			<web-resource-name>JSPBook</web-resource-name>
			<!-- 접근을 제한할 요청 경로. role1 권한을 가진 사람만 jsp에 요청가능  -->
			<url-pattern>/ch10/security01.jsp</url-pattern>
			<http-method>GET</http-method>
		</web-resource-collection>
		<auth-constraint>
			<description></description>
			<!-- security01.jsp와 role1 연결됨  -->
			<!-- 권한이 부여된 role 이름  -->
			<role-name>role1</role-name>
		</auth-constraint>
	</security-constraint>
	<login-config>
		<!-- BASIC 인증 처리 기법으로 설정. tomcat-users.xml에 설정한 아이디/비번을 입력해야만 인증가능.  -->
		<auth-method>BASIC</auth-method>
	</login-config>
  • security01.jsp실행시

2) form기반 인증처리 기법

  <security-role>
		<role-name>role1</role-name>
	</security-role>
	
	<security-constraint>
		<web-resource-collection>
			<!-- 프로젝트 명  -->
			<web-resource-name>JSPBook</web-resource-name>
			<!-- 접근을 제한할 요청 경로. role1 권한을 가진 사람만 jsp에 요청가능  -->
			<url-pattern>/ch10/security01.jsp</url-pattern>
			<http-method>GET</http-method>
		</web-resource-collection>
		<auth-constraint>
			<description></description>
			<!-- security01.jsp와 role1 연결됨  -->
			<!-- 권한이 부여된 role 이름  -->
			<role-name>role1</role-name>
		</auth-constraint>
	</security-constraint>
	<login-config>
		
		<!-- FORM 기반 인증 처리 기법으로 설정. -->
		<auth-method>FORM</auth-method>
		<form-login-config>
				<!-- 인증 처리를 위한 로그인 페이지 설정 -->
			<form-login-page>/ch10/login.jsp</form-login-page>
				<!-- 인증 실패시 페이지 설정  -->
			<form-error-page>/ch10/login_falied.jsp</form-error-page>
		</form-login-config>
	</login-config>
  • login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<title>Security</title>
</head>
<body>
	<!-- 폼 기반 인증 처리를 위해 j_security_check을 사용 -->
	<form name="loginForm" action="j_security_check" method="post">
		<p>사용자명: <input type="text" name="j_username" /></p>
		<p>비밀번호: <input type="password" name="j_password" /></p>
		<p><input type="submit" value="전송" /></p>
	</form>
</body>
</html>
  • login_failed
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<title>Security</title>
</head>
<body>
	<h2>인증 실패^0^</h2>
</body>
</html>

3) 상품추가 페이지 접근시 권한확인

  • web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>JSPBook</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>default.html</welcome-file>
    <welcome-file>default.htm</welcome-file>
    <welcome-file>default.jsp</welcome-file>
  </welcome-file-list>
  <!-- 
  error-code : 404(없다), 500(개발자실수) 등의 응답 상태 코드
  location : 오류페이지의 URI(URL+기능)
  -->
  <error-page>
  	<error-code>404</error-code>
  	<location>/error/404.jsp</location>
  </error-page>
  <error-page>
  	<error-code>500</error-code>
  	<location>/error/500.jsp</location>
  </error-page>
  <error-page>
  	<exception-type>java.lang.NullPointerException</exception-type>
  	<location>/error/500.jsp</location>
  </error-page>
  	
	<!-- 시큐리티 역할 admin  관리 시작 -->
<!--     <security-role> -->
<!-- 		<role-name>admin</role-name> -->
<!-- 	</security-role> -->
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>JSPBook</web-resource-name>
			<!-- 접근을 제한할 요청 경로  -->
			<url-pattern>/ch04/addProduct.jsp</url-pattern>
			<http-method>GET</http-method>
		</web-resource-collection>
		<auth-constraint>
			<description></description>
			<!-- 권한이 부여된 role 이름 -->
			<role-name>admin</role-name>
		</auth-constraint>
	</security-constraint>
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>JSPBook</web-resource-name>
			<!-- 접근을 제한할 요청 경로  -->
			<url-pattern>/ch03/*</url-pattern>
			<http-method>GET</http-method>
		</web-resource-collection>
		<auth-constraint>
			<description></description>
			<!-- 권한이 부여된 role 이름 -->
			<role-name>tomcat</role-name>
		</auth-constraint>
	</security-constraint>
	<!-- 시큐리티 인증 설정 -->
	<login-config>
		<!-- BASIC 인증 처리 기법으로 설정 -->
<!-- 		<auth-method>BASIC</auth-method> -->
		<!-- FORM 기반 인증 처리 기법으로 설정 -->
		<auth-method>FORM</auth-method>
		<form-login-config>
			<!-- 인증 처리를 위한 로그인 페이지 설정 -->
			<form-login-page>/ch04/login.jsp</form-login-page>
			<!-- 인증 실패 시 오류 페이지 설정 -->
			<form-error-page>/ch04/login_failed.jsp</form-error-page>
		</form-login-config>
	</login-config>
	<!-- 시큐리티 역할 role1  관리 끝 -->
	
</web-app>

  • login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<!DOCTYPE html>
<html>
<head>
<title>Insert title here</title>
<link rel="stylesheet" href="/css/bootstrap.min.css" />
</head>
<body>
	<div class="jumbotron">
		<div class="container">
			<h1 class="display-3">로그인</h1>
		</div>
	</div>
	<div class="container" align="center">
		<div class="col-md-4 col-md-offset-4">
			<h3 class="form-signin-heading">Please Sign in</h3>
			<!-- login_failde의 response.sendRedirect("login.jsp?error=1");  -->
			<c:if test="${param.error == 1}">
				<div class ="alert alert-danger">
					아이디와 비밀번호를 확인해주세요
				</div>
			</c:if>
		</div>
		<!--j_security_check : 폼기반 인증처리  -->
	<form class="form-signin" method="post" action="j_security_check">
		<div class="form-group">
			<label for = "inputUserName" class="sr-only">User Name</label>
			<input type="text" class="form-control" placeholder="ID" name="j_username" required autofocus />
			
		</div>
		<div class="form-group">
			<label for = "inputPassword" class="sr-only">Password</label>
			<input type="password" class="form-control" placeholder="PASS" name="j_password" required autofocus />
			
		</div>
		<button class="btn btn btn-lg btn-success btn-block" type="submit">로그인</button>
	</form>
	</div>
</body>
</html>

<c:if test="${param.error == 1}">
				<div class ="alert alert-danger">
					아이디와 비밀번호를 확인해주세요
				</div>
			</c:if>

좋은 웹페이지 즐겨찾기