UsernamePasswordAuthenticationFilter는 Spring Security에서 사용자가 로그인할 때 인증을 처리하는 핵심적인 필터입니다. UsernamePasswordAuthenticationFilter가 Spring Security 인증 과정에서 어떻게 동작하는지 알아보겠습니다.
1. Spring Security와 인증
Spring Security는 Spring 기반 애플리케이션에서 보안을 처리하는 프레임워크로, 인증(authentication)과 권한 부여(authorization) 기능을 제공합니다. 이 중에서 인증 과정은 사용자의 아이디와 비밀번호를 확인하여 시스템에 접근할 수 있는지 판별하는 과정입니다. UsernamePasswordAuthenticationFilter는 Spring Security의 기본 인증 처리 필터로, 주로 로그인 폼에서 제출된 아이디와 비밀번호를 사용하여 인증을 처리합니다.
2. UsernamePasswordAuthenticationFilter란?
UsernamePasswordAuthenticationFilter는 사용자가 로그인 폼을 통해 제출한 아이디(username)와 비밀번호(password)를 받아 인증을 처리하는 Spring Security 필터입니다. 이 필터는 기본적으로 POST /login 요청을 처리하며, 인증이 성공하거나 실패하는 과정에서 필요한 작업을 수행합니다.
이 필터는 AbstractAuthenticationProcessingFilter 클래스를 확장하여 구현됩니다. AbstractAuthenticationProcessingFilter는 인증 처리의 공통 로직을 제공하고, UsernamePasswordAuthenticationFilter는 이 클래스를 확장하여 구체적인 로그인 인증 로직을 구현합니다.
3. UsernamePasswordAuthenticationFilter 인증 처리 과정
1) 사용자 로그인 요청 (POST /login)
사용자가 로그인 폼에 아이디와 비밀번호를 입력하고 제출하면, 해당 정보는 POST 방식으로 /login URL로 전송됩니다. 이때 UsernamePasswordAuthenticationFilter가 이 요청을 처리합니다.
2) 아이디와 비밀번호 추출
로그인 요청에서 username과 password 파라미터를 추출하여 인증 정보를 준비합니다. 기본적으로 request.getParameter("username")와 request.getParameter("password")를 통해 값을 얻습니다. 이렇게 추출한 값을 기반으로 UsernamePasswordAuthenticationToken 객체를 생성합니다.
String username = request.getParameter("username");
String password = request.getParameter("password");
UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
3) AuthenticationManager에 인증 요청
UsernamePasswordAuthenticationFilter는 AuthenticationManager를 통해 인증을 요청합니다. AuthenticationManager는 기본적으로 ProviderManager를 사용하며, 이 클래스는 여러 AuthenticationProvider를 통해 인증을 처리합니다.
AuthenticationManager가 authenticate() 메서드를 호출하면, 내부에서 DaoAuthenticationProvider와 같은 인증 프로바이더가 사용자 정보를 조회하고 비밀번호를 비교합니다. UsernamePasswordAuthenticationProvider는 username을 기반으로 데이터베이스에서 사용자 정보를 조회하고, 제출된 비밀번호와 저장된 비밀번호를 비교하여 인증을 처리합니다.
4) 인증 성공 또는 실패
- 인증 성공: 비밀번호가 일치하면 인증이 성공하고, Authentication 객체가 반환됩니다. 이 객체는 인증된 사용자의 정보를 포함하고 있으며, SecurityContextHolder에 저장됩니다.
SecurityContextHolder.getContext().setAuthentication(authentication);
- 인증 실패: 비밀번호가 일치하지 않거나 사용자가 존재하지 않으면 인증이 실패하고, BadCredentialsException이 발생합니다. 이 경우, 실패 처리 로직인 unsuccessfulAuthentication() 메서드가 호출됩니다.
5) 인증 성공 후 후처리
인증이 성공하면 AuthenticationSuccessHandler가 호출되어, 성공적인 로그인 처리가 이루어집니다. 기본적으로는 SavedRequestAwareAuthenticationSuccessHandler가 사용되며, 로그인 후 사용자가 이전에 요청한 페이지로 리다이렉션됩니다. 만약 리다이렉션할 페이지가 없다면 기본적으로 홈 페이지로 이동합니다.
6) 인증 실패 후 후처리
인증이 실패하면 AuthenticationFailureHandler가 호출됩니다. 기본적으로 로그인 실패 페이지로 리다이렉션되며, 실패 메시지가 사용자에게 전달됩니다.
4. AbstractAuthenticationProcessingFilter의 역할
UsernamePasswordAuthenticationFilter는 AbstractAuthenticationProcessingFilter를 상속받고, 이 클래스에서 제공하는 공통적인 인증 처리 로직을 활용합니다. AbstractAuthenticationProcessingFilter는 attemptAuthentication() 메서드를 통해 인증 요청을 처리하고, 인증 성공 또는 실패 후 후속 작업을 수행합니다.
AbstractAuthenticationProcessingFilter의 핵심 메서드는 다음과 같습니다:
- attemptAuthentication(HttpServletRequest request, HttpServletResponse response): 서브클래스에서 구현하여 실제 인증 시도를 처리하는 메서드입니다.
- successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult): 인증 성공 후 호출되어 후속 작업을 처리하는 메서드입니다.
- unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed): 인증 실패 후 호출되어 실패 처리를 수행하는 메서드입니다.
전체 인증 과정 요약
- 로그인 요청: 사용자가 로그인 폼에서 아이디와 비밀번호를 입력하고 /login URL로 POST 요청을 보냄.
- UsernamePasswordAuthenticationFilter 실행: 이 필터는 요청을 가로채고 username과 password를 추출하여 UsernamePasswordAuthenticationToken을 생성.
- AuthenticationManager로 인증 요청: AuthenticationManager를 통해 인증을 시도하고, DaoAuthenticationProvider가 사용자 정보를 조회하여 인증을 처리.
- 인증 성공 또는 실패 처리:
- 성공하면 SecurityContextHolder에 인증 정보를 저장하고 성공 후 처리를 위한 AuthenticationSuccessHandler 호출.
- 실패하면 AuthenticationFailureHandler를 호출하여 실패 처리를 수행.
- 리다이렉션: 로그인 성공 후 사용자가 이전에 요청했던 페이지로 리다이렉션하거나 기본 페이지로 이동.
'개발 | 프로젝트 > Java | Spring' 카테고리의 다른 글
[Spring boot] @Transactional 이란? (0) | 2025.04.08 |
---|---|
[Spring Boot] GlobalExceptionHandler 예외 처리 (0) | 2025.04.06 |
[Spring] Spring Security CSS 적용 안되는 오류 (0) | 2025.02.27 |
[Spring] Spring Security (0) | 2025.02.26 |
[Spring] 개방-폐쇄 원칙 (OCP, Open Closed Principle) (0) | 2025.02.18 |