티스토리 뷰

필터(Filter)  

  클라이언트 요청이 DispatcherServlet에 도착하기 전/후 URL 패턴에 맞는 요청에 대해 작업을 할 수

  있는 기능을 제공한다. 스프링 컨테이너가 관리하는 것이 아닌 웹 컨테이너에 의해 관리된다.

스프링 필터 (Spring Filter)

  SecurityDelegatingFilterProxy 클래스는 스프링 시큐리티의 기능별 필터 클래스를 실행하는 역할을 한다. 

  아래의 설정파일을 보면 모든 요청이 DelegatingFilterProxy를 거쳐가도록 설정한 것을 볼 수 있다.

<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>
스프링 시큐리티 설정
<?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:security="http://www.springframework.org/schema/security"
   xsi:schemaLocation="http://www.springframework.org/schema/security 
   http://www.springframework.org/schema/security/spring-security.xsd
      http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans.xsd">
      
	<bean id="bcryptPasswordEncoder" 
    	class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/>
	<bean id="customLoginSuccess" 
    	class="com.themountaineers.security.CustomLoginSuccessHandler" />
	<bean id="customLogoutSuccess" 
    	class="com.themountaineers.security.CustomLogoutSuccessHandler" />
	<bean id="customUserDetailService" 
    	class="com.themountaineers.security.CustomUserDetailService" />
	<bean id="customAccessDenied" 
    	class="com.themountaineers.security.CustomAccessDeniedHandler" />
	<bean id="egovStrictHttpFirewall" 
    	class="org.springframework.security.web.firewall.StrictHttpFirewall">
		<property name="allowSemicolon" value="true"/>
	</bean>
	
	<security:http auto-config="true" use-expressions="true">
		<security:intercept-url pattern="/group/create" access="hasAnyRole('ROLE_MEMBER')"/>
		<security:intercept-url pattern="/**" access="permitAll"/>
		
		<security:form-login login-page="/member/login" 
        	authentication-success-handler-ref="customLoginSuccess"/>
		<security:logout logout-url="/member/logout" 
        	success-handler-ref="customLogoutSuccess" invalidate-session="true"/>
		<security:access-denied-handler ref="customAccessDenied"/>
		<security:csrf disabled="false"/>
	</security:http>

	<security:authentication-manager>
		<security:authentication-provider user-service-ref="customUserDetailService">
			<security:password-encoder ref="bcryptPasswordEncoder"/>
		</security:authentication-provider>
	</security:authentication-manager>
</beans>
스프링 시큐리티 동작과정 (인증과 인가 과정)

 

  1. 스프링 시큐리티 설정파일인 security-context.xml 에서 /member/login 를 로그인 페이지로 지정하였습니다. DispatcherServlet에게 request가 전달되기 전에 Spring Security 필터인 Authentication Filter는 /member/login 으로 request가 오면 인증과정을 거치게 됩니다. 사용자는 id와 password를 입력하여 request를 전송합니다.
  2. AuthenticationFilter은 사용자의 request에서 id와 password를 추출하고 이를 이용하여 UsernamePasswordAuthenticationToken을 생성한다.
  3. UsernamePasswordAuthenticationToken을 가지고 인증을 거치게 되는데 인증은 AuthenticationManager에게 넘기게된다.
  4. AuthenticationManager는 적절한 인증 Provider을 선택하여 인증을 위임한다.
  5. Provider은 정보를 가지고 오기 위해 UserDetailServices를 이용한다.
  6. UserDetailsServices는 DB에서 해당 ID에 해당하는 정보를 가져온다.
  7. 해당 정보를 Provider에게 넘기면 AuthenticationProvider은 받은 정보와 UsernamePasswordAuthenticationToken을 가지고 내부에서 비교를 한다. 스프링 시큐리티에서 사용되는 암호 알고리즘은 BCryptPasswordEncoder다. BCryptPasswordEncoder는 난수 값과 일반 문자열을 암호화 알고리즘을 이용하여 암호화하는 일방향 암호화 라이브러리이다. Provider은 내부적으로 matches 메서드를 사용하여 일방향 암호화가 된 비밀번호도 비교할 수 있게 해준다. 여튼.. 인증이 완료되면 Authentication 객체를 반환한다.
  8. 9. 10. Authentication 객체를 SecurityContextHolder안에 저장하여 일정 기간동안 로그인 정보를 유지할 수 있게 된다.
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함