스프링 시큐리티에서 제공하는 클래스입니다. 이 클래스는 사용자의 사용자 이름과 비밀번호를 통해 인증 처리하는 필터로 주로 로그인 요청을 처리하는데 사용합니다.
로그인 요청 처리
사용자가 로그인 요청을 하면, 이 필터가 요청을 가로채서 사용자 이름과 비밀번호를 추출하고, 이를 이용해 인증을 시도합니다.
인증 성공 시
인증이 성공하면, 인증된 사용자 정보를 보안 컨텍스트(Security Context)에 저장합니다.
인증 실패 시
인증이 실패하면, 적절한 오류 응답을 반환합니다.
기본 동작 흐름
attemptAuthentication(HttpServletRequest request, HttpServletResponse response)
사용자의 인증 요청을 처리합니다. 사용자 이름과 비밀번호를 추출하여 인증 매니저(Authentication Manager)에게 전달합니다.
successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult)
인증이 성공했을 때 호출됩니다. JWT 토큰을 생성하여 응답 헤더에 추가합니다.
unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed)
인증이 실패했을 때 호출됩니다. 응답 상태를 401로 설정합니다.
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.FilterChain;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.sparta.createschedule.entity.UserRoleEnum;
import org.sparta.createschedule.jwt.JwtUtil;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import java.io.IOException;
@Slf4j(topic = "로그인 및 JWT 생성")
public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
private final JwtUtil jwtUtil;
public JwtAuthenticationFilter(JwtUtil jwtUtil) {
this.jwtUtil = jwtUtil;
setFilterProcessesUrl("/api/user/login");
}
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
try {
LoginRequestDto requestDto = new ObjectMapper().readValue(request.getInputStream(), LoginRequestDto.class);
return getAuthenticationManager().authenticate(
new UsernamePasswordAuthenticationToken(
requestDto.getUsername(),
requestDto.getPassword(),
null
)
);
} catch (IOException e) {
log.error(e.getMessage());
throw new RuntimeException(e.getMessage());
}
}
@Override
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) {
String username = ((UserDetailsImpl) authResult.getPrincipal()).getUsername();
UserRoleEnum role = ((UserDetailsImpl) authResult.getPrincipal()).getUser().getRole();
String token = jwtUtil.createToken(username, role);
response.addHeader(JwtUtil.AUTHORIZATION_HEADER, token);
}
@Override
protected void unsuccessfulAuthentication(HttpServletRequest request, HttpServletResponse response, AuthenticationException failed) {
response.setStatus(401);
}
}
이 코드는 스프링 시큐리티를 사용하여 JWT 기반의 인증을 처리하는 JwtAuthenticationFilter 클래스이다.
사용자가 로그인 요청을 할 때 로그인 요청을 처리하고 성공적으로 인증된 사용자의 경우 JWT 토큰을 생성하여 응답 헤더에 추가하는 역할을 합니다.
5월 31일 까지 과제 제출하는데 늦게나마 시작해서 코드를 작성하고 있다. 보면서 깊은 이해보다 아 이렇게 하는 구나 정도로만 알고 따라치기 정도로만 과제진행을 하고 있다. 과제 제출 완료 후 깊게 공부해야 겠다.