Spring Security / / 2024. 12. 18. 15:14

Authentication Filter, Authentication Manager, Authentication Provider

Authentication Filter, Authentication Manager, Authentication ProviderSpring Security의 핵심 컴포넌트로서 인증(Authentication) 과정을 처리하는 역할을 합니다. 각각의 개념과 역할을 자세히 설명해 드리겠습니다.


1. Authentication Filter (인증 필터)

정의

  • Authentication Filter는 사용자의 요청에서 인증 정보를 추출하고 인증을 시도하는 Filter입니다.
  • 주로 HTTP 요청의 Authorization 헤더, 폼 데이터, 쿠키 등에서 인증 정보를 가져옵니다.

역할

  1. 클라이언트 요청에서 인증 정보(예: 사용자명/비밀번호, 토큰)를 추출합니다.
  2. AuthenticationManager에 인증 처리를 위임합니다.
  3. 인증 결과에 따라 다음 단계로 요청을 전달하거나 인증 실패를 처리합니다.

주요 필터 예시

Spring Security가 제공하는 기본 Authentication Filter는 다음과 같습니다:

  1. UsernamePasswordAuthenticationFilter

    • 폼 기반 로그인 처리 필터입니다.
    • POST /login 요청에서 사용자명(username)과 비밀번호(password)를 추출합니다.
  2. BearerTokenAuthenticationFilter

    • JWT 또는 Bearer Token 인증 처리 시 사용됩니다.
    • Authorization 헤더에서 Bearer 토큰을 추출합니다.
  3. BasicAuthenticationFilter

    • HTTP Basic 인증 처리를 담당합니다.

Authentication Filter 작동 예시

public class CustomAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) {
        // 요청에서 사용자명과 비밀번호 추출
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        UsernamePasswordAuthenticationToken authRequest = 
                new UsernamePasswordAuthenticationToken(username, password);

        // AuthenticationManager에 인증 요청 위임
        return this.getAuthenticationManager().authenticate(authRequest);
    }
}

2. Authentication Manager (인증 관리자)

정의

  • AuthenticationManager는 인증 요청을 받아 여러 AuthenticationProvider에게 인증을 시도하도록 위임하는 중앙 관리자입니다.
  • ProviderManagerAuthenticationManager의 대표 구현체입니다.

역할

  1. authenticate() 메서드를 통해 인증 요청을 받습니다.
  2. 요청을 각 AuthenticationProvider에게 전달하여 인증을 시도합니다.
  3. 인증 성공 시 Authentication 객체를 반환합니다.
  4. 인증 실패 시 AuthenticationException을 던집니다.

작동 구조

  1. AuthenticationManager
  2. 여러 AuthenticationProvider 중에서 적합한 Provider에게 위임 →
  3. Provider가 인증 성공 시 Authentication 객체 반환

AuthenticationManager 설정 예시

@Bean
public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
    return http.getSharedObject(AuthenticationManagerBuilder.class)
               .authenticationProvider(customAuthenticationProvider())
               .build();
}

3. Authentication Provider (인증 제공자)

정의

  • AuthenticationProvider는 실제 인증 로직을 담당하는 컴포넌트입니다.
  • 특정 타입의 Authentication 객체를 처리할 수 있습니다.

역할

  1. supports() 메서드를 통해 자신이 처리할 수 있는 Authentication 타입인지 확인합니다.
  2. authenticate() 메서드를 통해 인증 로직을 실행합니다.
  3. 인증 성공 시 Authentication 객체를 반환합니다.
  4. 인증 실패 시 AuthenticationException을 던집니다.

Custom AuthenticationProvider 예시

@Component
public class CustomAuthenticationProvider implements AuthenticationProvider {

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String username = authentication.getName();
        String password = authentication.getCredentials().toString();

        // 사용자 인증 로직 (예: DB 조회, 비밀번호 검증)
        if ("user".equals(username) && "password".equals(password)) {
            return new UsernamePasswordAuthenticationToken(username, password, List.of(new SimpleGrantedAuthority("ROLE_USER")));
        } else {
            throw new BadCredentialsException("인증 실패: 사용자명 또는 비밀번호 불일치");
        }
    }

    @Override
    public boolean supports(Class<?> authentication) {
        // 이 Provider가 UsernamePasswordAuthenticationToken만 처리하도록 지정
        return UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication);
    }
}

4. 전체 흐름 정리

  1. Authentication Filter:

    • HTTP 요청에서 인증 정보를 추출하고 AuthenticationManager에 전달합니다.
  2. AuthenticationManager:

    • 인증 요청을 여러 AuthenticationProvider 중 적합한 Provider에 위임합니다.
  3. AuthenticationProvider:

    • 실제 인증 로직을 수행하고 Authentication 객체를 반환하거나 예외를 던집니다.
  4. SecurityContext:

    • 인증 성공 시 반환된 Authentication 객체를 SecurityContext에 저장하여 인증 상태를 유지합니다.

정리

  • Authentication Filter: 요청에서 인증 정보를 추출하고 인증을 시도하는 필터입니다.
  • Authentication Manager: 여러 AuthenticationProvider를 관리하며 인증 처리를 위임하는 관리자입니다.
  • Authentication Provider: 실제 인증 로직을 수행하며, 특정 타입의 Authentication을 처리합니다.

'Spring Security' 카테고리의 다른 글

Authentication Resolver  (0) 2024.12.18
SecurityContext  (0) 2024.12.18
RFC6265  (0) 2024.10.31
SameSite  (0) 2024.10.31
CORS(Cross-Origin Resource Sharing)의 Simple Request와 Non-Simple Request  (0) 2024.10.31
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유