<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>
<%@ 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>
<%@ 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>
<%@ 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>
<%@ 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>