개인과제 중 추가미션인 예외처리 방법에 대해 작성하겠다.
예외 처리
각 예외 상황에서 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);
}
}
이렇게 구현하면 어떤 에러인지 잘 나타난다.
