
지금까지의 주먹구구식 스프링 시큐리티 사용에서 벗어나고자, 스프링 시큐리티에 대해 자세하게 공부를 해보고자 합니다.
최신 버전인 스프링 시큐리티 6 버전을 기준으로 공부합니다.
스프링 프레임워크에서 인증(Authentication) 및 인가(Authorization), 권한 관리 등의 기능을 제공하는 프레임워크입니다.
스프링 시큐리티에서는 필터(Filter)와, 필터로 이루어진 필터 체인의 흐름에 따라 인증과 인가를 처리합니다.

SecurityContextPersistenceFilter:SecurityContextRepository에서 SecurityContext를 로드하고 저장하는 일을 담당.LogoutFilter: 로그아웃 URL로 지정된 가상 URL에 대한 요청을 감시하고 매칭되는 요청이 있으면 로그아웃 시킴.UsernamePasswordAuthenticationFilter: Username, PW로 이루어진 폼 기반 인증에 사용하는 가상 URL 요청을 감시하고, 요청이 있으면 사용자의 인증을 진행DefaultLoginPageGenerating Filter: 폼 기반, Open ID 기반 인증에 사용하는 가상 URL에 대한 요청을 감시하고 로그인 폼 기능을 수행하는데 필요한 HTML을 생성함.BasicAuthenticationFilter: HTTP 기본 인증 헤더를 감시하고 이를 처리함.RequestCacheAwareFilter: 로그인 성공 이후 인증 요청에 의해 가로채어진 사용자의 원래 요청을 재 구성하는데 사용됨.AnonymousAuthenticationFilter: 이 필터 호출 시점가지 인증을 받지 못했다면, 인증토큰에서 사용자가 익명으로 나타남SessionManagementFilter: 인증된 주체를 바탕으로 세션 트래킹을 처리해 단일 주체와 관련한 모든 세션들이 트래킹 되도록 도움을 줌.ExceptionTranslationFilter: 보호된 요청을 처리하는동안 발생할 수 있는 예외의 기본 라우팅과 위임을 처리.FilterSecurityIntercptor: 권한부여와 관련한 결정을 AccessDecisionManager에게 위임해 권한부여 결정 및 접근 제어 결정을 쉽게 만들어 줌.
Principal(내가 누구인지 / 로그인 ID에 해당하는 값), Credential(인증자격 / 비밀번호에 해당하는 값),Authorities(권한정보 / ROLE에 해당하는 값)의 세 객체로 구성되어있다.SecurityContextHolder는 SecurityContext객체를 Thread-local로 제공하여, 같은 Thread에서는 매개로 주고받지 않아도 인증정보에 접근이 가능하다.Spring Security는 Dispatcher Servlet으로 가기 전에 요청을 가로 채 Filter에서 인증과 인가를 처리합니다.

AuthenticationFilter가 정보를 인터셉트하여 UsernamePasswordAuthentication Token(Authentication 객체) 생성하여 AuthenticationManager에게 Authentication 객체를 전달.AuthenticationManager 인터페이스를 거쳐 AutheticationProvider에게 (2)의 정보 전달(Authentication 형태), 등록된 AuthenticationProvider를 조회하여 인증 요구AuthenticationProvider는 UserDetailsService를 통해 입력받은 (3)의 사용자 정보를 DB에서 조회supports() 메소드를 통해 실행 가능한지 체크authenticate() 메소드를 통해 DB에 저장된 이용자의 정보와 입력한 로그인 정보 비교UserDetailsService 의 loadUserByUsername() 메소드를 통해 불러옴Authentication 객체(UsernameAuthentication Token)Authentication 반환AuthenticationManger는 Authentication 객체를 AuthenticationFilter로 전달AuthenticationFilter는 전달받은 Authentication 객체를 LoginSuccessHandler로 전송하고 SecurityContextHolder에 담음AuthenticationSuccessHandle, 실패기 AuthenticationFailureHandle 실행