記錄

Spring) Spring Security(스프링 시큐리티)_1 본문

Web/Spring framework

Spring) Spring Security(스프링 시큐리티)_1

surhommejk 2019. 8. 12. 18:22

[스프링 시큐리티]

스프링 시큐리티란 스프링에서 '보안 기능'을 위해 사용하는 프레임워크이다. 여기서 말하는 '보안 기능' 이란 '인증'과 '인가'로 나눌 수 있다. '인증'은 접속 자체에서부터 해당 접속을 허락해줘도 될지, 해당 접근을 인증하는 것이다. 쉽게 말해 비밀번호와 아이디를 제대로 쳤는지 확인하는 로그인 기능으로 볼 수 있다. '인가'는 애플리케이션 내 리소스에 대한 접근을 제어하는 것을 의미한다. 회원 내에도 등급이 나뉘어져 있어 이를 세세하게 분류하여 특정 페이지에 따라 특정한 사용자에게만 허락해 준다던가 하는 것을 예로 들 수 있다.

 

[스프링 시큐리티 설정]

1. 라이브러리 설정(pom.xml)

		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-web</artifactId>
			<version>4.0.1.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-config</artifactId>
			<version>4.0.1.RELEASE</version>
		</dependency>
		<dependency>
			<groupId>org.springframework.security</groupId>
			<artifactId>spring-security-taglibs</artifactId>
			<version>4.0.1.RELEASE</version>
		</dependency>
		

cf) 스프링 자체의 버전이 낮으면 오류가 발생하니 주의

* spring-security-core : 인증과 인가 기능을 구현하기 위한 핵심적인 컴포넌트로 구성됨

*spring-security-web : 웹 애플리케이션 보안 기능을 구현하기 위한 컴포넌트로 구성됨

*spring-security-config : 각 모듈에서 제공하는 컴포넌트의 설정을 지원하기 위한 컴포넌트로 구성됨

*spring-security-taglibs : 인증 정보나 인가 정보를 사용하기 위한 JSP태그 라이브러리로 구성됨

 

2. web.xml 설정

	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml</param-value>
		<param-value>/WEB-INF/spring/security-context.xml</param-value>
	</context-param>
	<filter>
		<filter-name>springSecurityFilterChain</filter-name>
		<filter-class>org.springframework.web.filter.DelegatingFilterProxy
		</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>springSecurityFilterChain</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

스프링 프레임워크가 제공하는 DelegatingFilterProxy를 이용해서 DI 컨테이너에서 관리되는 빈을 서블릿 컨테이너에 등록한다. 서블릿 필터의 이름으로 DI 컨테이너에서 관리되는 빈의 이름을 지정한다. 모든 요청에 대해 스프링 시큐리티를 적용한다.

 

3. security-context.xml 설정

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:security="http://www.springframework.org/schema/security"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
                     http://www.springframework.org/schema/beans/spring-beans.xsd
                     http://www.springframework.org/schema/context
					http://www.springframework.org/schema/context/spring-context.xsd
					http://www.springframework.org/schema/mvc
					http://www.springframework.org/schema/mvc/spring-mvc.xsd
  					 http://www.springframework.org/schema/security 
  					 http://www.springframework.org/schema/security/spring-security.xsd
  					  http://www.springframework.org/schema/tx 
  					 http://www.springframework.org/schema/tx/spring-tx.xsd
  					 ">
  					 
	<bean id="bCryptPasswordEncoder"
		class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder">
	</bean>

	<security:http>
		<security:intercept-url pattern="/**" access="isAuthenticated()" />
		<security:form-login /> 	
	</security:http>

	<security:authentication-manager/>

</beans>

<!-- 인증이 필요없는 리소스에 대한 경로 패턴을 지정 
<security:http pattern="resources/** security="none">
-->

<security:http> 요소를 정의하면 스프링 시큐리티를 이용할 때 필요한 컴포넌트의 빈이 자동으로 정의된다. 위 코드에서는 보안 설정이 제대로 적용되었는지 확인하기 쉽도록 하기 위해서 요청되는 모든 경로에 인증을 하도록 해두었다. 인증 방식으로는 폼 기반 인증 기능을 사용한다. <security:authentication-manager>요소는 인증용 컴포넌트를 빈으로 정의하는 부분이다. 이 요소를 정의하지 않으면 서버를 기동할 때 오류가 발생한다.

 

[프레임워크 아키텍처]

 

1. 클라이언트가 웹 애플리케이션에 요청을 보냄

2. 스프링 시큐리티의 FilterChainProxy 클래스(서블릿 필터)가 요청을 받은 다음 HttpFirewall 인터페이스의 메서드를 호출해서 HttpServletRequest와 HttpServletResponse에 대한 방화벽 기능을 수행

3. FilterChainProxy 클래스는 SecurityFilterChain에 설정돼 있는 보안 필터 클래스에 처리를 위임. 이 필터는 실제로 써블릿 필터 형태로 만들어져 있음

4. SecurityFilterChain에는 여러 보안 필터가 연쇄적으로 연결된 형태로 설정돼 있으며, 앞의 보안 필터가 정상적으로 처리되면 뒤이은 보안필터가 뒤이어 호출되는 방식으로 동작함.

5. 마지막 보안필터의 처리가 정상적으로 종료되면 뒤이어 남은 서블릿 필터나 서블릿이 실행되어 웹 애플리케이션의 리소스에 접근할 수 있게 됨

6. FilterChainProxy 클래스는 웹 애플리케이션에서 반환한 리소스를 클라이언트에 전달

'Web > Spring framework' 카테고리의 다른 글

Spring) 첫 프로젝트 결과물  (0) 2018.07.26
Spring) 마이바티스 부등호  (0) 2018.07.23
Spring) selectKey  (0) 2018.07.23
Spring) poi 를 이용한 엑셀 추출  (0) 2018.07.01
Spring) 웹소켓_2) 멀티채팅  (2) 2018.05.13
Comments