Spring Security는 Spring과는 별개로 작동하는 보안담당 프레임워크
입니다.
크게 두 가지의 동작을 수행
Authentication(인증) : 특정 대상이 누구
인지 확인하는 절차이다.
Authorization(권한) : 인증된 주체가 특정한 곳에 접근 권한
을 확인하는 것이다.
위 과정에서 사용된 UsernamePasswordAuthenticationFilter는 접근 권한을 확인하고 인증이 실패한 경우 로그인 폼이라는 화면을 보내는 역할을 수행합니다.
웹에서 스프링 시큐리티는 기본적으로 아래와 같이 필터 기반으로 동작한다. 많은 필터들이 존재하며, DispatcherServlet 을 호출하기 전에 거치게 된다.
필터들은 위의 그림과 같이 체인되어 있다. 임의의 필터를 생성하고 원하는 필터 앞이나 뒤에 삽입하면 될 듯 하다.
Spring Security의 의존성을 추가한 경우 위와 같이 WebSecurityConfigurerAdapter클래스가 실행되게 됩니다.
WebSecurityConfigurerAdapter클래스는 스프링 시큐리티의 웹 보안 기능의 초기화 및 설정들을 담당하는 내용이 담겨있으며 내부 적으로 getHttp()메서드가 실행될 때 HTTPSecurity 클래스
를 생성하게 됩니다.
이때의 HTTPSecurity는 인증/인가 API들의 설정을 제공합니다.
우리가 인증/인가의 설정을 바꾸고자 한다면 WebSecurityConfigurerAdapter클래스를 상속한 SecurityConfig클래스를 생성하여 configure(HttpSecurity http)메서드를 override하며 설정해야합니다.
스프링 시큐리티는 필터를 기반으로 수행된다.
필터와 인터셉터의 차이는 실행되는 시점의 차이이다.
- 필터는 dispatcher servlet으로 요청이 도착하기 전에 동작한다.
- 인터셉터는 dispatcher servlet을 지나고 controller에 도착하기 전에 동작한다.
SecurityContextPersistenceFilter
: SecurityContextRepository에서 SecurityContext를 가져오거나 저장하는 역할을 한다.
LogoutFilter
: 설정된 로그아웃 URL로 오는 요청을 감시하며, 해당 유저를 로그아웃 처리
(UsernamePassword)AuthenticationFilter
: (아이디와 비밀번호를 사용하는 form 기반 인증) 설정된 로그인 URL로 오는 요청을 감시하며, 유저 인증 처리
- AuthenticationManager를 통한 인증 실행
- 인증 성공 시, 얻은 Authentication 객체를 SecurityContext에 저장 후 AuthenticationSuccessHandler 실행
- 인증 실패 시, AuthenticationFailureHandler 실행
DefaultLoginPageGeneratingFilter
: 인증을 위한 로그인폼 URL을 감시한다.
BasicAuthenticationFilter
: HTTP 기본 인증 헤더를 감시하여 처리한다.
RequestCacheAwareFilter
: 로그인 성공 후, 원래 요청 정보를 재구성하기 위해 사용된다.
SecurityContextHolderAwareRequestFilter
: HttpServletRequestWrapper를 상속한 SecurityContextHolderAwareRequestWapper 클래스로 HttpServletRequest 정보를 감싼다. SecurityContextHolderAwareRequestWrapper 클래스는 필터 체인상의 다음 필터들에게 부가정보를 제공한다.
AnonymousAuthenticationFilter
: 이 필터가 호출되는 시점까지 사용자 정보가 인증되지 않았다면 인증토큰에 사용자가 익명 사용자로 나타난다.
SessionManagementFilter
: 이 필터는 인증된 사용자와 관련된 모든 세션을 추적한다.
ExceptionTranslationFilter
: 이 필터는 보호된 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달하는 역할을 한다.
ExceptionTranslationFilter
: 이 필터는 보호된 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달하는 역할을 한다.
앞서 말했듯이 우리가 인증/인가의 설정을 바꾸고자 한다면 아래와 같아 WebSecurityConfigurerAdapter를 상속한 SecurityConfig클래스를 생성하여 configure(HttpSecurity http)메서드를 override하며 설정해야합니다.
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
UserDetailsService userDetailsService;
@Override
protected void configure(HttpSecurity http) throws Exception {
// 인가 정책 설정
http
.authorizeRequests() // 요청에 대한 보안 검사 실행
.anyRequest().authenticated(); // 어떠한 요청에도 인증을 받도록 설정
// 인증 정책 설정
http
.formLogin(); // formLogin인증 방식을 사용하도록 설정
}
}