1️⃣ 스프링 시큐리티란?
- 스프링 기반의 애플리케이션의 보안을 담당하는 스프링 하위 프레임워크
- 인증(Authenticate, 누구인지?) 과 인가(Authorize, 어떤것을 할 수 있는지?)를 담당하는 프레임워크
- 서블릿 필터(filter)와 이들로 구성된 필터체인으로의 구성된 위임모델을 사용한다.
- 보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자 입장에서는 일일이 보안관련 로직을 작성하지 않아도 된다.
접근 주체(Principal) : 보호된 리소스에 접근하는 대상
비밀번호 (Credential) : 대상에 접근하는 유저의 비밀번호
💡 서블릿(servlet) 필터
DelegatingFilterProxy
라는 서블릿 필터의 구현체를 제공한다.DelegatingFilterProxy
는 서블릿 매커니즘으로 서블릿의 필터로 등록될 수 있으며, 스프링에 등록된 빈을 가져와서 의존성을 주입할 수도 있다.2️⃣ 스프링 시큐리티 특성
UsenamePasswordAuthenticationFilter
,FilterSecurityInterceptor
가 수행한다.3️⃣ 스프링 시큐리티 구조
- SecurityContextPersistenceFilter :SecurityContextRepository에서 SecurityContext를 로드하고 저장하는 일을 담당함
LogoutFilter
: 로그아웃 URL로 지정된 가상URL에 대한 요청을 감시하고 매칭되는 요청이 있으면 사용자를 로그아웃시킴
UsernamePasswordAuthenticationFilter
: 사용자명과 비밀번호로 이뤄진 폼기반 인증에 사용하는 가상 URL요청을 감시하고 요청이 있으면 사용자의 인증을 진행함
DefaultLoginPageGeneratingFilter
: 폼기반 또는 OpenID 기반 인증에 사용하는 가상URL에 대한 요청을 감시하고 로그인 폼 기능을 수행하는데 필요한 HTML을 생성함
BasicAuthenticationFilter
:HTTP 기본 인증 헤더를 감시하고 이를 처리함
RequestCacheAwareFilter
: 로그인 성공 이후 인증 요청에 의해 가로채어진 사용자의 원래 요청을 재구성하는데 사용됨 SecurityContextHolderAwareRequestFilter HttpServletRequest를 HttpServletRequestWrapper를 상속하는 하위 클래스(SecurityContextHolderAwareRequestWrapper)로 감싸서 필터 체인상 하단에 위치한 요청 프로세서에 추가 컨텍스트를 제공함
AnonymousAuthenticationFilter
: 이 필터가 호출되는 시점까지 사용자가 아직 인증을 받지 못했다면 요청 관련 인증 토큰에서 사용자가 익명 사용자로 나타나게 됨
SessionManagementFilter
: 인증된 주체를 바탕으로 세션 트래킹을 처리해 단일 주체와 관련한 모든 세션들이 트래킹되도록 도움
ExceptionTranslationFilter
: 이 필터는 보호된 요청을 처리하는 동안 발생할 수 있는 기대한 예외의 기본 라우팅과 위임을 처리함
FilterSecurityInterceptor
: 이 필터는 권한부여와 관련한 결정을 AccessDecisionManager에게 위임해 권한부여 결정 및 접근 제어 결정을 쉽게 만들어 줌
4️⃣ 아키텍쳐
[Security] 스프링 시큐리티의 아키텍처(구조) 및 흐름
- 유저가 로그인 요청 (Http Request)
- AuthenticationFilter 에서 UsernamePasswordAuthentication Token 을 생성하여 AuthenticationManager 에 전달
- AuthenticationManager 은 등록된 AuthenticationProvider 들을 조회하여 인증 요구
- AuthenticationProvider 은 UserDetailService 를 통해 입력받은 아이디에 대한 사용자 정보를 User(DB) 에서 조회
- User 에 로그인 요청한 정보가 있는 경우 UserDetails 로 꺼내서 유저 session 생성
- 인증이 성공된 UsernameAuthenticationToken 을 생성하여 AuthenticationManager 로 반환
- AuthenticationManager 은 UsernameAuthenticationToken 을 AuthenticationFilter 로 전달
- AuthenticationFilter 은 전달받은 UsernameAuthentication 을 LoginSuccessHandler 로 전송하고, spring security 인메모리 세션저장소인 SecurityContextHolder 에 저장
- 유저에게 session ID 와 응답을 내려줌