본문 바로가기
Framework/Spring

[Spring / ToyProject] Spring Security 설정 - 2_2

by wo__ongii 2025. 1. 16.
728x90

1. LoginSuccessJWTProvideHandler.java 구현

LoginSuccessJWTProvideHandler는 로그인 성공 시 실행되는 핸들러로 주로 JWT 토큰을 발급하거나, 로그인 성공 후 다른 처리를 해야 할 때 사용된다. UserDetails 객체를 통해 인증된 사용자 정보를 확인하고, 필요한 후속 처리를 할 수 있다.

@Slf4j
public class LoginSuccessJWTProvideHandler extends SimpleUrlAuthenticationSuccessHandler {
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
            Authentication authentication) throws IOException, ServletException {
        UserDetails userDetails = (UserDetails) authentication.getPrincipal();
        log.info("로그인 성공: JWT 발급 - username: {}", userDetails.getUsername());
        response.getWriter().write("success");
    }
}

 

  • 로그인 성공 시 호출되는 메서드: onAuthenticationSuccess 메서드는 사용자가 인증에 성공한 후 호출된다. 이 메서드에서 사용자 정보를 처리하고, 성공적인 로그인 결과를 클라이언트에게 응답으로 전달한다.
  • UserDetails 추출: authentication.getPrincipal()을 통해 인증된 사용자의 세부 정보를 UserDetails 객체로 가져온다. 이 객체에는 사용자 이름, 비밀번호, 권한 등이 포함되어 있다.
  • 응답 처리: response.getWriter().write("success")는 클라이언트에게 "success"라는 메시지를 반환한다.

2. LoginFailureHandler.java

LoginFailureHandler는 로그인 실패 시 실행되는 핸들러로 인증에 실패했을 때 클라이언트에게 실패 응답을 전달하는 역할을 한다.

@Slf4j
public class LoginFailureHandler extends SimpleUrlAuthenticationFailureHandler {
    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
            AuthenticationException exception) throws IOException, ServletException {
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); // 401인증 실패
        response.getWriter().write("fail");
        log.info("로그인 실패");
    }
}

 

  • 로그인 실패 시 호출되는 메서드: onAuthenticationFailure 메서드는 사용자가 인증에 실패했을 때 호출된다. 이 메서드에서 실패 원인을 처리하고, 실패 응답을 클라이언트에게 반환한다.
  • response.setStatus(HttpServletResponse.SC_UNAUTHORIZED): HttpServletResponse.SC_UNAUTHORIZED는 HTTP 상태 코드 401("인증 실패"를 의미)을 설정한다. 클라이언트는 이 응답을 받아 인증 실패를 알 수 있다.
  • 응답 처리: response.getWriter().write("fail")는 클라이언트에게 "fail" 메시지를 반환한다. 실제로는 로그인 실패에 대한 보다 구체적인 오류 메시지나 코드가 포함될 수 있다.

3. WebSecurityConfig.java 수정

@Bean
public JsonUsernamePasswordAuthenticationFilter jsonUsernamePasswordAuthenticationFilter() throws Exception {
    JsonUsernamePasswordAuthenticationFilter jsonUsernamePasswordAuthenticationFilter = new JsonUsernamePasswordAuthenticationFilter(objectMapper);
    jsonUsernamePasswordAuthenticationFilter.setAuthenticationManager(authenticationManager());

    // 로그인 성공, 실패 핸들러 추가
    jsonUsernamePasswordAuthenticationFilter.setAuthenticationSuccessHandler(loginSuccessJWTProvideHandler());
    jsonUsernamePasswordAuthenticationFilter.setAuthenticationFailureHandler(loginFailureHandler());
    return jsonUsernamePasswordAuthenticationFilter;
}
  • jsonUsernamePasswordAuthenticationFilter.setAuthenticationSuccessHandler(loginSuccessJWTProvideHandler())를 사용하여 로그인 성공 시 LoginSuccessJWTProvideHandler가 호출되도록 설정한다.
  • jsonUsernamePasswordAuthenticationFilter.setAuthenticationFailureHandler(loginFailureHandler())를 사용하여 로그인 실패 시 LoginFailureHandler가 호출되도록 설정한다.

이 설정을 통해 사용자가 JSON 형식으로 로그인 시도를 하면, 성공/실패 여부에 따라 각각의 핸들러가 실행되어 응답을 처리한다.

728x90
반응형