Spring Security + JWT 4

johaS2·2025년 2월 4일

LoginFilter 구현

public class LoginFilter extends UsernamePasswordAuthenticationFilter {

    // AuthenticationManager를 주입받아서 검증
    // AuthenticationManager 는 인증을 담당하는 핵심 요소! 사용자 정보를 검증하는 일을 함
    private final AuthenticationManager authenticationManager;

    public LoginFilter(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
        //클라이언트 요청에서 username, password 추출
        String username = obtainUsername(request);
        String password = obtainPassword(request);

        System.out.println(username);

        //스프링 시큐리티에서 username과 password를 검증하기 위해서는 token에 담아야 함
        UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken(username, password, null);

        //token에 담은 것을 검증을 위한 AuthenticationManager로 전달 - 자동으로 검증을 진행함
        return authenticationManager.authenticate(authToken);
    }

    //로그인 성공시 실행하는 메소드 (여기서 JWT를 발급하면 됨)
    @Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authentication) {

    }

    //로그인 실패시 실행하는 메소드
    @Override
    protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) {

    }
}

LoginFilter?

  • LoginFilter는 사용자 인증을 처리하는 필터
  • 사용자가 아이디와 비밀번호를 입력하면 이를 검증하고, 검증이 성공하면 JWT 토큰을 발급하는 역할!
  • 흐름 요약
    1. 사용자가 로그인 요청을 보내면 LoginFilter가 이를 가로챈다
    2. LoginFilter는 아이디와 비밀번호를 AuthenticationManager에 전달하여 인증을 시도한다.
    3. 인증이 성공하면 successful 메서드에서 JWT토큰을 생성하고, 클라이언트에 반환할 수 있다.
    4. 인증 실패하면 unsuccessfil 메서드에서 실패 메시지를 처리할 수 있다.

SecurityConfig에 LoginFilter 등록

// addFilterAt() 로 UsernamePasswordAuthenticationFilter.class 앞에 LoginFilter를 추가
        // 사용자 로그인을 처리하는 시점을 지정하는 것
        http
                .addFilterAt(new LoginFilter(authenticationManager(authenticationConfiguration)), UsernamePasswordAuthenticationFilter.class);
profile
passionate !!

0개의 댓글