반응형

기존에는 session을 이용하여 사용자 정보를 받아왔지만, 이 프로젝트를 MSA로 만들었기 때문에 session을 사용하지 못하고 Filter에서 Context로 사용자 정보를 넣고 가져올 것이다.

 

그렇기 때문에

https://seungkyu.tistory.com/36

 

코루틴 + WebFlux에 AOP 적용하기

https://tech.kakaopay.com/post/overcome-spring-aop-with-kotlin/ Kotlin으로 Spring AOP 극복하기! | 카카오페이 기술 블로그Kotlin의 문법적 기능을 사용해서 Spring AOP 아쉬운 점을 극복한 경험을 공유합니다.tech.kakaopa

seungkyu.tistory.com

이 때, 사용한session에서 사용자 정보를 가져오는 방법은 사용할 수 없다.

 

그렇다고 해서, context로부터 사용자 정보를 가져올 수도 없다.

해당 Aspect는 다른 context에서 실행되기 때문에 사용자 정보가 삽입되어 있지 않기 때문이다.

 

그렇기에 header에서 사용자 정보를 가져오려고 한다.

 

해당 로깅은 서비스에서만 사용하기 때문에, 모든 함수가 첫번째 인자로 ServerRequest를 받는다.

이 ServerRequest에는 header의 정보가 있다.

 

val authorization = (joinPoint.args[0] as ServerRequest)
            .headers().firstHeader("Authorization") ?: return joinPoint.proceed()

 

첫번째 인자를 ServerRequest로 casting 한 후에 Authorization 헤더를 가져온다.

 

그리고는 주입받은 jwtToken component로 해당 헤더를 디코딩하여 사용자 정보를 얻어온다.

 

log.info("Request userId: {}", jwtTokenProvider.getId(authorization.removePrefix("Bearer ")))

 

앞에 있는 Bearer prefix는 제거해주고 디코딩 하도록 한다.

 

모두 마쳤으면 함수가 계속 실행될 수 있도록

return joinPoint.proceed()

 

joinPoint를 proceed하여 return 해준다.

 

 

아래는 완성된 전체 코드이다.

@Aspect
@Component
class LoginCheckAspect(
    private val jwtTokenProvider: JwtTokenProvider
) {

    companion object {
        private val log = LoggerFactory.getLogger(LoginCheckAspect::class.java)
    }

    @Around("execution(* *..service.*.*(..)) && @annotation(loginCheck)")
    fun defaultLoginCheck(joinPoint: ProceedingJoinPoint, loginCheck: LoginCheck): Any {

        log.info("Executing method: {}", joinPoint.signature)

        val authorization = (joinPoint.args[0] as ServerRequest)
            .headers().firstHeader("Authorization") ?: return joinPoint.proceed()

        log.info("Request userId: {}", jwtTokenProvider.getId(authorization.removePrefix("Bearer ")))

        return joinPoint.proceed()
    }
}

 

일단은 이렇게 의도한대로 출력되는 것을 볼 수 있다.

 

다른 좋은 방법이 있을 것도 같은데, 일단은 생각이 안나서 이렇게 만들어봤다.

 

다른 구현이 있으면 또 포스팅 해보도록 하겠다.

 

+ Recent posts