blues_log

공부한 내용

  • 프로그래머스 알고리즘 문제풀이
  • 내배캠 강의
  • 내배캠 플러스 주차 복습과제

새로 알게된 내용

 오늘은 최근에 알게된 @ControllerAdvice와 @ExceptionHandler를 활용해서 Jwt 토큰이 유효하지 않은 경우 예외 처리를 했다.

 

우선 상황을 크게 고려하지 않고 평소 controller에서 발생한 예외처럼 @ControllerAdvice와 @ExceptionHandler을 사용했다.

작성한 코드는 여기를 확인 하면된다.

https://github.com/hakjunjoo/blog-spring-prac/commit/1eeaed4ebfbe769af374637a188737981c92239b#diff-2e7759d9dd63d3669eb60d8add3269e17278279c2ce8336c0c94efb1c7844319

 

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