티스토리 뷰

코딩/JSP

[10주 2일차] 시큐리티 (1)

ehzim 2023. 12. 12. 17:56

CHAPTER 10. 상품 등록 페이지의 보안 처리하기

 

 

 

1. 시큐리티의 개요

시큐리티는 허가된 사용자만이 특정 웹 페이지에 접근할 수 있도록 제한하는 보안 기능이다.

한마디로 시큐리티는 접근 제한 기능을 한다.

 

사용자에게 인증(autherntication)을 요청한다.

권한 부여(authorization)한다.

 

 

 

 

1.1 시큐리티 처리 방법

웹 애플리케이션을 보안하는 시큐리티 처리 방법에는 두가지가 있다.

시큐리티 처리 방법 설명
선언적 시큐리티 코드 작성 없이 web.xml 파일에 보안 구성을 작성하여 사용자의 인증을 수행하는 방식
프로그래밍적 시큐리티 request 내장 객체의 메소드를 통해 사용자의 권한 부여를 처리한느 프로그래밍 방식

 

 

 

 

 

 

1.2 웹 서버에 역할과 사용자 구성하기

 

웹 애플리케이션의 인증과 궈한 부여를 톰캣 서버에 사용자와 역할을 쉽게 구성할 수 있다. (톰캣은 리소스의 모든 궈한을 가짐)

톰캣 서버에 인증 정보가 저장되는 장소는 tomcat-users.xml 파일인데 이 파일은 인증 정보가 저장된 명단과 같다고 볼 수 있다.

 

 

* HTML 과 XML의 차이점과 공통점

HTML은 웹기반으로 하고 XML은 데이터를 기반으로하여 체계화된 데이터를 다룬다.

두가지의 공통점은 ML인데 ML은 마크업 언어를 뜻하고 마크업 언어는 <></> 

 

 

 

사용 예시

<role rolename="tomcat" />
<role tolename="role1" />
<user username="tocat" password="<must-be-changed>" roles="tomcat"/>
<user username="both" password="<must-be-changed>" roles="tomcat,role1"/>
<user username="role1" password="<must-be-changed>" roles="role1"/>
<role rolename="manager"/>
<user username="admin" password="1234" roles="manager"/>

 

원문에는 위의 부분이 주석처리되어 이씨는데 주석을 해제해야 사용이 가능하다.

role은 등급과 같은 역할이고 username은 id와 같다.

 

 

 

 

 

 

 

2. 선언적 시큐리티 처리

 

선언적 시큐리티는 웹 애플리케이션 배포 설명자 web.xml 파일에 보안 구성을 작성하여 수행하는 방식이다.

 

 

 

2.1 시큐리티 역할 설정하기

<security-role>은 웹 애플리케이션에 사용하는 역할을 나열하는 요소이다.

<security-role> 요소는 web.xml 파일에 구성한다.

 

*web.xml 파일은 선언적 제어를 위해 사용한다. (보안, 필터링, 제어 등을 선제적 제어한다.)

 

 

<security-role>
	<role-name>역할 이름</role-name>
</security-role>

 

<role-name> 요소에 설정하는 역할 이름은 반드시 tomcat-users.xml에 등록된 역할과 사용자여야 한다.

역할 이름은 그룹명이랑 매칭되어야 한다.

 

 

 

 

 

 

 

 

2.2 시큐리티 제약 사항 설정하기

시큐리티 제약 사항은 사용자의 요청 URL에 대한 접근 궈한을 정의하는데 사용한다.

시큐리티 제약 사항은 web.xml 파일에 접근 권한 내용을 구성한다.

 

<security-constraint>
	<web-resource-collection>...</web-resource-collection>
    <auth-constraint>...</auth-constraint>
    <user-data-constraint>...</user-data-constraint>
</security-constraint>

 

 

* <security-constraint>를 구성하는 하위 요소

요소 설명
<web-resource-collection> 웹 자원에 대한 접근을 설정
<auth-constraint> 웹 자원에 접근할 수 있는 인증된 사용자를 설정한다.
<user-data-constraint> 데이터 전송 시 데이터 보호를 설정한다.

 

 

 

 

 

 

- <web-resource-collection> 요소

웹 자원에 대한 접근을 설정하는 요소이다.

<web-resource-collection>
	<web-resource-name>자원 이름</web-resource-name>
	<url-pattern>접근 제한</url-pattern>
	<http-method>전송 방식</http-method>
</web-resource-collection>

 

* <web-resource-collection>을 구성하는 하위 요소

요소 설명
<web-resource-name> 웹 자원의 이름을 설정하며 생략할 수 있다.
<url-pattern> 접근 제한을 요청할 URL 목록을 설정한다. 자원에 대한 접근을 제한하지 않는 경우 생략할 수 있다.
<http-method> 또는 <http-method-omission> http 메소드를 설정한다.(GET 또는 POST).

 

 

 

 

- <auth-constraint> 요소

권한이 부여된 사용자만이 웹 자원에 접근할 수 있도록 이름을 설정하는 요소이다.

auth-constraint 요소를 생략하면 웹 서버는 사용자 인증을 요구하지 않고 사용자의 요청을 승인한다.

 

<auth-constraint>
	<description>설명</description>
	<role-name>역할 이름</description>
</auth-constraint>

 

 

 

* <auth-constraint> 를 구성하는 하위 요소

요소 설명
<description> 권한 부여 제약 사항에 대한 설명을 기술한다.
<role-name> 권한이 부여된 사용자의 이름을 대문자 소문자를 구분해 설정한다.
반드시 tomcat-user.xml에 등록된 역할과 사용자여야 한다.
만약 모든 사용자에게 권한을 부여하려면 *로 표시한다.
<role-name>요소를 생략하면 <url-pattern> 요소에 설정된 접근 제한 URL에 대한 사용자의 요청을 허용하지 않는다.

 

 

 

 

* <auth-constraint> 요소 사용 예시

<security-constraint>
	<auth-constraint>
		<description>관리자</description>
		<role-name>manager</role-name>
	</auth-constraint>
</security-constraint>

 

 

 

 

 

- <user-data-constraint> 요소

클라이언트와 서버 간에 데이터를 전송할 떄 데이터를 보호하는 방법을 설정하는 요소이다.

 

<user-data-constraint>
	<transport-guarantee>NONE/INTERGRAL/CONFIDENTIAL</transport-guarantee>
</user-data-constraint>

 

 

 

* <user-data-constraint> 의 종류

종류 설명
NONE 기본 값으로 데이터를 보호하지 않겠다는 의미이다.
INTEGRAL 전송 중 데이터가 변경되지 않았음을 보장한다는 의미(데이터 무결성)
CONFIDENTIAL 전송 중 데이터를 아무도 훔쳐보지 않았음을 보장한다는 의미(기밀성)

 

 

 

 

 

 

 

 

2.3 시큐리티 인증 설정하기

시큐리티 인증은 인증 처리를 위한 로그인 페이지나 오류 페이지를 호출하는데 사용한다.

시큐리티 인증은 제약설정과 같이 web.xml 파일에 인증 관련 내용을 구성한다.

<login-config> 요소는 <security-constraint> 요소에 설정된 접근 제한 자원에 사용자가 접근하는 경우 해당 자원의 접근을 위한 인증 처리 방법을 활성화한다.

사용자에게 로그인 관련 메시지를 표시할 수 있다.

 

 

<login-config>
    <auth-method>...</auth-method>
    <realm-name>...</realm-name>
    <form-login-config>...</form-login-config>
</login-config>

 

 

 

* <login-config>를 구성하는 하위 요소

요소 설명
<auth-method> 웹 자원에 대한 인증 처리 방식을 설정한다.
<realm-name> 웹 자원에 접근할 수 있는 인증된 사용자를 설정한다.
<form-login-config> 데이터 전송 시 데이터 보호를 설정한다.

 

 

 

 

 

- <auth-method> 요소

웹 애플리케이션의 인증 처리 기법을 설정하는 요소이다.

어떤 방식으로 인증할 것 인지를 정한다.

 

 

<auth-method>BASIC|DIGEST|FORM|CLIENT-CERT</auth-method>

 

 

* <auth-method>의 종류

종류 설명
BASIC 웹 자원을 보호하는 간단하고 일반적인 방법이다. (한번만 사용 가능)
DIGEST 암호화 메커니즘을 이용하여 전송한다. 많이 사용되지 않는 암호화 기법으로 JSP 컨테이너가 반드시 지원하지 않을 수도 있다.
FORM 일반적인 폼 페이지를 이용하여 로글인 정보를 서버에 전송하는 방식이다. 암호화되지 않은 로그인 정보를 그대로 전송한다. (가장 사용을 많이 함)
CLIENT-CERT 클라이언트가 인증서를 가지고 공인 키 인증 방식을 사용하여 로그인하는 방식이다. 클라이언트가 인증서를 가지고 있어야만 로그인되므로 비즈니스 환경에서만 사용된다.

 

 

 

 

* FORM 기반 인증 시 로그인 페이지의 요구 사항

속성 이름 속성 값
form 태그의 action 속성 j_security_check
사용자의 name 속성 j_username
비밀번호의 name 속성 j_password

 

 

 

* form 기반 인증 시 로그인 페이지 예시

<form action = "j_security_check" method="post">  //post는 변경하지 않음
    아 이 디 : <input type="text" name="j_username">
    비밀번호 : <input type="password" name="j_username">
    <input type="submit" value="로그인">
</form>

 

 

 

 

 

- <realm-name> 요소

기본 인증의 영역 이름을 설정하는 요소이다.

설정된 영역 이름은 웹 브라우저의 로그인 대화상자에 표시된다.

이 요소는 fotm 기반 인증이나 다른 인증 방법에 필요하지 않기 때문에 아무런 영향을 미치지 않는다.

하지만 login-config 요소에 대한 설명 속성이 없으므로 데이터를 문서화하는데 일반적으로 사용한다.

 

<login-config>
	<realm-name> 영역 이름 </realm-name>
</login-config>

 

 

- <form-login-config> 요소

인증 처리를 위한 로그인 및 오류 페이지를 설정하는 요소이다.

이 요소는 <auth-method> 요소가 FORM 기반 인증 처리 기법으로 설정되었을 때 사용된다.

<form-login-page> , <form-error-page> 등의 하위 요소로 구성된다.

오류 페이지의 경로는 웹 애플리케이션 이름을 기준으로 설정된다.

 

 

* <form-login-config>를 구성하는 하위 요소

요소 설명
<form-login-page> 인증을 위한 로그인 페이지를 설정한다.
<form-error-page> 인증 실패 시 표시할 오류 페이지를 설정한다.

 

 

 

사용예시

<login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
        <form-login-page>/login.jsp</form-login-page>
        <form-error-page>/error.jsp</form-error-page>
    </form-login-config>
</login-config>

 

* form-login-page / form-error-page 은 안에는 로그인 페이지 URL / 로그인 오류 페이지 URL 이 작성된다.

 

 

 

 

 

기본 인증 처리 방법으로 보안 처리하기

예제 10-1

 

servers/Tomcat v9.0 Server at localhost-config/tomcat-users.xml

 

 

WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
	<security-role>
		<role-name>manager</role-name>
	</security-role>
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>test</web-resource-name>
			<url-pattern>/security01.jsp</url-pattern>
			<http-method>GET</http-method>
		</web-resource-collection>
		<auth-constraint>
			<description></description>
			<role-name>manager</role-name>
		</auth-constraint>
	</security-constraint>
	<login-config>
		<auth-method>BASIC</auth-method>
	</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>Insert title here</title>
</head>
<body>
	<p>인증 성공했습니다.
</body>
</html>

 

결과

 

 

 

 

 

폼 기반 인증 방법으로 보안 처리하기

예제 10-2

 

WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
	<security-role>
		<role-name>manager</role-name>
	</security-role>
	<security-constraint>
		<web-resource-collection>
			<web-resource-name>test</web-resource-name>
			<url-pattern>/security01.jsp</url-pattern>
			<http-method>GET</http-method>
		</web-resource-collection>
		<auth-constraint>
			<description></description>
			<role-name>manager</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-error-page>/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>Insert title here</title>
</head>
<body>
	<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>Insert title here</title>
</head>
<body>
	<form name="loginForm" action="j_security_check" method="post">
		<p> 사용자명 : <input type="text" name="j_username">
		<p> 비밀번호 : <input type="password" name="j_password">
		<p> <input type="submit" value="전송">
	</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>인증 실패했습니다.
</body>
</html>

 

 

 

성공 결과 화면

 

 

실패 결과 화면

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday