개발 중인 팀 프로젝트에서 JWT 토큰 인증 시스템을 구현했다.
설계는 아래와 같았다.
1. 로그인 시 accessToken 발급
2. accessToken이 만료되면 apiKey를 사용해 새로운 accessToken을 발급
그런데 실제 테스트 과정에서 다음과 같은 문제가 발생함
1. 토큰 만료 시간 (10분)이 지난 후에도 마이페이지 접근이 가능
2. 그런데 API 호출에서 인증 오류 발생
3. 토큰 갱신 흐름이 제대로 작동하지 않음!
먼저 CustomAuthenticationFilter를 검토했다
Member member = authService.getMemberFromAccessToken(accessToken);
if (member == null) // 토큰이 만료되었을 때
member = _refreshAccessTokenByApiKey(apiKey);
if (member != null) // 토큰이 만료되지 않았을 때
rq.setLogin(member);
로직상으로 문제가 없었다. 따라서 로깅을 추가했다
private Member _refreshAccessTokenByApiKey(String apiKey) {
logger.info("access 토큰 재발급 _refreshAccessTokenByApiKey");
Optional<Member> opMemberByApiKey = v2AuthService.findByApiKey(apiKey);
if (opMemberByApiKey.isEmpty()) {
logger.info("access 토큰 재발급 opMemberByApiKey.isEmpty()");
return null;
}
access 토큰 재발급 opMemberByApiKey.isEmpty() 로그가 발생하는 것을 확인할 수 있었다.
즉, apiKey로 사용자를 찾는 과정에 문제가 있음을 알게 되었다.
프론트엔드, 백엔드의 인증과 관련된 모든 코드를 점검했지만 문제가 없었다.
오랜 삽질 끝에 드디어 원인을 찾게 되었다!
애플리케이션 시작 시 'ddl-auto=create' 설정으로 인해
기존 테이블이 삭제되고 새로운 멤버가 생성되기 때문에
api key가 계속 변해서 서버를 재시작할 때 마다 문제가 발생했던 것이다.
적절한 로그를 추가함으로써 문제가 정확히 어디서 발생하는지 빠르게 파악할 수 있었다.
로깅을 생활화하자!
또한,
작은 설정 하나가 전체 시스템의 동작에 큰 영향을 미칠 수 있다는 것을 오랜 삽질로 알게 되었다..
| GitHub Actions 워크플로우 권한 설정이 되지 않을 때 (0) | 2025.04.28 |
|---|---|
| 공공 API 사용 시 "등록되지 않은 인증키 입니다. " 에러 해결 (0) | 2025.03.04 |
| Spring Boot에서 @ModelAttribute와 폼 데이터 바인딩 문제 (0) | 2025.02.25 |
| 소셜 로그인시 브라우저에 accessToken 토큰이 발행되지 않음 (0) | 2025.02.24 |
| @ConfigurationProperties를 사용할 때 "No setter found for property" 에러 발생 (0) | 2025.02.24 |