From 3157489399488ac6d280bfeb8645f175055c236f Mon Sep 17 00:00:00 2001 From: pricelees Date: Tue, 29 Jul 2025 14:03:02 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20Interceptor=20/=20Resolver=20=EC=97=90?= =?UTF-8?q?=20=EC=8B=A4=ED=8C=A8=20=EB=A1=9C=EA=B9=85=20=EB=B0=8F=20?= =?UTF-8?q?=EC=84=B1=EA=B3=B5=EC=8B=9C=20member=5Fid=20MDC=20=EB=93=B1?= =?UTF-8?q?=EB=A1=9D=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/web/support/AuthInterceptor.kt | 23 ++++++++++++++----- .../auth/web/support/MemberIdResolver.kt | 16 ++++++++++++- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/main/kotlin/roomescape/auth/web/support/AuthInterceptor.kt b/src/main/kotlin/roomescape/auth/web/support/AuthInterceptor.kt index c8b90bcc..9b7dadb8 100644 --- a/src/main/kotlin/roomescape/auth/web/support/AuthInterceptor.kt +++ b/src/main/kotlin/roomescape/auth/web/support/AuthInterceptor.kt @@ -1,7 +1,10 @@ package roomescape.auth.web.support +import io.github.oshai.kotlinlogging.KLogger +import io.github.oshai.kotlinlogging.KotlinLogging import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletResponse +import org.slf4j.MDC import org.springframework.stereotype.Component import org.springframework.web.method.HandlerMethod import org.springframework.web.servlet.HandlerInterceptor @@ -11,6 +14,8 @@ import roomescape.auth.infrastructure.jwt.JwtHandler import roomescape.member.business.MemberService import roomescape.member.infrastructure.persistence.MemberEntity +private val log: KLogger = KotlinLogging.logger {} + @Component class AuthInterceptor( private val memberService: MemberService, @@ -28,23 +33,29 @@ class AuthInterceptor( return true } - val member: MemberEntity = findMember(request) + val accessToken: String? = request.accessToken() + log.info { "[AuthInterceptor] 인증 시작. accessToken=${accessToken}" } + val member: MemberEntity = findMember(accessToken) if (admin != null && !member.isAdmin()) { + log.info { "[AuthInterceptor] 관리자 인증 실패. memberId=${member.id}, role=${member.role}" } throw AuthException(AuthErrorCode.ACCESS_DENIED) } + MDC.put("member_id", "${member.id}") + log.info { "[AuthInterceptor] 인증 완료. memberId=${member.id}, role=${member.role}" } return true } - private fun findMember(request: HttpServletRequest): MemberEntity { + private fun findMember(accessToken: String?): MemberEntity { try { - val token: String? = request.accessToken() - val memberId: Long = jwtHandler.getMemberIdFromToken(token) - + val memberId = jwtHandler.getMemberIdFromToken(accessToken) return memberService.findById(memberId) + .also { MDC.put("member_id", "$memberId") } } catch (e: Exception) { - throw e + log.info { "[AuthInterceptor] 회원 조회 실패. accessToken = ${accessToken}" } + val errorCode = AuthErrorCode.MEMBER_NOT_FOUND + throw AuthException(errorCode, e.message ?: errorCode.message) } } } diff --git a/src/main/kotlin/roomescape/auth/web/support/MemberIdResolver.kt b/src/main/kotlin/roomescape/auth/web/support/MemberIdResolver.kt index 49cbdaca..2731f5d9 100644 --- a/src/main/kotlin/roomescape/auth/web/support/MemberIdResolver.kt +++ b/src/main/kotlin/roomescape/auth/web/support/MemberIdResolver.kt @@ -1,14 +1,21 @@ package roomescape.auth.web.support +import io.github.oshai.kotlinlogging.KLogger +import io.github.oshai.kotlinlogging.KotlinLogging import jakarta.servlet.http.HttpServletRequest +import org.slf4j.MDC import org.springframework.core.MethodParameter import org.springframework.stereotype.Component import org.springframework.web.bind.support.WebDataBinderFactory import org.springframework.web.context.request.NativeWebRequest import org.springframework.web.method.support.HandlerMethodArgumentResolver import org.springframework.web.method.support.ModelAndViewContainer +import roomescape.auth.exception.AuthErrorCode +import roomescape.auth.exception.AuthException import roomescape.auth.infrastructure.jwt.JwtHandler +private val log: KLogger = KotlinLogging.logger {} + @Component class MemberIdResolver( private val jwtHandler: JwtHandler @@ -27,6 +34,13 @@ class MemberIdResolver( val request: HttpServletRequest = webRequest.nativeRequest as HttpServletRequest val token: String? = request.accessToken() - return jwtHandler.getMemberIdFromToken(token) + try { + return jwtHandler.getMemberIdFromToken(token) + .also { MDC.put("member_id", "$it") } + } catch (e: Exception) { + log.info { "[MemberIdResolver] 회원 조회 실패. message=${e.message}" } + val errorCode = AuthErrorCode.MEMBER_NOT_FOUND + throw AuthException(errorCode, e.message ?: errorCode.message) + } } }