목적
주 목적
- 입력한 ID를 가지고 DB에서 매칭되는 비밀번호를 불러와서, 입력한 비밀번호와 비교하여 일치하는지 검사.
- 유효하다면, 해당 사용자 정보를 어딘가에 저장해두어, 어플리케이션이 이 사용자를 특정 권한을 가진 인증된 사용자라는 것을 검사하게 함.
부 목적
- 다양한 인증 방식을 유연하게 적용할 수 있도록 함.
흐름

기본적으로 스프링시큐리티는 필터에서부터 작업을 시작합니다. 필터는 아래 그림처럼 Spring Context로 진입하기 전과 후에 SevletContext에서 공통적인 전처리 / 후처리 작업을 진행하는 역할을 합니다.
그래서 이 필터는 서블릿임으로 스프링 빈을 비롯한 스프링 기술들을 사용할 수 없었지만, 더욱 복잡한 기능을 위하여 사용할 필요가 생기게 됐습니다.
DelegatingFilterProxy
그래서 Spring 1.2부터 DelegatingFilterProxy 가 등장하게 됐습니다. 이는 서블릿에 필터로 등록된 프록시용 필터이며, 요청이 들어오면, 스프링 빈으로 등록된 필터로 요청을 위임합니다. 이 스프링빈 필터들은 직접적으로 서블릿 필터로 등록되어 있지는 않고, 스프링 내부적으로만 사용됩니다.
하지만, SpringBoot에서는 웹서버를 직접 관리하기 때문에, 서블릿과 빈을 이어주는 역할인 DelegatingFilterProxy가 필요없어졌다고 합니다.
FlterChainProxy
이는 DelegatingFilterProxy로부터 요청을 위임받아 해당 요청에서 필요한 적절한 필터를 선정하여 호출하는 필터 빈입니다.
아래와 같이 스프링 시큐리티가 여러 필터를 제공하고 있습니다.
- WebAsyncManagerIntergrationFilter
- SecurityContextPersistenceFilter
- HeaderWriterFilter
- CsrfFilter
- LogoutFilter
- UsernamePasswordAuthenticationFilter
- DefaultLoginPageGeneratingFilter
- DefaultLogoutPageGeneratingFilter
- BasicAuthenticationFilter
- RequestCacheAwareFilter
- SecurityConetextHolderAwareRequestFilter
- AnnoymousAuthenticationFilter
- SessionManagementFilter
- ExceptionTranslationFilter
- FilterSecurityInterceptor
UsernamePasswrodAuthenticationFilter
스프링시큐리티가 제공하는 여러 필터 중 하나이며, 일반적으로 로그인 폼에서 제출되는 Username과 Password를 통한 인증을 처리합니다. FilterChainProxy가 사용자의 요청을 보고 판단하여 이 필터에게 보안처리를 위임합니다.
1) UsernamePasswordAuthenticationToken 을 생성
이는 SpringSecurity에서 인증을 표현하는 Authenication 인터페이스의 구현체이며, 사용자의 아이디와 패스워드 정보를 담는 객체입니다. UsernamePasswrodAuthenticationFilter에서 이 객체에 아이디와 패스와드를 담아 실제로 인증 작업을 처리할 클래스에 위임합니다.
이 클래스에는 다음의 필드가 있습니다.
- principal : Username
- credential: Password
- authorities: 인증 완료 후 할당되는 사용자의 권한 목록
2) SecurityContext 에 인증 정보 저장
인증 작업 위임 후, 인증이 완료된 Authentication 객체를 Security Context에 저장합니다. 이후 인가작업을 할 때, 사용자의 ID가 SecurityContext에 있는지 확인하여 처리하게 됩니다.
3) AuthenticationManger에게 인증처리 위임
인증처리를 총괄하는 AuthenticationManger 인터페이스이며, 이것의 구현체에게 생성한 token과 함께 인증처리를 위임합니다.
ProviderManager
AuthenticationManger의 구현체이며, 적절한 AuthenticationProvider를 찾아 인증처리를 위임합니다.
AuthenticationProvider는 실질적인 인증처리를 하는 컴포넌트입니다.
인증에 성공하면, 인증에 사용된 credential을 제거합니다.
DaoAuthenticationProvider
AUtehnficationProvider 인터페이스의 구현 클래스인 AbstractUserDetailsAuthenticationProvider의 확장클래스입니다. Username/Password 기반의 인증처리를 담당합니다.
1) UserDetailService로부터 UserDetail 조회
- UserDatail : DB 등의 저장소에 저장된 사용자의 Username과 Password 그리고 권한 정보를 담는 컴포넌트.
- UserDetailService: UserDetail 객체를 DB 등의 저장소에서 조회하는 컴포넌트
2) PasswordEncoder로 암호화하여, UserDetail과 비교
- Password를 암호화하는 PasswordEncoder를 DI 받습니다. 개발자가 지정하지 않으면, SpringSecurity가 권장하는 것으로 DI해줍니다.
- DI받는 PasswordEncoder를 통해 UsernamePasswordAuthenticationToken 의 credential을 암호화하여, 조회한 UserDetail의 Password와 비교하여 인증처리합니다.
인증 완료된 Authentication은 다시 호출된 순서에 따라 UsernamePasswrodAuthenticationFilter까지 리턴되어, 최종적으로 ****SecurityContext에 저장됩니다.
참조
[Spring] 필터(Filter)가 스프링 빈 등록과 주입이 가능한 이유(DelegatingFilterProxy의 등장) - (2)
'Back-end > Spring Boot' 카테고리의 다른 글
| [JPA] Infinite Recursion 해결법 (0) | 2022.10.23 |
|---|---|
| [SpringBoot] HttpSecurity 보안 설정 정리 (0) | 2022.10.13 |
| [SpringBoot] WebClient 이해하기(feat. block/non-block과 동기/비동기) (0) | 2022.08.01 |
| [SpringBoot] 빌더 어노테이션(@Builder)와 빌더 패턴 (0) | 2022.07.22 |
| [SpringBoot] 스프링부트 이해하기 - 6편 리플렉션과 어노테이션으로 디스패처 필터 만들어보기 (0) | 2022.07.21 |