프로젝트 (Java)/예약마켓
[프로젝트] 34. 토큰 검증시 로그 확인 기능 추가
hihyuk
2024. 1. 31. 09:59
프로젝트에 토큰 검증 시 로그 확인 기능을 추가하는 것은 보안과 디버깅 측면에서 매우 유용합니다. JwtAuthenticationFilter에 로그 출력 기능을 추가하여, 토큰 검증 과정에서 발생하는 다양한 시나리오를 로그를 통해 확인할 수 있게 합니다. 이를 통해 토큰의 유효성 검증, Redis에 저장된 토큰의 존재 여부 확인 등의 과정에서 발생하는 이슈를 신속하게 파악하고 대응할 수 있습니다.
JwtAuthenticationFilter 수정
JwtAuthenticationFilter 클래스에서는 doFilter 메소드 내에서 토큰 처리 과정에 대한 로그를 출력합니다. 토큰이 유효하고 Redis에 존재하는 경우, 사용자에 대한 인증이 성공적으로 설정되었다는 로그를 출력합니다. 반면, 토큰이 Redis에 존재하지 않거나, 요청에서 토큰을 찾을 수 없는 경우에는 경고 로그를 출력하여 문제를 알립니다. 또한, 처리 중에 예외가 발생한 경우에는 에러 로그를 출력하여 문제의 심각성을 알립니다.
@Slf4j
@RequiredArgsConstructor
public class JwtAuthenticationFilter extends GenericFilterBean {
private final JwtTokenProvider jwtTokenProvider;
private final RedisTemplate<String, String> redisTemplate;
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
HttpServletRequest httpRequest = (HttpServletRequest) request;
String token = jwtTokenProvider.resolveToken(httpRequest);
if (token != null && jwtTokenProvider.validateToken(token)) {
String key = "JWT_TOKEN:" + jwtTokenProvider.getUserPk(token);
String storedToken = redisTemplate.opsForValue().get(key);
//**로그인 여부 체크**
if (redisTemplate.hasKey(key) && storedToken != null) {
Authentication authentication = jwtTokenProvider.getAuthentication(token);
SecurityContextHolder.getContext().setAuthentication(authentication);
log.info("토큰이 유효하여 사용자 {}에 대한 인증이 설정되었습니다.", jwtTokenProvider.getUserPk(token));
} else {
log.warn("요청에서 토큰은 발견되었지만 Redis에서 찾을 수 없거나 null입니다. 토큰이 만료되었거나 유효하지 않을 수 있습니다.");
}
} else {
log.warn("요청에서 토큰을 찾을 수 없거나 토큰이 유효하지 않습니다.");
}
chain.doFilter(request, response);
} catch (Exception e) {
log.error("JwtAuthenticationFilter 처리 중 오류가 발생했습니다: {}", e.getMessage());
throw new ServletException("인증 처리 중 오류가 발생했습니다", e);
}
}
}
결론
이러한 로그 출력 기능을 통해 개발자는 시스템의 보안 관련 이슈를 보다 효과적으로 모니터링하고, 발생 가능한 문제에 대해 빠르게 대응할 수 있습니다. 특히 보안과 관련된 부분에서는 문제가 발생했을 때 그 원인을 신속하게 파악하고 해결하는 것이 중요하기 때문에, 로그는 이러한 과정에서 매우 중요한 역할을 합니다.