10. 시큐리티

Yuri Lee·2022년 5월 31일
0

JSP

목록 보기
10/19

<시큐리티의 개요>

허가된 사용자만이 특정 웹 페이지에 접근할 수 있도록 제한

1. 시큐리티 처리 방법

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

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

tomcat-users.xml 파일에서 주석 부분을 해제하고 기존 설정된 역할과 사용자를 사용하거나 새로운 역할과 사용자를 추가.

<role rolename="manager"/>
<user username="admin" password="admin1234" roles="manager"/>

<선언적 시큐리티 처리>

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

1. 시큐리티 역할 설정하기

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

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

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

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

< web-resource-collction> 요소

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

< auth-constraint> 요소

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

< user-data-constraint> 요소

<user-data-constraint>
	<transport-guarantee>none/integral/confidential</transport-guarantee>
</user-data-constraint>
  • none : 데이터를 보호하지 않겠다는 의미
  • integral : 전송 중 데이터가 변경되지 않았음을 보장한다는 의미
  • confidetial : 전송 중 데이터를 아무도 훔쳐보지 않았음을 보장한다는 의미(기밀성)

3. 시큐리티 인증 설정하기

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

< auth-method> 요소

<auth-method>BASIC,DIGEST,FORM,CLIENT-CERT</auth-method>
  • basic : 웹 자원을 보호하는 간단하고 일반적인 방법
  • digest : 암호화 메커니즘을 이용하여 전송
  • form : 일반적인 폼 페이지를 이용하여 로그인 정보를 서버에 전송하는 방식
  • client-cert : 클라이언트가 인증서를 가지고 공인 키 인증방식을 사용하여 로그인하는 방식

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

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

< realm-name> 요소

<realm-name>영역 이름<realm-name>

< form-login-config> 요소

<form-login-config>
	<form-login-page>로그인 페이지 url</form-login-page>
    <form-error-page>로그인 오류 페이지 url</form-error-page>
</form-login-config>

ex) 폼 기반 인증 방법으로 보안처리 예시

<?xml version="1.0" encoding="UTF-8"?>
<web-app>
   <security-role>
  	<role-name>role1</role-name>
  </security-role>
  
  <security-constraint>
  	<web-resource-collection>
  		<web-resource-name>JSPBook</web-resource-name>
  		<url-pattern>/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>/login.jsp</form-login-page>
  		<form-error-page>/login_failed.jsp</form-error-page>
  	</form-login-config>
  </login-config> 
</web-app>

<프로그래밍적 시큐리티 처리>

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

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

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

ex) 프로그래밍 방식 보안 처리 예

<body>
	<p> 사용자명:	<%=request.getRemoteUser() %>
	<p>	인증방법:	<%=request.getAuthType() %>
	<p>	인증한 사용자명이 역할명 "tomcat"에 속하는 사용자인가요?
		<%=request.isUserInRole("tomcat")%>
	<p> 인증한 사용자명이 역할명 "role1"에 속하는 사용자인가요?
		<%=request.isUserInRole("role1")%>
</body>
profile
개발자 이유리

0개의 댓글