인증과 인가를 담당하는 스프링 하위 프레임워크로서 Filter를 기반으로 동작하며 개발자가 일일이 보안관련 로직을 작성할 필요가 없도록 해준다.
principal, 접근 주체
authentication, 인증
authorize, 인가
Authentication manager, 인증관리자
Access Decision Manager, 접근 결정 관리자
필터들은 굉장히 많다. 따라서 필요한 필터들을 선택하여 사용하자.
SecurityContextPersistenceFilter
LogoutFilter
UsernamePasswordAuthenticationFilter
ExceptionTranslationFilter
FilterSecurityInterceptor
유저가 로그인을 시도
(1 ~ 3)
→ AuthenticationFilter가 유저가 보낸 정보를 가로채고 인증용 객체(UsernamePasswordAuthentication Token)를 생성
→ AuthenticationFilter 인증용 객체를 AuthenticationManager에게 보낸다
(4 ~ 6)
→ AuthenticationManager에서 Authentication에 들어갈 내용(사용자 이름 등)을 채운 후 Authentification 객체를 UserDetailsService에 전달
→ UserDetailsService에서 Authentication과 DB의 데이터를 비교하여 유저임을 확인했다면 UserDetails라는 객체로 가지고와 User Session을 생성하게 된다.
(10)
→ UserDetails를 Spring Security의 인메모리 세션 저장소인 SecurityContext Holder에 저장한다.
→ UserSession ID와 함께 응답을 보낸다.
이후 요청의 cookie의 JSESSIONID를 검증 후 유효 하다면 인증을 하게된다.
Spring Security Authentication Architecture에 대한 정말 너무 좋은 글을 보자!