[JSP] Ch10 시큐리티

jychae·2022년 11월 9일
0

JSP

목록 보기
8/9

ch10_web_comment.xml

<web-app>
   <!-- 
      JSP 시큐리티 web.xml 설정
      
      1. 시큐리티 역할 설정하는 방법
         <security-role>
            <role-name>role1</role-name>   // 역할 이름   
         </security-role>
         
      2. 시큐리티 제약 사항 설정하기
         <security-constraint>
            <web-resource-collection></web-resource-collection>   	// 웹 자원에 대한 접근 설정
            <auth-constraint></auth-constraint>               		// 웹 자원에 접근할 수 있는 인증된 사용자 설정
            <user-data-constraint></user-data-constraint>     		// 데이터 전송 시 데이터 보호를 설정
         </security-constraint>
         
         2-1 웹 자원에 대한 접근 설정
            <web-resource-collection>
               <web-resource-name>JSPBook</web-resource-name>   	// 웹 자원의 이름을 설정하며 생략할 수 있다.
               <url-pattern>/ch10/security02.jsp</url-pattern>   	// 접근 제한을 요청할 때 URL 목록을 설정
               <http-method>GET</http-method>               		// HTTP 메소드를 설정(GET,POST)
            </web-resource-collection>
            
         2-2 웹 자원에 접근할 수 있는 인증된 사용자 설정
            - auth-constraint를 설정하지 않으면 웹 서버는 사용자 인증을 요구하지 않고 사용자의 요청을 승인한다.
            <auth-constraint>
               <description></description>
               <role-name>role1</role-name>   // 반드시 tomcat-users.xml에 등록된 역할과 사용자여야 한다.
            </auth-constraint>
            
         2-3 클라이언트와 서버 간에 데이터를 전송할 때 데이터를 보호하는 방법을 설정
            - NONE : 기본 값으로 데이터를 보호하지 않을 때
            - INTEGRAL : 전송 중 데이터가 변경되지 않았음을 보장(데이터 무결성)
            - CONFIDENTIAL : 전송 중 데이터를 아무도 훔쳐보지 않았음을 보장(기밀성)
            <user-data-constraint>
               <transport-guarantee>NONE</transport-guarantee>
            </user-data-constraint>
            
      3. 시큐리티 인증 설정하기
         <login-config>
            <auth-method>FORM</auth-method>            	// 웹 자원에 대한 인증 처리방식 설정
            <realm-name></realm-name>               	// 웹 자원에 접근할 수 있는 인증된 사용자 설정
            <form-login-config></form-login-config>     // 데이터 전송 시 데이터 보호를 설정
         </login-config>
         
         3-1 웹 애플리케이션의 인증 처리 기법을 설정하는 요소
            - BASIC : 웹 자원을 보호하는 간단하고 일반적인 방법
            - DIGEST : 암호화 매커니즘을 이용하여 전송, 많이 사용되지 않음
            - FORM : [대표적] 일반적인 폼 페이지를 이용하여 로그인 정보를 서버에 전송하는 방식
                  암호화 되지 않은 로그인 정보를 그대로 전송
                  **** FORM 기반 인증시에는 별도 form처리가 필요하다.
            - CLIENT-CERT : 클라이언트가 인증서를 가지고 공인 키 인증 방식을 사용하여 로그인하는 방식
                        클라이언트가 인증서를 가지고 있어야만 로그인되므로 비즈니스 환경에서만 적용
            <auth-method>FORM</auth-method>
            
         3-2 기본 인증의 영역 이름을 설정
            - FORM 기반 인증이나 다른 인증 방법에 필요하지 않기 때문에 아무런 영향을 미치지 않지만, 데이터를 문서화하는데 일반적으로 사용
            <realm-name>영역 이름<realm-name>
            
         3-3 인증 처리를 위한 로그인 및 오류 페이지를 설정
            - auth-method 요소가 FORM 기반 인증 처리 기법으로 설정되었을 때 사용
            <form-login-config>
               <form-login-page>/ch10/login.jsp</form-login-page>
               <form-error-page>/ch10/login_failed.jsp</form-error-page>
            </form-login-config>
    -->

   <!-- 실제 web.xml에 시큐리티 역할을 설정해보자! -->
   <security-role>
      <!-- role-name으로 설정하는 역할 이름은 반드시 tomcat-users.xml에 등록된 역할과 사용자여야한다. -->
      <role-name>role1</role-name>
      <role-name>role2</role-name>
   </security-role>
   
   <!-- # 시큐리티 제약 사항 설정하기 - 사용자의 요청 URL에 대한 접근 권한을 정의한다. -->
   <security-constraint>
      <web-resource-collection>
         <web-resource-name>JSPBook</web-resource-name>    <!-- JSPBook 프로젝트 자원의 이름 설정(생략가능) -->
         <url-pattern>/ch10/security02.jsp</url-pattern>   <!-- /ch10/security02.jsp URL에 대해 접근 제한을 요청 -->
         <!-- 아래는 url-pattern 설정 시 또다른 방식으로 설정하는 방법이다(실제로 사용하지 않으므로 주석 ::: 사용하는 방법 참고) -->
<!--       <url-pattern>/cart/*</url-pattern> -->
<!--       <url-pattern>/member/*</url-pattern> -->
         <http-method>GET</http-method>   <!-- HTTP 메소드 방식은 GET -->
      </web-resource-collection>
   
         <!-- 
            웹 자원에 접근할 수 있는 인증된 사용자 설정
            - auth-constraint 요소를 생략하면 웹 서버는 사용자 인증을 요구하지 않고 사용자의 요청을 승인한다. 
         -->
         <auth-constraint>
         <description></description>   <!-- 권한 부여 제약 사항에 대한 설명을 기술 -->
            <!-- 
               권한이 부여된 사용자의 이름을 대문자, 소문자를 구분하여 설정한다.
               이때, tomcat-users.xml에 등록된 역할과 사용자여야 한다.
               모든 사용자에게 권한을 부여하려면 *로 설정한다.
             -->
         <role-name>role1</role-name>
<!--          <role-name>*</role-name> -->
         </auth-constraint>
   </security-constraint>
   
   <!-- 
      클라이언트와 서버 간에 데이터를 전송할 때 데이터를 보호하는 방법을 설정
      - NONE : 기본값으로 데이터를 보호하지 않겠다는 의미
      - INTEGRAL : 전송 중 데이터가 변경되지 않았음을 보장한다는 의미
      - CONFIDENTIAL : 전송 중 데이터를 아무도 훔쳐보지 않았음을 보장한다는 의믜
    -->
<!--    <user-data-contraint>
      <transport-guarantee>NONE</transport-guarantee>
   </user-data-contraint> -->
   
   
   <!--
      # 시큐리티 인증 설정하기
      - 인증 처리를 위한 로그인 페이지나 오류 페이지를 호출하는데 사용한다.
    -->
    
    <login-config>
       <!-- 
          웹 애플리케이션의 인증 처리 기법을 설정하는 요소
          - BASIC : 웹 자원을 보호하는 간단하고 일반적인 방법
          - DIGEST : 암호화 매커니즘을 이용하여 전송(많이 사용x)
          - FORM : 일반적인 폼 페이지를 이용하여 로그인 정보를 서버에 전송하는 방식(암호화되지 않은 로그인 정보 전송)
          - CLIENT-CERT : 클라이언트가 인증서를 가지고 공인 키 인증 방식을 사용하여 로그인하는 방식(클라이언트가 인증서를 가지고 있어야만 로그인 됨.)
          
          *** FORM기반 인증 처리시 지켜야 할 사항!!!
          - 웹 브라우저가 인증 처리에 직접적으로 관여하지 않기 때문에 사용자가 로그인 페이지에 인증 정보를 직접 입력해서 전달해 주어야 한다.
             > form태그의 action의 'j_security_check'로 설정
             > 사용자명(아이디) input태그의 name을 'j_username'로 설정
             > 비밀번호 input태그의 name을 'j_password'로 설정 
          
        -->
        
       <auth-method>FORM</auth-method>
       
       <!-- 
          기본 인증의 영역 이름을 설정
          - FORM 기반 인증이나 다른 인증 방법에 필요하진 않음.
          - 데이터를 문서화하는데 설명으로 사용된다.
        -->
       <realm-name>영역 이름</realm-name>
       
       
       <!-- 
          인증 처리를 위한 로그인 및 오류 페이지를 설정
          - auth-method가 FORM기반의 인증 처리 기법으로 설정시 사용
        -->
        <form-login-config>
           <!-- 
              인증 처리를 위한 로그인 페이지 설정 
              - 로그인 페이지 경로(/ch10/login.jsp)
            -->
        <form-login-page>/ch10/login.jsp</form-login-page>
           <!-- 
              인증 처리 후 오류 페이지 설정
              - 로그인 오류 페이지 경로(/ch10/login_failed.jsp)
            -->
            <form-error-page>/ch10/login_failed.jsp</form-error-page>
        </form-login-config>
    </login-config>
   
   
   
   
   
   
   
   

   <!-- 기본 인증 처리 방법으로 보안 처리하기 -->
   <!-- 
   <security-role>
      <role-name>role1</role-name>
   </security-role>
   <security-constraint>
      <web-resource-collection>
         <web-resource-name>JSPBook</web-resource-name>
         <url-pattern>/ch10/security01.jsp</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>
      <auth-method>BASIC</auth-method>
   </login-config>
    -->
    
   <!-- 폼 기반 인증 방법으로 보안 처리하기 -->
   <!-- 
   <security-role>
      <role-name>role1</role-name>
   </security-role>
   <security-constraint>
      <web-resource-collection>
         <web-resource-name>JSPBook</web-resource-name>
         <url-pattern>/ch10/security01.jsp</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>
      <auth-method>FORM</auth-method>
      <form-login-config>
         <form-login-page>/ch10/login.jsp</form-login-page>
         <form-error-page>/ch10/login_failed.jsp</form-error-page>
      </form-login-config>
   </login-config>
    -->
    
       <security-role>
      <role-name>role1</role-name>
   </security-role>
   <security-constraint>
      <web-resource-collection>
         <web-resource-name>JSPBook</web-resource-name>
         <url-pattern>/ch10/security02.jsp</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>
      <auth-method>FORM</auth-method>
      <form-login-config>
         <form-login-page>/ch10/login.jsp</form-login-page>
         <form-error-page>/ch10/login_failed.jsp</form-error-page>
      </form-login-config>
   </login-config>
</web-app>

security01.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Security</title>
</head>
<body>
	<p>인증 성공했습니다.</p>
</body>
</html>

security02.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Security</title>
</head>
<body>
	<!-- 인증된 사용자를 가져오도록 request 내장객체의 getRemoteUser() 함수사용  -->
	<p>사용자명 : <%=request.getRemoteUser() %></p>

	<!-- 인증된 사용자를 가져오도록 request 내장객체의 getAuthType() 함수사용  -->
	<p>인증방법 : <%=request.getAuthType() %></p>
	
	<!-- 
		로그인시 인증한 사용자의 역할 이름이 tomcat 인지, role1 인지 확인하도록
		request 내장객체의 isUserInRole()함수를 사용
	 -->
	<p>인증한 사용자명이 역할명 "tomcat" 에 속하는 사용자인가요?
		<%=request.isUserInRole("tomcat") %></p>
	<p>인증한 사용자명이 역할명 "role1" 에 속하는 사용자인가요?
		<%=request.isUserInRole("role1") %></p>
</body>
</html>

login.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Security</title>
</head>
<body>
	<form action="j_security_check" name="LoginForm" method="post">
		<p>사용자명 : <input type="text" name="j_username"> </p>
		<p>비밀번호 : <input type="text" name="j_password"> </p>
		<p><input type="submit" value="전송"/> </p>
	</form>
</body>
</html>

login_failed.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<p>인증 실패했습니다.</p>
</body>
</html>
profile
안녕하세요! 초보개발자 공부 시작!

0개의 댓글