JSP, Servlet, MySQL/JSP - webmarket

JSP Servlet 시큐리티 : 상품 등록 페이지의 보안 처리하기 2

샤리미 2023. 9. 15. 14:05
728x90
반응형

03. 프로그래밍적 시큐리티 처리

 

프로그래밍적 시큐리티(programmatic security)는 웹 애플리케이션의 보안을 위해 코드를 작성하여 사용자의 권한 부여를 처리하는 방식이다. 선언적 시큐리티의 보안으로 충분하지 않을때 request 내장 객체의 메소드를 사용하여 사용자를 승인하는 방법이다. .

 

보안 관련 request 내장 객체의 메소드

메소드 형식 설명
getRemoteuser() String 사용자의 인증 상태를 반환한다
getAuthType() String 서블릿을 보호하는 데 사용되는 인증 방식의 이름을 반환한다
isUserInRole(java.lang.String role) boolean 현재 인증된 사용자에게 설정된 역할이 있는지 확인한다. 설정된 경우 true를 반환하고 그렇지 않은경우 false
getProtocol() String 웹 브라우저의 요청 프로토콜을 가져온다
isSercure() boolean 웹 브라우저에서 https 요청으로 request가 들어왔는지 확인한다. 웹 브라우저에서 https 로 접근하면 true를 반환하고, http로 접근하면 false로 반환한다
getUserPrinciple() Principle 현재 인증한 사용자의 이름을 포함하여 java.security.Principle객체를 반환한다

다음은 관리자만 접근할 수 있는 웹페이지로 연결되는 예로, 현재 요청하는 사용자의 역할이 admin인지 확인하여 승인된 사용자만 addProduct.jsp 와 member.jsp 에 접근할 수 있다

 

[request 내장객체의 isUserInRole() 메소드 사용 예]

<% if (request.isUserInRole("admin")) { %>
	<a href="admin/addProduct.jsp">상품 등록</a>
	<a href="admin/member.jsp">회원관리</a>
<% } %>

=프로그래밍 방식으로 보안 처리하기=

  1. web.xml 파일을 다음과 같이 수정한다. 

/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8" ?>
<web-app>
	<security-role> <!-- 시큐리티 역할을 설정하도록<security-role>요소를 작성한다 -->
		<role-name>role1</role-name>
	</security-role>
	<security-constraint><!-- 시큐리티 제약사항을 설정하도록<security-constraint>요소를 작성한다 -->
		<web-resource-collection>
			<web-resource-name>JSPBook</web-resource-name>
			<url-pattern>/ch10/security02.jsp</url-pattern><!-- 접근을 제한할 요청경로를 설정하도록<url-pattern>요소를 작성한다. -->
			<http-method>GET</http-method>
		</web-resource-collection>
		<auth-constraint>
			<description></description>
			<role-name>role1</role-name>
		</auth-constraint>
	</security-constraint>
	<login-config><!-- 시큐리티 인증을 설정하도록<login-config>요소를 작성한다 -->
		<auth-method>FORM</auth-method>
		<form-login-config>
			<form-login-page>/ch10/login.jsp</form-login-page>
			<form-erro-page>/ch10/login_failed.jsp</form-erro-page>
		</form-login-config>
	</login-config>
</web-app>

2.  ch10/security02.jsp

<%@ page contentType="text/html; charset=utf-8" %>
<html>
<head>
	<title>Security</title>
</head>
<body>
	<p>사용자명 : <%= request.getRemoteUser() %> <!-- 인증된 사용자를 가져오도록 request 내장 객체의 getRemoteUser()메소드를 작성 -->
	<p>인증방법 : <%= request.getAuthType() %><!-- 인증 처리방식을 가져오도록 request 내장객체의 getAuthType()메소드를 작성 -->
	
	<!-- 로그인시 인증한 사용자의 역할 이름이 tomcat인지, role1인지 확인하도록 request내장객체의 isUserRole() 메소드를 사용 -->
	<p> 인증한 사용자명이 역할명"tomcat"에 속하는 사용자 인가요?
		<%= request.isUserInRole("tomcat") %>
	<p>인증한 사용자명이 역할명 "role1"에 속하는 사용자인가요?
		<%= request.isUserInRole("role1") %>
</body>
</html>

 

 

 

 

04. [웹 쇼핑몰] 상품 등록 페이지의 보안 처리하기

앞에서 배운 보안처리를 적용하여 상품 등록 페이지에 접근이 허가된 사용자만 접근할 수 있게 하고 로그아웃 처리기능도 만들어 보자, 사용자는 로그인 페이지에서 인증을 거쳐야만 상품 등록 페이지에 접근할 수 있다 

 

1.  웹 서버에 사용자오아 역할 설정하기 : 이클립스의 Server 프로젝트에 있는 tomcat-users.xml 파일의 사용자와 역할에 대해 다음과 같이 추가작성한다. 

  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <role rolename="admin"/> <!--새로운 역할로 admin을 추가해준다-->
  <user username="tomcat" password="tomcat1234" roles="tomcat"/>
  <user username="both" password="both1234" roles="tomcat,role1"/>
  <user username="role1" password="role1234" roles="role1"/>
  <user username="admin" password="admin1234" roles="admin"/><!--추가된 새로운 역할 admin에 대해 사용자와 비밀번호를 작성한다-->

2. 웹 애플리케이션 배포 설명자 web.xml 만들기 : WEB-INF/ web.xml 을 생성

<?xml version="1.0" encoding="UTF-8" ?>
<web-app>
	<security-role><!-- 시큐리티 역할을 설정 -->
		<description></description>
		<role-name>admin</role-name>
	</security-role>
	<security-constraint><!-- 시큐리티 제약 사항을 설정 / 시작 -->
		<display-name>WebMarket Security</display-name>
		<web-resource-collection>
			<web-resource-name>WebMarket</web-resource-name>
			<description></description>
			<url-pattern>/addProduct.jsp</url-pattern><!-- 접근을 제한할 요청 경로를 설정 -->
		</web-resource-collection>
		<auth-constraint>
			<description>권한 관리자명</description>
			<role-name>admin</role-name><!-- 권한이 부여된 사용자 이름을 설정 -->
		</auth-constraint>
	</security-constraint><!-- 시큐리티 제약 사항을 설정 / 끝 -->
	<login-config><!-- 시큐리티 인증을 설정/시작 -->
		<auth-method>FORM</auth-method>
		<form-login-config>
			<form-login-page>/login.jsp</form-login-page><!-- 인증처리를 위한 로그인 페이지를 설정 -->
			<form-erro-page>/login_failed.jsp</form-erro-page><!-- 인증 실패시 오류페이지를 설정 -->
		</form-login-config>
	</login-config><!-- 시큐리티 인증을 설정/끝 -->
</web-app>

3.로그인 페이지 만들기 : login.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<html>
	<head>
		<link rel="stylesheet" href="./resources/css/bootstrap.min.css">
		<title>Login</title>
	</head>
	<body>
		<jsp:include page="menu.jsp"/>
		<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>
				<%
					//로그인 인증에 실패했을 때 요청 파라미터의 값을 얻어오도록 request 내장 객체의 getParameter()메소드를 작성.
					//또한 오류 메시지를 출력하도록 out.print()작성
					String error = request.getParameter("error");
					if(error != null){
						
						out.println("<div class='alert alert-danger'>");
						out.println("아이디와 비밀번호를 확인해 주세요");
						out.println("</div>");
					}
				%>
				<!-- 로그인 인증 처리를 위한 form 태그/ 시작 -->
				<form class="form-signin" action="j_security_check" 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="Password" name='j_password' required>
					</div>
					<button class="btn btn btn-lg btn-success btn-block" type="submit">로그인</button>
				</form><!-- 로그인 인증 처리를 위한 form 태그/ 끝-->
			</div>		
		</div>
		<jsp:include page="footer.jsp"/>
	</body>
</html>

4. 로그인 인증 실패 페이지 만들기 : login_failed.jsp

<%
	//로그인 인증에 실패했을 떄 login.jsp 페이지로 강제 이동하도록 response 내장 객체의 sendRedirect()메소드를 작성한다.
	//또한 login.jsp 에 오류를 전달하도록 요청 파라미터 error 를 작성한다. 
	response.sendRedirect("login.jsp?error=1"); 
%>

=로그아웃 작성하기=

 

1. 로그아웃 페이지 만들기 : logout.jsp

<%@ page contentType="text/html; charset=utf-8"%>
<%
	//로그인 인증을 할 떄 웹 브라우저에 저장된 모든 사용자를 삭제하도록 session 내장 객체의 invalidate()메소드를 작성
	session.invalidate();
	//login.jsp 페이지로 강제 이동하도록 response 내장 객체의 sendRedirect()메소드를 작성한다. 
	response.sendRedirect("addProduct.jsp");
%>

2. 상품 등록 페이지 수정하기 : addProduct.jsp

 

<div class="container">
		<div class="text-right">
			<a href="?language=ko">Korean</a>|<a href="?language=en">English</a>
			<a href="logout.jsp" class="btn btn-sm btn-success pull-right">logout</a> <!-- 로그아웃을 클릭하면 로그아웃 페이지를 호출하도록 작성 -->
		</div>

addProduct.jsp 로 접속하면 login.jsp 가 나온다. admin/admin1234를 입력
로그인후 addProduct.jsp 가 나오는것을 볼 수 있다. logout 을 누른다
다시 login.jsp 로 돌아온다&nbsp; 아이디와 패스워드를 틀리게 입력한다
그러면 login_failed.jsp?error=1가 나온다

 

 

요약

01. 시큐리티 개요

  • 시큐리티는 허가된 사용자만이 특정 웹 페이지에 접근할 수 있도록 제한하는 보안 기능을 말한다. 시큐리티는 사용자가 권한이 없는 데이터에 접근하는 것을 막거나 웹 공격자가 전송 데이터를 중간에 가로채는 것을 방지하는 등 중요한 역할을 한다.

02. 선언적 시큐리티 처리

  • 선언적 시큐리티는 웹 애플리케이션 배포 설명자 web.xml 파일에 보안 구성을 작성하여 수행하는 방식이다. web.xml 파일에는 보안 역할 , 보안 제약 사항, 인증 처리 등을 설정하여 보안을 구성한다. 

03. 프로그래밍적 시큐리티 처리

  • 프로그래밍적 시큐리티는 웹 애플리케이션의 보안을 위해 코드를 작성하여 사용자의 권한 부여를 처리하는 방식이다. 선언적 시큐리티의 보안으로 충분하지 않을 때 request 내장 객체의 메소드를 사용하여 사용자를 승인하는 방법이다. 

 

728x90
반응형