JSP Servlet 시큐리티 : 상품 등록 페이지의 보안 처리하기 2
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>
<% } %>
=프로그래밍 방식으로 보안 처리하기=
- 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>
요약
01. 시큐리티 개요
- 시큐리티는 허가된 사용자만이 특정 웹 페이지에 접근할 수 있도록 제한하는 보안 기능을 말한다. 시큐리티는 사용자가 권한이 없는 데이터에 접근하는 것을 막거나 웹 공격자가 전송 데이터를 중간에 가로채는 것을 방지하는 등 중요한 역할을 한다.
02. 선언적 시큐리티 처리
- 선언적 시큐리티는 웹 애플리케이션 배포 설명자 web.xml 파일에 보안 구성을 작성하여 수행하는 방식이다. web.xml 파일에는 보안 역할 , 보안 제약 사항, 인증 처리 등을 설정하여 보안을 구성한다.
03. 프로그래밍적 시큐리티 처리
- 프로그래밍적 시큐리티는 웹 애플리케이션의 보안을 위해 코드를 작성하여 사용자의 권한 부여를 처리하는 방식이다. 선언적 시큐리티의 보안으로 충분하지 않을 때 request 내장 객체의 메소드를 사용하여 사용자를 승인하는 방법이다.