728x90

 

WebFlux 에서는 WebMvc 와는 다른 방법으로 header 를 handling 해야합니다.

login 을 했을때 cookie 를 set 하는 예시로 시작해보겠습니다.

 

@MutationMapping
fun login(
    @Argument input: LoginInput,
    context: GraphQLContext
): Mono<AuthToken> {
    return memberService.login(input)
        .flatMap {
            context.put("token", it.token)
            Mono.just(AuthToken(it.tokenType, it.token))
        }
}
 

GraphqlContext 에 key value 형태로 token 을 저장합니다.

그리고 headerInterceptor 를 만들어 context 의 값을 꺼내 request header 에 set 합니다.

 
@Component
class HeaderInterceptor : WebGraphQlInterceptor {
    override fun intercept(request: WebGraphQlRequest, chain: WebGraphQlInterceptor.Chain): Mono<WebGraphQlResponse> {
        return chain.next(request).doOnNext { response ->
            var value: String = response.executionInput.graphQLContext.get("token")
            var cookie = ResponseCookie.from("token", value)
                .maxAge(Duration.ofDays(1L))
                .build()
            response.responseHeaders.add(HttpHeaders.SET_COOKIE, cookie.toString())
        }
    }
}
 

spring webFlux graphql 에서는 controller 에서 바로 request 객체에 접근하는 법을 찾지 못해 context 에 값을 저장하고 interceptor 에서 처리하는 방식으로 해결 했습니다.

context -> interceptor 방식을 알아두면 webFlux 에서 header 를 좀더 쉽게 handling 할수 있을거 같습니다.

728x90