지금까지 인증처리를 spring security내부에서 제공되는 방식으로 처리했었습니다. 사용자가 로그인 페이지에서 아이디와 패스워드를 입력하고 인증을 요청하면 spring-security내부의 컴포넌트들이 동작하며 인증처리를 실행합니다.
우선은 spring security내부에서 작업을 어떻게 하는지부터 알아야 합니다.
spring security web은 filter기반으로 동작합니다. <http> 엘리먼트의 auto-config속성을 true 설정했을 때 동작하는 Filter의 목록만도 아래와 같습니다.
- SecurityContextPersistenceFilter
- LogoutFilter
- UsernamePasswordAuthenticationFilter
- DefaultLoginPageGeneratingFilter
- BasicAuthenticationFilter
- RequestCacheAwareFilter
- SecurityContextHolderAwareRequestFilter
- AnonymousAuthenticationFilter
- SessionManagementFilter
- ExceptionTranslationFilter
- FilterSecurityInterceptor
지금 이 filter가 어떻게 동작하는지 모든 것을 자세하게 얘기할 필요는 없지만 내부에서 동작하는 중요한 클래스들이 어떤 것들이 있는지 이 클래스들이 어떻게 동작하는지 정도는 알아야 무엇을 커스트마이징 해야 할지 알 수 있겠죠?
auto-config속성을 true로 하면 http요청에 대한 기본 인증, 로그인페이지에서 인증처리, 로그아웃을 자동으로 제공하고 위의 filter들이 이러한 작업을 자동으로 하기 위해 필요한 필터들입니다.
모든 요청을 spring과 spring security기반으로 실행될 수 있도록 하기 위해 우리는
DelegatingFilterProxy를 web.xml에 등록했습니다.
인증처리를 spring security 내부 필터들이 동작하여 처리하며 인증 정보를 Authentication에 담아 AuthenticationManager에 넘깁니다. AuthenticationManager가 spring security안에서 인증을 담당하는 객체입니다. AuthenticationManager가 인증을 관리하지만 인증을 직접적으로 하지않고 AuthenticationProvider를 통해 인증하도록 합니다.
AuthenticationProvider는 여러 가지가 존재하고 여러 개를 이용하여 인증할 수 있습니다.. AuthenticationProvider의 메서드 내부에서 UserDetailsService의 메서드를 호출하여 db와의 인증처리를 실행합니다. 실행이 완료되면 AuthenticationProvider안에서 db에서 조회한 데이터와 사용자가 입력한 패스워드를 비교하며 인증처리를 합니다.

[인증]
UsernamePasswordAuthenticationFilter내부에서 AuthenticationManager의 authenticate메소드를 호출하며 인증을 요청합니다.

AuthenticationManager
인증을 담당하는 객체로 AuthenticationProvider통해 인증하도록 합니다.
AuthenticatiomProvider
매개변수로 전달받은 Authentication객체안에서 저장된 사용자가 입력한 Principal과 Credential데이터를 이용하여 인증을 처리하며 UserDetailsService의 loadUserByUsername메서드를 호출하여 db에 저장된 데이터인지 조회하는 작업을 실행합니다.
UserDetailsService
실제 db와 연동하여 사용자정보를 인증하는 작업을 수행하며 인증이 완료되면 db에서 조회한 DTO객체를 UserDetails타입으로 변경하여 리턴합니다.
UserDetails
UserDetailsService의 loadUserByUsername메서드가 리턴하는 인증정보를 담고 있는 객체입니다.
[인증 데이터]
인증이 완료된 데이터는 권한 정보, UserDetails객체 등을 이용해서 생성된 Authentication객체로 리턴되며 세션에 저장됩니다.
Authentication객체는 SecurityContext에 보관되고 SecurityContext객체는 다시
SecurityContextHolder에 보관되어 저장됩니다.

인증된 정보를 얻고 싶다면 다음과 같이 인증정보를 구해야 합니다.
Authentication authentication = SecurityContextHolder.getContext().getAuthentication()
'보안 > Spring Security' 카테고리의 다른 글
실제 DB에서 인증하기 - step04 권한 테이블을 생성하기 (0) | 2019.09.12 |
---|---|
실제 DB에서 인증하기 - step03 UserDetailsService커스트마이징 (3) | 2019.09.12 |
실제 DB에서 인증하기 - step01 테이블수정(simple) (0) | 2019.09.10 |
[실습] 권한별로 접근 페이지 제어하기 - 스프링EL로 변경하기 (0) | 2019.09.10 |
[실습] 권한별로 접근 페이지 제어하기 - 일반적 방법 (0) | 2019.09.10 |