Skip to content

feat: 토큰 재발급, 로그아웃 기능 구현(#44)#48

Merged
chaiminwoo0223 merged 1 commit intodevelopfrom
feature/44
Aug 5, 2025
Merged

feat: 토큰 재발급, 로그아웃 기능 구현(#44)#48
chaiminwoo0223 merged 1 commit intodevelopfrom
feature/44

Conversation

@chaiminwoo0223
Copy link
Contributor

@chaiminwoo0223 chaiminwoo0223 commented Aug 3, 2025

📌 작업 내용 및 특이사항

✅ 토큰 재발급 API

  • 사용자가 자신의 리프레시 토큰을 이용하여, 엑세스 토큰과 리프레시 토큰을 재발급
  • 토큰 재발급은 TokenService.reissueToken()을 통해 수행되며, TokenReissueRequest를 사용
  • RefreshTokenRedisRepository.existsRefreshToken()을 통해, 전달된 리프레시 토큰이 Redis에 저장되어 있는지 검증
  • RefreshTokenRedisRepository.findMemberIdByRefreshToken()을 통해, Redis에서 리프레시 토큰에 대응하는 멤버 ID를 조회
  • MemberQueryRepository.findMemberRoleById()를 통해, 멤버 ID에 대한 Role을 조회
  • TokenProvider.getRefreshTokenExpirationTime()을 통해, 리프레시 토큰의 만료시간을 전달
  • TokenProvider.createAccessToken()을 통해, 새로운 엑세스 토큰을 발급
  • TokenProvider.createRefreshToken()을 통해, 새로운 리프레시 토큰을 발급
  • RefreshTokenRedisRepository.deleteRefreshToken()을 통해, Redis에 저장했던 리프레시 토큰을 제거
  • RefreshTokenRedisRepository.saveRefreshToken()을 통해, 새로운 리프레시 토큰을 Redis에 저장

✅ 로그아웃 API

  • 사용자가 자신의 엑세스 토큰과 리프레시 토큰을 이용하여, 엑세스 토큰을 블랙리스트에 추가하고, 저장된 리프레시 토큰을 제거
  • 로그아웃은 TokenService.logout()을 통해 수행되며, LogoutRequest를 사용
  • RefreshTokenRedisRepository.existsRefreshToken()을 통해, 전달된 리프레시 토큰이 Redis에 저장되어 있는지 검증
  • TokenProvider.getAccessTokenRemainingTime()을 통해, 엑세스 토큰의 잔여시간을 전달
  • LogoutTokenRedisRepository.saveAccessToken()을 통해, 엑세스 토큰을 Redis 블랙리스트에 저장
  • RefreshTokenRedisRepository.deleteRefreshToken()을 통해, Redis에 저장했던 리프레시 토큰을 제거
  • 이후, JwtFilter에서 블랙리스트에 등록된 엑세스 토큰이 들어오면, 인증 처리를 중단하고 예외 발생

✅ TokenProvider 메서드 추가

  • TokenProvider.getRefreshTokenExpirationTime() 메서드 추가
  • TokenProvider.getAccessTokenRemainingTime() 메서드 추가

✅ 리포지토리 메서드 추가

  • MemberRepository.deleteById() 메서드 추가

✅ 멤버 QueryDSL 조회 리포지토리

  • MemberQueryRepository, MemberQueryRepositoryAdapter 클래스 구현

✅ 요청(Request) DTO

  • TokenReissueRequest: 토큰 재발급 요청
  • LogoutRequest: 로그아웃 요청

✅ 캐시 키 ENUM

  • CacheKeyConstants: Redis에 저장되는 각 캐시의 접두사를 관리하는 상수

✅ 테스트

  • TokenServiceTest 단위 테스트 추가
  • AuthControllerIntegrationTest에 ReissueToken, Logout 통합 테스트 추가
  • TokenReissueRequestFixture, LogoutRequestFixture 추가
  • TokenTestHelper에 createRefreshToken 메서드 추가
  • MemberTestHelper에 deleteMemberById 메서드 추가
  • MemberServiceTest에 GetRoleByMemberId 단위 테스트 추가

🌱 관련 이슈


🔍 참고사항

  • KakaoLoginService에서 getTokens 메서드 삭제
  • MissionController.updateMission()@Valid 어노테이션 추가
  • UpdateMissionRequest에서 @JsonInclude 어노테이션 제거
  • UpdateMissionRequest@NotBlank 어노테이션 추가
  • MissionFacade, MissionService에서 updateMissionNameAndMemo -> updateMissionNameAndMemoIfPresent 이름 변경
  • TokenProvider에서 extractMemberRoleFromToken → extractRoleFromToken 이름 변경
  • JwtFilterJwtAuthenticationFilter로 이름 변경
  • JwtAuthenticationFilterglobal.security 패키지로 이동

@chaiminwoo0223 chaiminwoo0223 requested a review from hisonghy August 3, 2025 09:42
@chaiminwoo0223 chaiminwoo0223 self-assigned this Aug 3, 2025
@chaiminwoo0223 chaiminwoo0223 added the ✨feature 구현, 개선 사항 관련 부분 label Aug 3, 2025
Copy link
Contributor

@hisonghy hisonghy left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

고생하셨습니다!

@chaiminwoo0223
Copy link
Contributor Author

고생하셨습니다!

피그백 내용 반영해서 머지 진행하겠습니다.

* feat: CacheKeyConstants 추가
* feat: RefreshTokenRedisRepository, RefreshTokenRedisRepositoryAdapter 구현
* feat: LogoutTokenRedisRepository, LogoutTokenRedisRepositoryAdapter 구현
* feat: TokenService 구현
* feat: TokenProvider에 getRefreshTokenExpirationTime 메서드 추가
* feat: TokenProvider에 getAccessTokenRemainingTime 메서드 추가
* feat: TokenReissueRequest 추가
* feat: LogoutRequest 추가
* feat: AuthFacade에 reissueToken, logout 메서드 추가
* feat: AuthController에 reissueToken, logout 메서드 추가
* feat: JwtFilter에 로그아웃 토큰 블랙리스트 검증 로직 추가
* feat: MemberRepository, MemberRepositoryAdapter에 deleteById 메서드 추가
* feat: MemberQueryRepository, MemberQueryRepositoryAdapter 구현

* refactor: KakaoLoginService에서 getTokens 메서드 삭제
* refactor: TokenProvider에서 extractMemberRoleFromToken -> extractRoleFromToken 이름 변경
* refactor: MissionController.updateMission()에 @Valid 어노테이션 추가
* refactor: UpdateMissionRequest에서 @JsonInclude(JsonInclude.Include.NON_NULL) 어노테이션 제거
* refactor: UpdateMissionRequest에 @notblank 어노테이션 추가
* refactor: MissionFacade, MissionService에서 updateMissionNameAndMemo -> updateMissionNameAndMemoIfPresent 이름 변경
* refactor: TokenProvider.createRefreshToken() 비즈니스 로직 개선
* refactor: JwtFilter를 global.security 패키지로 이동
* refactor: JwtFilter를 JwtAuthenticationFilter로 이름 변경

* test: TokenServiceTest 단위 테스트 추가
* test: TokenReissueRequestFixture 추가
* test: LogoutRequestFixture 추가
* test: AuthControllerIntegrationTest ReissueToken, Logout 통합 테스트 추가
* test: TokenTestHelper에 createRefreshToken 메서드 추가
* test: MemberTestHelper에 deleteMemberById 메서드 추가
* test: MemberServiceTest에 GetRoleByMemberId 단위 테스트 추가

* fix: Redis에 저장되는 memberId가 직렬화되어 깨지는 문제 해결
@chaiminwoo0223 chaiminwoo0223 merged commit cf704db into develop Aug 5, 2025
1 check passed
@chaiminwoo0223 chaiminwoo0223 changed the title 토큰 재발급, 로그아웃 기능 구현(#44) feat: 토큰 재발급, 로그아웃 기능 구현(#44) Aug 12, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨feature 구현, 개선 사항 관련 부분

Projects

None yet

Development

Successfully merging this pull request may close these issues.

✨[FEAT]: 토큰 재발급, 로그아웃 기능 구현

2 participants