1. Spring Security Filter chain의 구조
따라서 @Controller나 @Service에서 GlobalCustomException처리하면 (@ControllerAdvice, @ExceptionHandler) 해당 메소드로 넘어가지만, Filter에서 똑같이 Exception 터트려도 GlobalCustomException로 넘어가지 않는다.
해결방법은 Filter영역에서 Exception 처리는 아래와 같이.
@Component
// 유효한 자격증명을 제공하지 않고 접근하려 할 때 401Unauthorized 에러를 리턴
public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public void commence(HttpServletRequest request,
HttpServletResponse response,
AuthenticationException authException) throws IOException {
// 필터에서 터지는 에러는 이 형식으로 통일
ObjectMapper objectMapper = new ObjectMapper();
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
response.setCharacterEncoding("UTF-8");
objectMapper.writeValue(response.getWriter(), new ErrorResponse(ErrorCode.HANDLE_UNAUTHORIZED));
}
}
public class JwtFilter extends OncePerRequestFilter {
// 토큰 유효성 검사 ATOrRT(AccessToken, RefreshToken)
public boolean validateToken(String token, String ATOrRT, HttpServletResponse servletResponse) throws IOException {
ObjectMapper objectMapper = new ObjectMapper();
try{
Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
return true;
} catch (io.jsonwebtoken.security.SecurityException | MalformedJwtException e) {
logger.info("잘못된 JWT 서명입니다.");
} catch (ExpiredJwtException e) {
logger.info("만료된 JWT 토큰입니다.");
if(Objects.equals(ATOrRT, "AT")){
servletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);
servletResponse.setCharacterEncoding("UTF-8");
objectMapper.writeValue(servletResponse.getWriter(), new ErrorResponse(ErrorCode.EXPIRED_ACCESS_TOKEN));
//throw new ExpiredAccessToken(ErrorCode.EXPIRED_ACCESS_TOKEN.getMessage()); //
// 필터 영역이라서 예외 던저도 GlobalCustomException 처리 안됨.
}else {
servletResponse.setContentType(MediaType.APPLICATION_JSON_VALUE);
servletResponse.setCharacterEncoding("UTF-8");
objectMapper.writeValue(servletResponse.getWriter(), new ErrorResponse(ErrorCode.EXPIRED_REFRESH_TOKEN));
// throw new ExpiredRefreshToken(ErrorCode.EXPIRED_REFRESH_TOKEN.getMessage());
// 필터 영역이라서 예외 던저도 GlobalCustomException 처리 안됨.
}
} catch (UnsupportedJwtException e) {
logger.info("지원되지 않는 JWT 토큰입니다.");
} catch (IllegalArgumentException e) {
logger.info("JWT 토큰이 잘못되었습니다.");
}
return false;
}
참고: https://jhkimmm.tistory.com/29
'Back-end > Spring-Security' 카테고리의 다른 글
OAuth 2.0(Open Authorization 2.0) (0) | 2022.12.18 |
---|---|
Spring Security- JWT AccessToken, RefreshToken (0) | 2022.12.18 |
변경된 WebSecurityConfigurerAdapter (0) | 2022.10.10 |
페이지 수준 권한 부여 (0) | 2021.05.10 |
Spring Security의존제거, HttpServletRequest이용 (0) | 2021.05.09 |