notes
GET 요청에 Body 사용 불가 가이드
GET 요청에서 Body를 사용할 수 없는 이유와 대체 전달 방식 가이드.
🔍 GET 요청에 Body 붙여도 될까?
- 한 줄 요약: GET에 body는 사실상 불가입니다. 쿼리스트링 또는 POST를 쓰세요.
✅ 왜 안 되나요?
- RFC 표준: GET의 본문은 의미가 정의되지 않았어요. 즉, 써도 “어떻게 해석할지”가 표준에 없음.
- 브라우저·프록시·CDN: 대부분 무시하거나 잘라냅니다.
- 라이브러리(fetch/axios/ky): GET body를 지원하지 않거나 무시해요.
📚 근거 레퍼런스
- RFC 9110 §9.3.1 GET: “A payload within a GET request has no defined semantics.”
- 링크: https://www.rfc-editor.org/rfc/rfc9110#name-get
- WHATWG Fetch Standard: GET/HEAD는 body 금지
- 링크: https://fetch.spec.whatwg.org/#requests
- MDN: GET/HEAD는 body를 가질 수 없음
- 링크: https://developer.mozilla.org/en-US/docs/Web/API/Request/Request
- ky: GET은
searchParams만 사용 - 링크: https://github.com/sindresorhus/ky#searchparams
🧭 그러면 어떻게 보내요?
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 템플릿용으로 섹션/토글/콜아웃 블록 형태도 변환해 드릴게요.