[댕누비/React] API 인증 오류, 인코딩 문제 해결

이번에 새로 '반려동물 동반 관광 사이트' 프로젝트를 작업중인데, 하면서 겪었던 오류들을 적어보고자한다. api 연결이 익숙하지도 않지만 진짜 생각치도 못한 원인을 찾은 김에 ㅠㅠ..!!!ㅋㅋㅋㅋㅋ

오류 상황: 인증키가 맞는데 계속 인증이 실패하는 문제

      • .envVITE_TOUR_API_KEY= (키번호)%2F(키번호) 이렇게 키를 잘 넣었음!!!
      • console.log(import.meta.env.VITE_TOUR_API_KEY) 하면 정상 출력됨
      • 그런데 최종 요청 URL을 찍어보니:
...ServiceKey=(키번호)%252F(키번호)...
=> 알고보니 %2F → %252F 로 이중 인코딩 상태가 발생

인코딩에 대한 이해도도 부족한 지라 정말 '이거 왜이래???' 라는 생각만 들던 차에 이중 인코딩의 문제라는 걸 깨달았을땐 너무너무 충격이었다. 


원인: URL SearchParams가 자동으로 다시 인코딩 함

fetch() 요청 전에 URL을 만들면서 URLSearchParams를 사용했는데, 이게 자동으로 인코딩을 해주어서 문제가 발생했던 거였다.

  const commonParams = {
    ...params,
    ServiceKey: API_KEY,
    MobileOS: 'ETC',
    MobileApp: 'PetTourApp',
    _type: 'json',
  };

  const queryString = new URLSearchParams(commonParams).toString();
  const url = `${BASE_URL}/${service}/${operation}?${queryString}`;

.evn에 이미 URL 인코딩된 키(%2F, %3D 등)이 들어가있으면, URLSearchParams가 이걸 다시 인코딩 한다.

  • %%25
  • %2F%252F

그래서 최종 URL이 이중 인코딩되어 API 서버가 키를 인식하지 못하는 것!!


해결 방법: 디코딩 키를 사용하기

한국관광공사 API는 키를 2개 제공한다. 필자는 Encoding 키를 넣어뒀었으나, 

.env에 Decoding 키를 복사하여 넣으니 URL 인식이 안되어 출력도 안되던 문제가 해결되었다.

 

보너스 공부: %2F와 %25F의 차이 정리

웹에서는 URL 안에 특수문자(예: /, =, &)가 있으면 그대로 쓰지 못하고 %코드로 바꿔서 안전하게 전송하는 것을 인코딩 이라고 한다. 

입력 문자  인코딩 결과 
/ %2F
%2F %252F

따라서, %2F는 한 번 인코딩 된 정상값이고, %252F는 두 번 인코딩된 잘못된 값.


정리

행동 결과 해결책 
인코딩된 키를 .env에 넣음 이중 인코딩 발생 → 인증 실패 디코딩 키를 사용
URLSearchParams를 사용 내부적으로 자동 인코딩 인코딩 된 값 넣지 않기! 

 

개발하면서 오류가 없을 순 없고, 새 프로젝트를 시작한 만큼 이것저것 더 많겠지만!! 하고나면 이만큼 뿌듯할 수가😂

어찌저찌 그래도 해결하고 나니 값진 공부였다고 생각하니 기쁘다.