REST API 토큰 갱신하기 요청시 401 에러 발생하는 이유

안녕하세요. REST API의 토큰 갱신하기 (REST API | Kakao Developers REST API) 를 서비스에서 구현하려고 합니다.

스벨트킷을 사용하고 있어서, 토큰 갱신하기 REST API를 요청할 /api/kakao라는 엔드포인트를 만들고 여기에 POST 메서드를 작성한 코드의 일부분은 다음과 같습니다.

export async function POST({ request }) {
	const { refresh_token } = await request.json();

	console.log(KAKAO_REST_KEY);
	console.log(refresh_token);

	const res = await axios.post(
		'https://kauth.kakao.com/oauth/token',
		{
			grant_type: 'refresh_token',
			client_id: KAKAO_REST_KEY,
			refresh_token
		},
		{
			headers: {
				'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8'
			}
		}
	);
}

클라이언트 코드에서 axios를 이용해서 /api/kakao 로 사용자의 refresh_token과 함께 HTTP POST 요청을 보내면 해당 메서드로 값이 잘 전달됩니다. KAKAO_REST_KEY에는 앱 키가 정확하게 잘 입력되어 있는 것을 확인하였고, refresh_token의 값도 정확하고 만료 기한도 지나지 않은 것을 확인했습니다.

그런데 서버 코드에서 해당 값들을 통해서 axios 요청을 보내면 다음과 같은 오류가 발생합니다.

Request failed with status code 401
Error: Request failed with status code 401
at createError (/Users/heygwangjin/insomenia/balpoomman/node_modules/axios/lib/core/createError.js:16:15)
at settle (/Users/heygwangjin/insomenia/balpoomman/node_modules/axios/lib/core/settle.js:17:12)
at IncomingMessage.handleStreamEnd (/Users/heygwangjin/insomenia/balpoomman/node_modules/axios/lib/adapters/http.js:322:11)
at IncomingMessage.emit (node:events:525:35)
at IncomingMessage.emit (node:domain:489:12)
at endReadableNT (node:internal/streams/readable:1359:12)
at process.processTicksAndRejections (node:internal/process/task_queues:82:21)

혹시나 해서 curl 명령어를 통해서 해당 요청을 보냈는데 여기서는 응답이 잘 오는 것을 확인 했습니다.몇 시간 째 이 오류를 해결하지 못 하고있어서 어떻게 해결해야할 지 질문 드립니다.

안녕하세요.

파라미터는 x-www-form-urlencoded 유형으로 전달되어야 합니다.

ex, 
await axios.post(
  'https://kauth.kakao.com/oauth/token',
  new URLSearchParams({
    grant_type: 'refresh_token',
    client_id: KAKAO_REST_KEY,
    refresh_token  
  }),
...

감사합니다. 바로 해결되었네요…

헤더에 명시되는 Content-Type 에 알맞은 파라미터 유형으로 body에 전달해야되는 것을 몰랐습니다. 대부분 json 형태로 전달해서 지금까지는 잘 됐었나 봅니다. 덕분에 하나 배워갑니다. 감사합니다!