
스프링 시큐리티가 인증받은 사용자의 세부 정보를 저장하는 곳으로, SecurityContext를 포함한다.
인증 주체인(Principal)에 대한 정보를 얻기 원한다면SecurityContextHolder에 접근하여 정보를 얻을 수 있다.
SecurityContext context = SecurityContextHolder.getContext();
Authentication authentication = context.getAuthentication();
String username = authentication.getName();
Object principal = authentication.getPrincipal();
Collection<? extends GrantedAuthority> authorities = authentication.getAuthorities();
SecurityContextHolder는 상세 정보를 저장하기 위해 자동적으로 하나의 ThreadLocal을 사용하는데, 메소드에 직접 SecurityContext를 넘기지 않아도 동일한 스레드라면 항상 SecurityContext에 접근할 수 있다. 기존 principal 요청을 처리한 다음 비워주는 것만 잊지 않으면 ThreadLocal을 사용해도 안전하다. FilterCHainProxy는 항상 SecurityContext를 비워준다.
SecurityContextHolder에 의해 획득 가능하다. Authentication 객체를 포함한다.
AuthenticationManager의 입력으로 사용되어, 인증에 사용할 사용자의 credential을 제공한다.GrantedAuthority로 추상화한다. 예시로 role이나 scopeAuthentication.getAuthorities()메소드로 접근할 수 있다.
객체의 Collection을 리턴하는데, 보통 ROLE_ADMINISTRATOR 같은 "역할"이다.
GrantedAuthority는 일반적으로 어플리케이션 전체에 걸친 권한을 의미하고, 특정 도메인 객체에 국한되지 않는다. 하지만 원한다면 도메인 객체 단위로도 보안 적용이 가능하다.
스프링 시큐리티 필터의 인증 수행 방식을 정의하는 API이다.
Authentication을 SecurityContextHolder에 설정하는건, AuthenticationManager를 호출한 객체(스프링 시큐리티의 필터)가 담당한다. 스프링 시큐리티의 필터를 사용하지 않으면 직접 SecurityContextHolder를 설정하면 된다.
가장 많이 사용하는 구현체는 ProviderManager이다.
ProviderManager는 동작을 AuthenticationProvider List에 위임한다. 모든 AuthenticationProvider는 인증을 성공시키거나, 실패시키거나, 결정을 내릴 수 없는 것으로 판단할 수 있고, 다운스트림에 있는 AuthenticationProvider에 결정을 내릴 수 없음 을 위임할 수 있다.
만약 모든 AuthenticationProvider들이 인증 결정을 내릴 수 없으면 인증은 실패하고, 특정 종류의 Authentication을 처리할 수 있는 ProviderManager가 설정되지 않았음을 나타내는 AuthenticationException인 ProviderNotFoundException을 출력한다.

다수의 AuthenticationProvider는 ProviderManager내에 주입될 수 있고, 특정 유형의 인증을 수행한다. 예를들어 DaoAuthenticationProvider는 사용자명/비밀번호 기반의 인증을, JwtAuthenticationProvider는 JWT 토큰 기반 인증을 수행한다.
클라이언트로부터의 자격 증명을 요청하는 HTTP 응답을 보내기 위해 사용한다.
클라이언트가 리소스를 요청하기 위해 사용자명/비밀번호와 같은 자격 증명을 사전에 포함하는 경우는 스프링 시큐리티가 자격 증명을 요청하기 위한 HTTP 응답을 보낼 필요 없지만,
클라이언트가 접근 권한이 없는 리소스에 인증되지 않는 요청을 하는 경우에는 AuthenticationEntryPoint의 구현체가 클라이언트로부터 자격 증명을 받기 위해 사용된다.
로그인 페이지로 리다이렉트를 수행하거나, WWW-Authenticate 헤더를 응답하는 등 행동을 한다.
사용자의 자격 증명을 인증하는 기본 필터,
자격 증명이 인증 되기 전, 스프링 시큐리티는 관례적으로 AuthenticationEntryPoint를 사용하여 자격 증명을 요청한다.
이후 이 필터가 제출된 인증 요청에 대한 인증을 수행한다.

AbstractAutenticationProcessingFilter가 인증할 HttpServletRequest로 부터 Authentication 생성. 생성된 Authentication의 타입은 AbstractAutenticationProcessingFilter의 subclass에 의해 결정된다.Authentication이 AuthenticationManager로 전달되어 인증된다.SecurityContextHolder가 비워지고, RememberMeServices.loginFail이 호출된다. 만약 remember me가 구성되지 않았다면 아무런 동작도 일어나지 않는다. AuthenticationFailureHandler가 호출된다.SessionAuthenticationStrategy에 새 로그인이 통보되고, Authentication이 SecurityContextHolder에 설정된다. 이후 SecurityContextPersistenceFilter가 HttpSession에 SecurityContext를 저장한다.💡자동로그인 - RememberAuthenticationFilter 인터페이스는 해당 사용자가 이미 로그인 한 적이 있는지 확인하기 위해 RememberMeServices 구현체를 사용한다. RememberMeServices 인터페이는 remember-me 쿠키를 가져오기 위해 HTTP request를 조회하고, 가져온 쿠키는 token 기반이든 persistent 기반이든 검증하기 위해 사용된다. 토큰이 check out 되면 유저는 로그인된다.

1. 사용자의 요청이 AuthenticationFilter에 의해 가로채진다.
2. 인증에 대한 책임이 AuthenticationMangager에게 위임된다.
3. 다양한 AuthentciationProvider 중 특정 AuthenticationProvider를 선택해 사용한다.
4. AuthenticationProvider는 인증하기위한 회원 정보를 호출하기 위해 UserDetailsService를 사용한다.
5. UserDetailsService는 불러온 회원정보를 스프링 시큐리티가 사용할 수 있는 형태인 UserDetails에 저장한다.
6. 저장된 회원 정보를 담은 UserDetails를 AuthenticationProvider에 반환한다.
7. 인증에 성공하면 해당 정보를 SecurityContextHolder 내부에 저장한다. 인증에 실패할 경우 Exception을 발생시킨다.
출처: 스프링 시큐리티 공식 문서