Spring

Spring ) Blacklist

Albosa2lol 2023. 7. 19. 22:37

1.JwtUtil.java

// 토큰 블랙리스트 : 사용된 토큰을 사용하지 못하게 저장하여 관리함
@Autowired
private TokenBlacklistRepository tokenBlacklistRepository;
// 블랙리스트에 토큰이 있는지 확인, 존재하면 != null true 반환
public boolean isTokenBlacklisted(String tokenValue) {
TokenBlacklist tokenBlacklist = tokenBlacklistRepository.findByToken(tokenValue).orElse(null);
return tokenBlacklist != null;
}

2.JwtAuthorizationFilter

 

@Override
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) throws ServletException, IOException {
String tokenValue = jwtUtil.getJwtFromHeader(req);

if (StringUtils.hasText(tokenValue)) {
if (!jwtUtil.validateToken(tokenValue)) { // false 일 때
ApiResponseDto responseDto = new ApiResponseDto("토큰이 유효하지 않습니다.", HttpStatus.BAD_REQUEST.value());
res.setStatus(HttpServletResponse.SC_BAD_REQUEST);
res.setContentType("application/json; charset=UTF-8");
res.getWriter().write(objectMapper.writeValueAsString(responseDto));

return;
}
// 블랙리스트에 존재하는 토큰일 경우 조건문에 true 입력, 로그아웃된 토큰 메세지와 인증불가 코드 반환
if (jwtUtil.isTokenBlacklisted(tokenValue)) {
ApiResponseDto responseDto = new ApiResponseDto("로그아웃된 토큰입니다.", HttpStatus.UNAUTHORIZED.value());
res.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
res.setContentType("application/json; charset=UTF-8");
res.getWriter().write(objectMapper.writeValueAsString(responseDto));
return;
}

Claims info = jwtUtil.getUserInfoFromToken(tokenValue);

try {
setAuthentication(info.getSubject()); // JWT 토큰의 서브젝트 값을 추출 : 토큰이 어떤 사용자를 나타내는지 확인
log.info("JWT 검증필터 실행");
} catch (Exception e) {
log.error(e.getMessage());
return;
}
}
filterChain.doFilter(req, res);
}