try {
//블랙리스트 조회
if (blackListRepository.findByToken(token).isPresent()) {
filterChain.doFilter(request, response);
return;
}
//유효하지 않은 토큰은 블랙리스트 저장
if(!jwtUtil.validateToken(token)) {
blackListRepository.save(new BlackList(token));
filterChain.doFilter(request, response);
return;
}
Claims claims = jwtUtil.getUserInfoFromToken(token);
String userName = claims.getSubject();
// ✅ JWT에서 추출된 username 확인용 로그
log.info("JWT subject(username) = {}", userName);
setAuthentication(userName);
} catch (Exception e) {
//추가
log.error("JWT 필터 예외 발생: {}", e.getMessage());
// 토큰 파싱 실패 등 모든 예외도 블랙리스트에 등록
blackListRepository.save(new BlackList(token));
//filterChain.doFilter(request, response);
}
2번의 실행 중 1번은 성공했기에 DB 저장 성공 → 이후 로직도 잘 돌아감
JwtFilter에 아래 코드 추가해서 해결
String uri = request.getRequestURI();
// 로그인, 회원가입, 로그아웃, 혹은 공용 요청은 필터 통과
if (uri.startsWith("/api/v1/users/login") ||
uri.startsWith("/api/v1/users/signup") ||
uri.startsWith("/api/v1/users/logout")) {
filterChain.doFilter(request, response);
return;
}
예외처리 로그 확인하기 위해 GlobalExceptionHandler에 로그 추가
// 나머지 예외
@ExceptionHandler(Exception.class)
public BaseResponse handleAllExceptions(Exception ex) {
log.error("GlobalExceptionHandler 작동 - 예외 발생: {}", ex.getMessage(), ex);
return new BaseResponse("요청이 실패했습니다. 서버 에러가 발생했습니다.");
}