티스토리 뷰

 

https://ekeprl.tistory.com/67

 

[Spring Security - JWT] (5) : Refresh Token 구현

https://ekeprl.tistory.com/66 [Spring Security - JWT] (4) : 로그인 API 및 Postman 테스트https://ekeprl.tistory.com/65 [Spring Security - JWT] (3) : JwtFilter이전 포스팅을 통해 JWT 토큰의 생성과 검증을 담당하는 JwtUtil을 작성

ekeprl.tistory.com

 

이전포스팅은 RefreshToken 구현에 대해 알아보았다.

 

이번 포스팅은 이어서 재발급 / 로그아웃 API 및 Postman을 이용한 테스트를 진행해보려 한다.

 

1. UserService

fun refresh(refreshToken: String): String {
    // 토큰 유효성 검증
    if (!jwtUtil.validateToken(refreshToken)) {
        throw IllegalArgumentException("유효하지 않은 토큰입니다.")
    }

    // DB에서 토큰 조회
    val savedToken = refreshTokenMapper.findByToken(refreshToken)
        ?: throw IllegalArgumentException("존재하지 않는 토큰입니다.")

    // 만료 시간 체크
    if (savedToken.expiredAt.isBefore(LocalDateTime.now())) {
        throw IllegalArgumentException("만료된 토큰입니다.")
    }

    // 새 Access Token 발급
    val user = userMapper.findById(savedToken.userId)
        ?: throw IllegalArgumentException("존재하지 않는 유저입니다.")

    return jwtUtil.generateAccessToken(user.id, user.email, user.role.toAuthority())
}

fun logout(userId: String) {
    refreshTokenMapper.deleteByUserId(userId)
}

 

 1) Refresh Token의 유효성을 검증하고

 2) DB를 조회

 3) 만료시간 체크 순으로 검증을 하고 새로운 Access Token을 반환하도록 로직을 구성했다.

 

2. Controller

@PostMapping("/refresh")
fun refresh(@RequestBody request: RefreshRequest): ApiResponse<String> {
    val accessToken = userService.refresh(request.refreshToken)
    return ApiResponse.success(accessToken)
}

@PostMapping("/logout")
fun logout(): ApiResponse<Unit> {
    val userId = SecurityContextHolder.getContext().authentication?.principal as String
    userService.logout(userId)
    return ApiResponse.success()
}

 

/refresh /logout을 추가했다.

/logout은 SecurityContext에서 인증된 userId를 꺼내 Refresh Token을 삭제하도록 작성했다.

 

이어서 Postman을 이용해 테스트를 진행해 보겠다.

 

3. Postman테스트

 3.1 Refresh Token 발급테스트

Refresh Token 발급 테스트트

200 OK가 나타나면서 정상적으로 발급된 것을 확인할 수 있다.

 

 

 3.2 Logout 테스트

로그아웃 테스트

 

로그아웃 역시 정상적으로 테스트 완료를 확인할 수 있다.

 

이상으로 6편에 걸친 Spring Security - JWT 시리즈를 마무리했습니다.

감사합니다.

반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/08   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함