공부한 내용
- 프로그래머스 알고리즘 문제풀이
- 내배캠 강의
- 내배캠 플러스 주차 복습과제
새로 알게된 내용
오늘은 최근에 알게된 @ControllerAdvice와 @ExceptionHandler를 활용해서 Jwt 토큰이 유효하지 않은 경우 예외 처리를 했다.
우선 상황을 크게 고려하지 않고 평소 controller에서 발생한 예외처럼 @ControllerAdvice와 @ExceptionHandler을 사용했다.
작성한 코드는 여기를 확인 하면된다.
Jwt token 예외 처리 · hakjunjoo/blog-spring-prac@1eeaed4
+) Jwt와 User에서 발생할 수 있는 예외 패키지로 구분
github.com
이것을 토대로 포스트맨으로 확인을 해봤는데 나의 예상과는 다르게 예외를 처리해주지 못했다.
이유는 다음과 같다.
- @ControllerAdvice 어노테이션은 주로 컨트롤러에서 발생하는 예외를 처리하기 위한 용도로 사용한다.
- 내 코드에서 토큰 검사는 필터에서 진행한다.
- 필터는 컨트롤러의 앞단에 위치한다.
- @ControllerAdvice 어노테이션으로 필터의 예외처리를 할 수 없다.
그렇다면 필터에서는 어떻게 예외처리를 해야하는 것일까?
- 필터 자체에서 try-catch문으로 예외처리를 한다.
- 별도의 예외처리 로직을 구현한다.
- 일반적인 방법은 예외가 발생하면 예외 처리를하지 않고, 예외가 발생하면 애플리케이션이 중단되도록 한다.
위 내용을 토대로 기존 코드를 수정했다.
JwtUtil.java
// 토큰 검증
public boolean validateToken(String token) {
try {
Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
return true;
} catch (Exception e) {
return false;
}
}
JwtAuthorizationFilter
@Override
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) throws ServletException, IOException {
String tokenValue = jwtUtil.getTokenFromRequest(req);
if (StringUtils.hasText(tokenValue)) {
// JWT 토큰 substring
tokenValue = jwtUtil.substringToken(tokenValue);
if (!jwtUtil.validateToken(tokenValue)) {
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;
}
Claims info = jwtUtil.getUserInfoFromToken(tokenValue);
try {
setAuthentication(info.getSubject());
} catch (Exception e) {
return;
}
}
filterChain.doFilter(req, res);
}
예외가 발생하면 false를 반환하여 조건문이 수행되게 만들고, response에 메세지와 status를 반환한다.
느낀점
코드를 짤 때 조금만 생각해보면 당연한 사실들이 짜는 순간에는 생각나지 않은 경우가 있다.
확인을 철저하게 하면 발견할 수 있으니 조금 더 꼼꼼하게 코드를 짜보자 !
'TIL&WIL' 카테고리의 다른 글
| 2023-07-31 TIL (0) | 2023.07.31 |
|---|---|
| 2023-07-28 TIL (Spring AOP) (0) | 2023.07.28 |
| 2023-07-26 TIL (RequestDispatcher) (0) | 2023.07.26 |
| 2023-07-25 TIL (TEST) (0) | 2023.07.25 |
| 2023-07-24 TIL (백오피스 프로젝트 회고) (0) | 2023.07.24 |