1. 개요

이 빠른 사용방법(예제)에서는  Spring Boot 애플리케이션에서 Spring Security의 인증 실패 처리를 사용자 지정하는 방법을 설명합니다. 목표는  양식 로그인 방식 을 사용하여 사용자를 인증하는 것 입니다.

Spring Boot 의 Spring Security 및  Form Login  에  대한 소개는  각각 this  및 this article 을 참조하십시오 .

2. 인증 및 승인

인증권한 부여 는 시스템에 대한 액세스 권한을 부여할 때 필수적이고 중요한 역할을 하기 때문에 종종 함께 사용됩니다.

그러나 요청의 유효성을 검사할 때 다른 의미를 가지며 다른 제약 조건을 적용합니다.

  • 인증  – 인증에 우선  합니다.  받은 자격 증명의 유효성을 검사하는 것입니다. 여기에서 사용자 이름과 비밀번호가 애플리케이션이 인식하는 것과 일치하는지 확인합니다.
  • 인증 성공적으로 인증된 사용자가 애플리케이션의 특정 기능에 액세스할 수 있는 권한이 있는지 확인하는 것입니다.

인증권한 부여 실패 처리를 모두 사용자 정의할 수 있지만 이 애플리케이션에서는 인증 실패에 중점을 둘 것입니다.

3. Spring Security의 AuthenticationFailureHandler

Spring Security 는 기본적으로 인증 실패를 처리하는 구성 요소를 제공합니다.

그러나 기본 동작이 요구 사항을 충족하기에 충분하지 않은 시나리오에 있는 것은 드문 일이 아닙니다.

이 경우 자체 구성 요소를 만들고  AuthenticationFailureHandler 인터페이스를 구현하여 원하는 사용자 지정 동작을 제공할 수 있습니다.

public class CustomAuthenticationFailureHandler 
  implements AuthenticationFailureHandler {
 
    private ObjectMapper objectMapper = new ObjectMapper();

    @Override
    public void onAuthenticationFailure(
      HttpServletRequest request,
      HttpServletResponse response,
      AuthenticationException exception) 
      throws IOException, ServletException {
 
        response.setStatus(HttpStatus.UNAUTHORIZED.value());
        Map<String, Object> data = new HashMap<>();
        data.put(
          "timestamp", 
          Calendar.getInstance().getTime());
        data.put(
          "exception", 
          exception.getMessage());

        response.getOutputStream()
          .println(objectMapper.writeValueAsString(data));
    }
}

기본적으로  Spring  은 오류에 대한 정보가 포함 된 요청 매개변수 를 사용하여 사용자를 다시 로그인 페이지로 리디렉션 합니다.

이 애플리케이션에서는 오류에 대한 정보와 오류 발생의 타임스탬프가 포함된 401 응답을 반환합니다.

기본 구성 요소 외에도  Spring 에는 원하는 작업에 따라 활용할 수 있는 구성 요소를 사용할 준비가 된 다른 구성 요소가 있습니다.

  • DelegatingAuthenticationFailureHandler 는 AuthenticationException  하위 클래스를 다른  AuthenticationFailureHandlers 에  위임  합니다. 즉, AuthenticationException 의 다른 인스턴스에 대해 다른 동작을 생성할 수 있습니다. 
  • ExceptionMappingAuthenticationFailureHandler 는 AuthenticationException의  전체 클래스 이름 에 따라 사용자를 특정 URL로 리디렉션합니다. 
  • ForwardAuthenticationFailureHandler  는  AuthenticationException 유형에 관계없이 사용자를 지정된 URL로 전달합니다.
  • SimpleUrlAuthenticationFailureHandler 는 기본적으로 사용되는 구성 요소이며, 지정된 경우 사용자를  failureUrl  로 리디렉션 합니다. 그렇지 않으면 단순히 401 응답을 반환합니다.

이제 Custom형  AuthenticationFailureHandler 를 생성했으므로 애플리케이션을 구성하고 Spring의  기본 핸들러 를 재정의하겠습니다  .

@Configuration
@EnableWebSecurity
public class SecurityConfiguration {

    @Bean
    public InMemoryUserDetailsManager userDetailsService() {
        UserDetails user1 = User.withUsername("user1")
            .password(passwordEncoder().encode("user1Pass"))
            .roles("USER")
            .build();
        return new InMemoryUserDetailsManager(user1);
    }

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .anyRequest()
            .authenticated()
            .and()
            .formLogin()
            .failureHandler(authenticationFailureHandler())
        return http.build();
    }

    @Bean
    public AuthenticationFailureHandler authenticationFailureHandler() {
        return new CustomAuthenticationFailureHandler();
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

failureHandler() 호출 에 주목하십시오.  여기 에서 기본 구성 요소를 사용하는 대신 사용자 지정 구성 요소를 사용하도록 Spring 에 알릴 수 있습니다 .

4. 결론

이 예제에서는 Spring의 AuthenticationFailureHandler 인터페이스를 활용하여 애플리케이션의 인증 실패 핸들러를 사용자 정의  했습니다.

이 예제의 구현은 Github 프로젝트 에서 찾을 수 있습니다 .

로컬에서 실행할 때  localhost:8080 에서 애플리케이션에 액세스하고 테스트할 수 있습니다.

Security footer banner