본문 바로가기
[SpringBoot]

Spring Kotlin - WebClient 인코딩 주의사항 !

by Hevton 2024. 8. 18.
반응형

 

 

WebClient를 이용하다 보면, API_KEY나 serviceKey 개념을 사용하실 경우도 있을 텐데요

이 때, 주의하셔야 할 점이 있습니다. (물론 정..상 적인 api 명세라면 문제가 없을 겁니다)

 

올바른 API KEY를 전달했음에도 불구하고 WebClient 자체적으로 인코딩을 적용하기 때문에

개발자가 넣은 API KEY가 변형되어 전달될 수 있기 때문입니다.

 

공감하시는 분들은 인증 Key를 잘 입력했는데도 불구하고, 올바르지 않은 키가 입력되었다는 경험을 하고 계실 겁니다.

직접 로그를 찍어보시면, 전달했던 API KEY와 실제로 적용되고 있는 API KEY가 다르다는 것을 요청 url을 통해 확인할 수 있습니다.

 

%3D -> %253D

이런식으로 말이죠!

 

WebClient의 기본적인 인코딩 방식은 UriComponentsBuilder#encode() 옵션을 통해 예약 문자들을 치환한다고 합니다.

사실 문제될 것은 없지만, 지금처럼 url query param으로 api key가 전달될 경우 문제가 발생할 수 있습니다.

보통은 auth header에 인증키가 전달되기에 이럴 일이 잘 없긴 하죠.. ㅎㅎ

 

저는 공공데이터를 사용하고 있는데, 공공데이터 api는 serviceKey가 모두 query param으로 전달된다는 치명적인 문제가 있습니다..

제가 명세를 바꿀 수도 없으니..ㅜㅜ

 

 

여튼 백엔드에서 정해놓은 api 명세를 변경할 수가 없다면,  기본 인코딩을 제거해주는 추가적인 과정이 필요합니다.

val webClient: WebClient = WebClient.builder()
    .uriBuilderFactory(
        DefaultUriBuilderFactory(publicDataApiConfig.baseUrl).apply { 
            encodingMode = EncodingMode.VALUES_ONLY
        }
    )
    .build()

기존에 사용하시던 WebClient를 이렇게 사용해주시면 됩니다.

 

 

 

참고

- 인코딩이 결국 두 번 되기 때문이다

반응형