[일정 관리 앱] 도전 기능 요구사항 반영

2024. 10. 14. 19:45내일배움캠프/Schedule Management

 과제의 요구사항 중 '도전 기능' 에 대한 프로젝트 반영을 끝내고(핵심 요구사항만) 요구사항 반영간 있었던 이슈에 대해서 작성해보고자 한다. 참고로 현재 '도전 기능' 의 모든 요구사항을 반영한 것은 아니다. 요구사항 중 핵심 요구사항을 반영하고 테스트한 상태라 세부 요구사항에 대한 부분은 리팩토링을 진행하면서 반영할 생각이다. 각 요구사항을 반영하며 작성한 코드는 아래의 링크를 통해 확인할 수 있다.

 

1. JWT 검증시 발생하는 예외

 강의 및 검색을 통해 JWT 에 대한 구현을 진행하면서 JWT 검증에 아래와 같은 코드를 참고해 작성하였다.

// 토큰 검증
public boolean validateToken(String token) {
    try {
        Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
        return true;
    } catch (SecurityException | MalformedJwtException | SignatureException e) {
        logger.error("Invalid JWT signature, 유효하지 않는 JWT 서명 입니다.");
    } catch (ExpiredJwtException e) {
        logger.error("Expired JWT token, 만료된 JWT token 입니다.");
    } catch (UnsupportedJwtException e) {
        logger.error("Unsupported JWT token, 지원되지 않는 JWT 토큰 입니다.");
    } catch (IllegalArgumentException e) {
        logger.error("JWT claims is empty, 잘못된 JWT 토큰 입니다.");
    }
    
    return false;
}

 

그런데 해당 코드 반영 도중 계속 'SignatureException' 에 빨간 밑줄이 생겼다. 메시지를 확인해보면 해당 예외를 제거하라는 메시지만을 출력하였다. 원인을 알고자 각 예외가 위치한 라이브러리 문서를 확인해 봤고 'SignatureException' 이 상속하고 있는 'io.jsonwebtoken.SignatureException' 클래스에서 원하는 답을 얻을 수 있었다.

io.jsonwebtoken.SignatureException 클래스

 

작성된 클래스 설명을 해석해보면 "서명을 계산하거나 JWT의 기존 서명을 확인하는 데 실패했음을 나타내는 예외입니다. SecurityException을 위해 더 이상 사용되지 않습니다. 이 클래스는 1.0 이전에 제거됩니다." 라는 내용인데 나의 경우 "이제 JWT 의 서명 확인 실패에 대한 예외는 'SecurityException' 이 수행하는 구나" 라고 이해했다.

 

실제로 위 이미지를 보면 'SecurityException' 을 상속하고 있다. 결국 상위 예외를 선언해 처리했는데 하위 예외를 'catch' 조건에 지정했기 때문에 빨간 줄이 등장하고 해당 예외를 지우라고 알려줬던 것이다.

 

  • 참고 : 클래스에 사용된 '@Deprecated' 어노테이션은 지정한 프로그램 요소를 프로그래머가 사용하지 않는 요소임을 알리기 위해 지정하는 어노테이션이다.

 

 

2. refreshToken 이 계속 쌓이는 문제

 요구사항에 'refreshToken' 에 대한 내용은 없었지만 이번에 한 번 구현해보고 싶어 개인적으로 'refreshToken' 을 추가해 구현했다. 생성한 'refreshToken' 을 DB 에 저장하는 방식을 택했는데, 'accessToken' 이 만료될 경우 클라이언트에 'refreshToken' 을 담아 재요청을 요구하고 클라이언트는 서버의 요청에 따라 'refreshToken' 을 전달해 'accessToken' 을 재발급 받는 흐름을 구상하였다.

 

'refreshToken' 을 '회원 가입' 과 '로그인' 시 생성해주다 보니 "회원 가입을 하고 로그인을 하면 DB 에 refreshToken 이 쌓이지 않을까?" 라는 의문이 들었고 이를 튜터님과 이야기를 통해 실마리를 찾을 수 있었다. '회원 가입시 refreshToken 생성 = 회원 가입 후 자동 로그인' 이라 생각하니 어느 정도 갈피가 잡혔는데, 이런 부분은 '기획' 에 대한 부분이라고 튜터님께서 설명도 해주셨다. 이어서 "만약 회원가입 후 로그인을 요구하는 경우 '회원 가입' 시에는 토큰을 반환하지 않으면 되겠구나!" 라는 생각도 할 수 있었으며 로그아웃 시 refreshToken 을 전달 받아 DB 에서 삭제하면 DB 에 refreshToken 이 쌓이는 문제를 해결할 수 있다.