← 글 목록

notes

GET 요청에 Body 사용 불가 가이드

GET 요청에서 Body를 사용할 수 없는 이유와 대체 전달 방식 가이드.

🔍 GET 요청에 Body 붙여도 될까?

  • 한 줄 요약: GET에 body는 사실상 불가입니다. 쿼리스트링 또는 POST를 쓰세요.

✅ 왜 안 되나요?

  • RFC 표준: GET의 본문은 의미가 정의되지 않았어요. 즉, 써도 “어떻게 해석할지”가 표준에 없음.
  • 브라우저·프록시·CDN: 대부분 무시하거나 잘라냅니다.
  • 라이브러리(fetch/axios/ky): GET body를 지원하지 않거나 무시해요.

📚 근거 레퍼런스


🧭 그러면 어떻게 보내요?

1) 파라미터가 간단해요 → 쿼리스트링

import ky from "ky";

await ky.get("/search", {
  searchParams: { q: "camp", page: 1, size: 20 },
}).json();

2) 조건이 길고 복잡해요 → POST + JSON

await ky.post("/search", {
  json: {
    q: "camp",
    filters: { region: ["강릉","양양"], spec: ["전기","반려동물"] },
    sort: "popular",
    page: 1, size: 20,
  },
}).json();
  • 캐싱이 걱정되면?
  • 서버: Cache-Control/ETag로 POST도 캐싱 가능
  • 클라이언트: React Query queryKey에 body 요약을 포함해 캐싱 키 관리

🧪 Postman에서는 되는데요?

  • Postman은 “붙여서 보낼 수는” 있지만, 실제 웹 경로(브라우저→프록시→서버)에서 무시/차단될 확률이 높습니다.
  • “Postman OK = 프로덕션 OK”가 아닙니다. 운영 환경 기준으로 설계하세요.

🧰 실무 체크리스트

  • ✅ 짧은 파라미터는 searchParams
  • ✅ 복잡/대용량 조건은 POST + JSON
  • ✅ URL 길이(수백~수천 bytes) 넘을 듯하면 무조건 POST
  • ✅ 인증 API면 동일 오리진/쿠키 정책(credentials: "include") 확인

🙋‍♀️ 자주 받는 질문(FAQ)

  • Q. “읽기”인데 POST 쓰면 이상하지 않나요?
  • A. 아닙니다. REST 의미상 GET이 이상적이긴 하나, 본문 전달/캐싱/프록시 호환성 때문에 검색 같은 읽기도 POST를 자주 씁니다.
  • Q. 쿼리 너무 길어요. 압축해서 GET으로 보내면 되나요?
  • A. URL 길이 제한/로그 노출 위험/공유 불편 등으로 비추천. POST로 바꾸세요.
  • Q. 캐싱이 꼭 필요해요.
  • A. 서버 캐시 헤더 또는 CDN 캐시, 클라이언트 캐시(queryKey)로 해결하세요.

🧩 우리 코드에 바로 적용

  • ky GET 자동완성 예시
await ky.get("/v1/thankq/search/autocomplete/camp-spec", {
  searchParams: request, // { keyword: "...", limit: "10" }
}).json();
  • ky POST 검색 예시
await ky.post("/v1/thankq/search/complex", {
  json: requestBody, // 길고 복잡한 조건
}).json();

필요하면 Notion 템플릿용으로 섹션/토글/콜아웃 블록 형태도 변환해 드릴게요.