스프링 시큐리티(Spring Security)
애플리케이션 보안(인증, 인가, 권한)을 담당하는 스프링 하위 프레임워크
인증(authentication): 사용자의 신원을 입증하는 과정 (로그인)
인가(authorization): 사용자의 접근 권한을 확인하는 과정 (관리자 페이지)
스프링 시큐리티의 다양한 필터들

- SecurityContextPersistenceFilter
- SecurityContext(접근 주체와 인증에 대한 정보를 담고 있는 객체)를 가져오거나 저장하는 역할
- LogoutFilter
- 설정된 로그아웃 URL로 오는 요청을 확인해 해당 사용자를 로그아웃 처리
- UsernamePasswordAuthenticationFilter
- 인증 관리자로, 아이디와 패스워드를 받으면 인증 요청을 위임
- 인증이 성공하면 AuthenticationSuccessHandler, 실패하면 AuthenticationFailureHandler를 실행
- DefaultLoginPageGeneratingFilter
- 사용자가 로그인 페이지를 따로 지정하지 않았을 때 기본으로 설정하는 로그인 페이지 관련 필터
- BasicAuthenticationFilter
- 요청 헤더에 있는 아이디와 패스워드를 파싱해서 인증 요청을 위임
- 인증이 성공하면 AuthenticationSuccessHandler, 실패하면 AuthenticationFailureHandler를 실행
- RequestCacheAwareFilter
- 로그인 성공 후, 관련 있는 캐시 요청이 있는지 확인하고 캐시 요청을 처리
- ex) 비로그인 상태로 방문했던 페이지를 기억해 두었다가, 로그인 이후에 그 페이지로 이동
- SecurityContextHolderAwareRequestFilter
- HttpServletRequest 정보를 감싼다.
- AnonymousAuthenticationFilter
- 필터가 호출되는 시점까지 인증되지 않았다면 익명 사용자 전용 객체인 Anonymous Authentication을 만들어 SecurityContext에 넣어준다.
- SessionManagementFilter
- 인증된 사용자와 관련된 세션 관련 작업을 진행한다.
- 세션 변조 방지 전략을 설정
- 유효 하지 않은 세션에 대한 처리
- 세션 생성 전략을 세움
- ExceptionTranslationFilter
- 요청을 처리하는 중에 발생할 수 있는 예외를 위임하거나 전달
- FilterSecurityInterceptor
- 접근 결정 관리자로 권한 부여 처리를 위임해 접근 제어 결정을 쉽게 한다.
- 이 과정에서는 이미 사용자가 인증되어 있어 유효한 사용자인지 알 수 있기 때문에 인가 관련 설정도 가능하다.
스프링 시큐리티 폼 로그인의 인증 처리 절차

-
사용자가 폼에 아이디와 패스워드를 입력하면, HTTPServletRequest에 아이디와 비밀번호 정보가 전달된다.
- 이 때 AuthenticationFilter가 넘어온 아이디와 비밀번호의 유효성 검사를 실행
-
유효성 검사가 끝나면 실제 구현체인 UsernamePasswordAuthenticationToken을 만들어 넘겨준다.
-
전달받은 인증용 객체인 UsernamePasswordAuthenticationToken을 AuthenticationManager에게 보낸다.
-
UsernamePasswordAuthenticationToken을 AuthenticationProvider에 보낸다.
-
사용자 아이디를 UserDetailService에 보낸다.
- UserDetailService는 사용자 아이디로 찾은 사용자의 정보를 UserDetails 객체로 만들어 AuthenticationProvider에 전달
-
DB에 있는 사용자 정보를 가져온다.
-
입력 정보와 UserDetails의 정보를 비교해 실제 인증 처리를 한다.
-
인증이 완료되면 SecurityContextHolder에 Authentication을 저장
- 인증이 성공하면 AuthenticationSuccessHandler, 실패하면 AuthenticationFailureHandler를 실행