2024. 10. 14. 19:45ㆍ내일배움캠프/Schedule Management
과제의 요구사항 중 '도전 기능' 에 대한 프로젝트 반영을 끝내고(핵심 요구사항만) 요구사항 반영간 있었던 이슈에 대해서 작성해보고자 한다. 참고로 현재 '도전 기능' 의 모든 요구사항을 반영한 것은 아니다. 요구사항 중 핵심 요구사항을 반영하고 테스트한 상태라 세부 요구사항에 대한 부분은 리팩토링을 진행하면서 반영할 생각이다. 각 요구사항을 반영하며 작성한 코드는 아래의 링크를 통해 확인할 수 있다.
- 도전 기능(Level.01 , 전체기준 Level.06)
- 도전 기능(Level.02~03 , 전체기준 Level.07~08)
- 도전 기능(Level.04, 전체기준 Level.09)
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' 클래스에서 원하는 답을 얻을 수 있었다.
작성된 클래스 설명을 해석해보면 "서명을 계산하거나 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 이 쌓이는 문제를 해결할 수 있다.
'내일배움캠프 > Schedule Management' 카테고리의 다른 글
[일정 관리 앱] 리팩토링(2) (0) | 2024.10.15 |
---|---|
[일정 관리 앱] 리팩토링(1) (0) | 2024.10.15 |
[일정 관리 앱] N : M(다대다) 관계 풀어내기 (0) | 2024.10.12 |
[일정 관리 앱] 기묘한 모험 - 1 : N 관계에서의 전체 조회 (0) | 2024.10.11 |
[일정 관리 앱] 댓글 CRUD API 테스트 (0) | 2024.10.11 |