[Spring] JWT 예외처리

Sun choi·2024년 8월 29일

NEW 지식

목록 보기
21/34

개인과제 중 추가미션인 예외처리 방법에 대해 작성하겠다.

예외 처리

  • 로그인 시 이메일과 비밀번호가 일치하지 않을 경우 401을 반환합니다.
  • 토큰이 없는 경우 400을 반환합니다.
  • 유효 기간이 만료된 토큰의 경우 401을 반환합니다.

ResponseStatusException 사용

각 예외 상황에서 ResponseStatusException을 발생시켜 원하는 HTTP 상태 코드와 메시지를 반환.
HttpStatus.UNAUTHORIZED (401 Unauthorized): 서명 문제나 만료된 토큰에 대해 사용합니다.
HttpStatus.BAD_REQUEST (400 Bad Request): JWT가 잘못된 형식이거나 클레임이 비어 있을 때 사용합니다.


UserService 클래스에서 login 메서드 중 이메일과 비밀번호가 일치하지 않을 경우 예외처리

//사용자 확인 -> 일치하지 않으면 401 에러 반환

User user = userRepository.findByEmail(email).orElseThrow(
        () -> new ResponseStatusException(HttpStatus.UNAUTHORIZED, "이메일이 일치하지 않습니다.")
);

//비밀번호 확인 -> 일치하지 않으면 401 에러 반환

if (! passwordEncoder.matches(password, user.getPassword())) {
    throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "비밀번호가 일치하지 않습니다.");
}

JwtUtil 클래스에서 토큰 검증하는 메서드에서의 예외 처리.

// 토큰 검증
    public boolean validateToken(String token) {
        try {
            // 암호화할 때 사용한 키, 받아온 토큰
            // 이 한줄로 토큰에 위변조가 있는지 검증
            Jwts.parserBuilder()
                    .setSigningKey(key) // 비밀 키 설정
                    .build() // 파서 빌더 빌드
                    .parseClaimsJws(token); // 토큰 파싱 및 검증
            return true;
        } catch (SecurityException | MalformedJwtException | SignatureException e) {
            // 토큰 서명이 잘못되었거나, 잘못된 형식의 JWT가 전달된 경우
            log.error("Invalid JWT signature, 유효하지 않는 JWT 서명 입니다.", e);
            throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "Invalid JWT signature, 유효하지 않는 JWT 서명 입니다.", e);
        } catch (ExpiredJwtException e) {
            // 토큰이 만료된 경우
            log.error("Expired JWT token, 만료된 JWT token 입니다.", e);
            throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "Expired JWT token, 만료된 JWT token 입니다.", e);
        } catch (UnsupportedJwtException e) {
            // 지원되지 않는 JWT 형식이 전달된 경우
            log.error("Unsupported JWT token, 지원되지 않는 JWT 토큰 입니다.", e);
            throw new ResponseStatusException(HttpStatus.UNAUTHORIZED, "Unsupported JWT token, 지원되지 않는 JWT 토큰 입니다.", e);
        } catch (IllegalArgumentException e) {
            // JWT 클레임이 비어 있거나 잘못된 형식일 경우
            log.error("JWT claims is empty, 잘못된 JWT 토큰 입니다.", e);
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, "JWT claims is empty, 잘못된 JWT 토큰 입니다.", e);
        }

    }

이렇게 구현하면 어떤 에러인지 잘 나타난다.

profile
풀스택 개발자의 공부기록 📖

0개의 댓글