JWT 토큰 인증을 매서드로 간소화 하기

Kim Dong Kyun·2022년 12월 20일
1

Today I learned

목록 보기
19/43

상황

  • 간단한 메모장 프로젝트를 만드는 중에 Service단에 Token을 체크하는 로직이 겹쳐있는 것을 발견했다.

개선해야 할 부분

1. JWT 토큰의 처리 로직은 Controller단에 존재해야 한다.

2. 토큰 체크 로직이 겹쳐서는 안된다.

아래와 같이 바꾸기로 했다.

위처럼 Service에서는 그 기능에 해당하는 역할만 해야 자연스러울 것이다. 이것을 위해 만들어낸 클래스가 아래와 같다.

@RequiredArgsConstructor
@Component
public class CheckUtil {
    private final JwtUtil jwtUtil;
    private final UserRepository userRepository;

    public User tokenChecker(HttpServletRequest request) {
        String token = jwtUtil.resolveToken(request);
        Claims claims;


        if (token != null) {
            if (jwtUtil.validateToken(token)) {
                claims = jwtUtil.getUserInfoFromToken(token);
            } else {
                throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "토큰 에러입니다");
            }
            return userRepository.findByUsername(claims.getSubject()).orElseThrow(
                    () -> new ResponseStatusException(HttpStatus.BAD_REQUEST, "사용자가 존재하지 않습니다")
            );
        } else throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "토큰 에러입니다");
    }
}

프로젝트에 util이라는 pakage를 추가하고 그 안에 controller, 혹은 service에서 쓰이는 로직을 담아놨다. 이 로직은 서비스단에서가 아닌, 컨트롤러 단에서 다음과 같이 쓰인다.

MemoController에서 쓰이는 모습. @RequiredArgsConstructer어노테이션을 달고, 필드에 private final CheckUtil 와 같이 선언해줌으로써 의존성 주입을 했다.

또한 이 CheckUtil은 다른 컨트롤러에서도 사용될 수 있다.

결론

  • 토큰의 검증은 Util로 만들고, 그것을 의존성 주입으로 사용하는 것이 더 편하다. 더불어 더 간결하고 아름답다.

  • controller에서 토큰의 검증이 이루어져야 한다. Service는 로직만 제공한다.

0개의 댓글