스터디-Spring

[스프링 시큐리티] Authentication과 SecurityContextHolder

일태우 2022. 1. 11. 23:51

AuthenticationManager가 인증을 마친 뒤 리턴 받은 Authentication 객체는?

 

SecurityContextPersistenceFilter -> CsrfFilter -> LogoutFilter -> AbstractAuthenticationProcessingFilter-> UsernamePasswordAuthenticationFilter

 

SecurityContextPersistenceFilter

  • SecurityContext를 HTTP session에서 캐시(기본 전략)하여 여러 요청에서 Authentication을 공유하는 필터
  • SecurityContextRepository를 교체하여 세션을 HTTP session이 아닌 다른 곳에 저장하는 것도 가능

 

UsernamePasswordAuthenticationFilter

  • 폼 인증을 처리하는 필터

 

AbstractAuthenticationProcessingFilter

  • 인증 프로세스를 위한 Abstract 클래스
  • 해당 클래스를 상속받은 클래스에 구현된 attemptAuthentication 메서드를 이용하여 인증을 처리함
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,
			Authentication authResult) throws IOException, ServletException {
		SecurityContext context = SecurityContextHolder.createEmptyContext();
		context.setAuthentication(authResult);
		SecurityContextHolder.setContext(context);
		if (this.logger.isDebugEnabled()) {
			this.logger.debug(LogMessage.format("Set SecurityContextHolder to %s", authResult));
		}
		this.rememberMeServices.loginSuccess(request, response, authResult);
		if (this.eventPublisher != null) {
			this.eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent(authResult, this.getClass()));
		}
		this.successHandler.onAuthenticationSuccess(request, response, authResult);
	}

인증이 완료되면 해당 메서드에서 SecurityContextHolder에 인증정보를 set함