Skip to content

Commit 9e29783

Browse files
committed
refactor: RefreshToken 생성 및 저장 로직을 논블로킹으로 리팩토링
1 parent 0036ad0 commit 9e29783

3 files changed

Lines changed: 17 additions & 16 deletions

File tree

nmnb-common/src/main/kotlin/nmnb/common/security/jwt/BaseJwtProvider.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ abstract class BaseJwtProvider(
2929
fun createAccessToken(now: Instant, email: String, deviceId: String) =
3030
generateJwt(now, email, jwtProperties.accessExpirationTime, deviceId)
3131

32-
fun createRefreshToken(now: Instant, email: String, deviceId: String): String {
32+
fun createRefreshToken(now: Instant, email: String, deviceId: String): Any {
3333
return generateJwt(now, email, jwtProperties.refreshExpirationTime)
3434
}
3535

nmnb-webflux/src/main/kotlin/nmnb/webflux/global/auth/service/AuthServiceImpl.kt

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -87,17 +87,14 @@ class AuthServiceImpl(
8787
private fun issueNewToken(email: String, deviceId: String): Mono<Pair<String, String>> {
8888
val now = Instant.now()
8989
val accessToken = jwtProvider.createAccessToken(now, email, deviceId)
90-
val refreshToken = jwtProvider.createRefreshToken(now, email, deviceId)
91-
92-
val saveRefreshToken =
93-
Mono.fromCallable { refreshTokenService.upsertRefreshToken(email, deviceId, refreshToken) }
94-
.subscribeOn(Schedulers.boundedElastic())
95-
96-
val cleanupRefreshToken = Mono.fromCallable { refreshTokenService.removeOldestTokenIfLimitExceeded(email) }
90+
val refreshTokenMono = jwtProvider.createRefreshToken(now, email, deviceId)
9791
.subscribeOn(Schedulers.boundedElastic())
9892

99-
return saveRefreshToken
100-
.then(cleanupRefreshToken)
101-
.then(Mono.just(Pair(refreshToken, accessToken)))
93+
return refreshTokenMono.flatMap { refreshToken ->
94+
refreshTokenService
95+
.upsertRefreshToken(email, deviceId, refreshToken)
96+
.then(refreshTokenService.removeOldestTokenIfLimitExceeded(email))
97+
.thenReturn(Pair(refreshToken, accessToken))
98+
}.subscribeOn(Schedulers.boundedElastic())
10299
}
103100
}

nmnb-webflux/src/main/kotlin/nmnb/webflux/global/infrastructure/security/JwtProvider.kt

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import nmnb.common.properties.JwtProperties
66
import nmnb.common.security.jwt.BaseJwtProvider
77
import nmnb.common.utils.JwtConstants.EMAIL_CLAIM_KEY
88
import org.springframework.stereotype.Component
9+
import reactor.core.publisher.Mono
10+
import reactor.core.scheduler.Schedulers
911
import java.time.Instant
1012
import java.time.LocalDateTime
1113
import java.time.ZoneId
@@ -15,18 +17,18 @@ class JwtProvider(
1517
private val refreshTokenRepository: RefreshTokenRepository,
1618
private val jwtProperties: JwtProperties,
1719
) : BaseJwtProvider(jwtProperties) {
18-
override fun createRefreshToken(now: Instant, email: String, deviceId: String): String {
20+
override fun createRefreshToken(now: Instant, email: String, deviceId: String): Mono<String> {
1921
val refreshToken = generateJwt(now, email, jwtProperties.refreshExpirationTime)
20-
saveRefreshToken(email, deviceId, refreshToken, now)
21-
return refreshToken
22+
return saveRefreshToken(email, deviceId, refreshToken, now)
23+
.thenReturn(refreshToken)
2224
}
2325

2426
private fun saveRefreshToken(
2527
email: String,
2628
deviceId: String,
2729
refreshToken: String,
2830
now: Instant?,
29-
) {
31+
): Mono<Void> {
3032
val redisKey = "$email:$deviceId"
3133
val timeStamp = now?.atZone(ZoneId.systemDefault())?.toLocalDateTime()
3234
?: LocalDateTime.now()
@@ -38,7 +40,9 @@ class JwtProvider(
3840
timeStamp = timeStamp,
3941
deviceId = deviceId,
4042
)
41-
refreshTokenRepository.save(token)
43+
return Mono.fromCallable { refreshTokenRepository.save(token) }
44+
.subscribeOn(Schedulers.boundedElastic())
45+
.then()
4246
}
4347

4448
fun isValidToken(token: String): Boolean {

0 commit comments

Comments
 (0)