SpringSecurity 6.0 내부 흐름 이해

jkky98·2025년 1월 13일
0

SpringSecurity

목록 보기
2/2

전체 흐름

logging:
  pattern:
    console: ${LOGPATTERN_CONSOLE:%green(%d{HH:mm:ss.SSS}) %blue(%-5level) %red([$thread]) %yellow(%logger{15}) - %msg%n}
  level:
    org:
      springframework:
        security: ${SPRING_SECURITY_LOG_LEVEL:TRACE}

Spring Security의 실행 흐름을 알아보기 위해 로그 레벨을 TRACE로 둔다.

우리가 수행할 요청은 자격증명 제출이다. 인증 프로세스를 우선적으로 파악하도록 한다. 스프링 시큐리티는 모든 요청에 대해 아래처럼 필터 여러개를 거치게 한다.

현재 스프링 시큐리티 설정 코드는 아무것도 적지 않았으며, 디폴트 동작을 따른다.

Spring Security 의존성을 추가하고 별도의 보안 설정을 작성하지 않은 경우, Spring Security는 기본 필터 체인(Default Security Filter Chain)을 1개 제공하여 애플리케이션을 보호한다.

즉 1개의 디폴트 필터체인안에 들어있는 16개의 필터들이 로그에 떠있다고 보면 된다. 요청은 이 모든 필터를 거치게 된다.

우리의 요청이 자격 증명 제출에 관한 것이라면 UsernamePasswordAuthenticationFilter가 이를 처리하게 된다. 그러나 요청이 자격 증명 제출이 아닌 인가 과정에 해당한다면, 이 필터는 요청을 처리하지 않고 곧바로 다음 필터로 넘긴다.

UsernamePasswordAuthenticationFilter의 내부 흐름

예시 요청을 자격증명 제출(폼 인증 방식)이므로 이가 어떻게 동작하는지 확인해보자.

위 그래프는 UsernamePasswordAuthenticationFilter와 같은 인증요청(자격증명 제출)에 대해 인증을 수행해주는 필터들이 어떤 동작을 하는지 나타내준다.

!!주의 : 모든 필터의 프로세스가 아니라 인증요청 필터에 대한 프로세스이다.

이제부터 UsernamePasswordAuthenticationFilter인증용 필터라고 언급하겠다.

인증용 필터는 자격 증명 제출이라는 조건을 만족할 경우(예: 엔드포인트가 기본 /login이거나, 커스텀 설정된 경로 등 여러 조건 포함), 인증시도 객체인 Authentication 객체를 생성한다.

이 객체는 AuthenticationManager로 전달된다. 이 매니저는 여러 Provider에 인증시도 객체로 하여금 최종적인 인증을 시도한다. Provider는 예로 폼 인증용, oauth2용, jwt용 등 여러 프로바이더들이 존재할 수 있고 현재는 폼 인증용이므로 폼인증에 관한 Provider가 UserDetailsManager(데이터 보관소로부터 유저를 가져옴)PasswordEncoder로 하여금 인증승인을 받아낸다.

인증 과정이 성공하면, AuthenticationManager는 인증된 Authentication 객체를 반환하며, 이는 SecurityContext에 저장된다. 이때 Authentication 객체의 isAuthenticated 속성이 true로 설정되고, 세션 기반 인증인 경우 SecurityContext가 세션에 저장된다.

인증 과정이 실패할 경우 즉시 예외를 발생시키며 SecurityContext에 Authentication이 당연히 저장되지 않으며 필터과정은 끝이나고 클라이언트로 예외를 반환한다.

인증 과정이 성공적으로 모두 마무리되었다면 요청은 다음 필터인 DefaultResourceFilter(8번째 필터)로 넘어간다.

필터 체인은 여러개 등록할 수 있으며 요청마다 어떤 필터체인을 타게 할 것인지 개발자가 정할 수 있다.

필터 체인안의 모든 필터를 성공적으로 통과할 경우 드디어 요청이 컨트롤러단(스프링)으로 넘어가게 된다.

profile
자바집사의 거북이 수련법

0개의 댓글