개발 과정에서 API 문서화 도구인 Swagger를 활용할 때, curl 명령어를 제대로 이해하지 못해 발생한 실수와 그 해결책에 대해 알아봅니다.
React Native 프로젝트에서 JWT 토큰 갱신 기능을 구현하던 중 발생한 문제였습니다.
백엔드 API는 제대로 동작하고 있었지만, 프론트엔드에서 토큰 갱신 요청이 계속 실패했습니다.
서버에서 제공한 Swagger 문서에는 다음과 같은 curl 명령어가 예시로 제공되었습니다:
curl -X 'POST' \
'http://13.125.58.70:8080/auth/refresh' \
-H 'accept: */*' \
-H 'Refresh-Token: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0MTIzNEBnbWFpbC5jb20iLCJ1c2VySWQiOjMwLCJqdGkiOiJmYWJhZDEzNi1jYzk2LTRhZjktOTEwOS05YjUzNWFhMDJhZWMiLCJleHAiOjE3NDE5MzI2NDcsImlhdCI6MTc0MDcyMzA0N30.NU3EiD3yZUW79ODuQQkd-XrF0wPN1tMuvHT-ThhGwGY' \
-d ''
반면, 제가 작성한 axios 코드는 다음과 같았습니다:
const response = await refreshAxios.post("/auth/refresh", null, {
headers: { refreshToken },
});
curl 명령어와 axios 요청의 차이점을 자세히 살펴보면 명백한 문제가 보입니다:
Refresh-Token
refreshToken
이 작은 차이가 API 요청이 실패하는 결정적인 원인이었습니다.
axios 요청에서 헤더 이름을 올바르게 수정했습니다:
const response = await refreshAxios.post("/auth/refresh", null, {
headers: { "Refresh-Token": refreshToken },
});
이렇게 수정한 후에는 토큰 갱신 요청이 정상적으로 동작했습니다.
curl 명령어를 제대로 해석하지 못해 발생한 이 문제를 통해 배운 점을 정리해 보겠습니다.
curl [옵션] [URL]
-X
: HTTP 메소드 지정 (GET, POST, PUT, DELETE 등)-H
: HTTP 헤더 지정-d
: HTTP 요청 본문(body) 데이터 지정-H '헤더이름: 헤더값'
curl 명령에서 -H
옵션 다음에 오는 '헤더이름: 헤더값' 형식을 정확히 파악해야 합니다. 헤더 이름은 대소문자를 구분하며, 대시(-)가 포함된 경우도 있습니다.
Swagger에서 제공하는 curl 예제는 API 요청을 정확하게 구성하는 데 매우 유용합니다:
-X 'POST'
와 같은 부분에서 어떤 메소드를 사용해야 하는지 확인-H
옵션 뒤에 오는 헤더들을 정확히 확인-d
옵션 뒤에 오는 데이터 형식 확인curl 명령을 axios 요청으로 변환할 때 주의해야 할 점:
curl -X 'POST' \
'http://example.com/api/resource' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer token123' \
-d '{"name":"value"}'
위 curl 명령은 다음과 같이 axios로 변환됩니다:
axios.post('http://example.com/api/resource',
{ name: 'value' },
{
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer token123'
}
}
);
API 개발 시 Swagger와 같은 문서화 도구에서 제공하는 예제는 매우 중요한 참고 자료입니다.
특히 curl 명령어는 API 요청의 모든 세부사항을 담고 있으므로, 이를 정확히 해석하여 코드로 구현하는 능력이 필요합니다.
이번 경험을 통해 작은 차이(헤더 이름의 대소문자와 하이픈)가 API 통신에 큰 영향을 미칠 수 있다는 것을 다시 한번 깨달았습니다. 문제 해결 과정에서 디버깅 능력도 향상되었고, curl 명령어와 HTTP 프로토콜에 대한 이해도 깊어졌습니다.
다음에 비슷한 상황이 발생하면 Swagger에서 제공하는 curl 예제를 더 꼼꼼히 살펴보고, 헤더 이름과 형식을 정확히 일치시키는 것이 중요하다는 것을 기억하겠습니다.