목차
1. 개요 - 무엇이 다른가?
2. 요청(Request) 생성 방식
3. 응답(Response) 처리 방식
4. 브라우저 동작과 UX
5. 네트워크 계층 관점 요약
6. 결론
단순 HTML <form> 전송 방식과 fetch API 전송 방식은 기능적으로는 "서버로 HTTP 요청을 보낸다"는 점에서 같지만, 네트워크 계층 동작 방식과 브라우저 처리 관점에서 중요한 차이가 있다.
핵심 차이점
◦ 요청 생성 주체: 브라우저 자동 생성 vs 개발자 직접 제어
◦ 응답 처리 방식: 브라우저의 페이지 전환 vs 자바스크립트 코드 처리
◦ 사용자 경험(UX): 전체 페이지 새로고침 vs 부분적 동적 업데이트
이 두 방식의 근본적인 차이점을 가지고 자세히 알아보겠다.
브라우저와 서버가 통신하기 위해서는 HTTP 스펙에 맞는 요청과 응답을 해야한다.
먼저 브라우저에서는 표준 헤더가 담긴 요청을 서버에게 보낸다.
이때 요청 방식에 따라 브라우저에서 작동하는 방식과 직접 제어하는 방식으로 나뉜다.
서버는 브라우저에게 받은 요청에 따른 응답을 해준다.
이때 브라우저의 응답은 서버에서 페이지를 직접 던져주면서 새로 로드되거나,
비동기 객체를 사용하여 페이지가 새로 로드되지 않고 자바스크립트에서 세부적인 컨트롤이 가능한 방식으로 나뉜다.
Promise<Response> 객체로 전달된다.response.json(), response.text() 등으로 직접 파싱해 사용자가 원하는 로직으로 처리할 수 있다.<form>의 전송 결과는 브라우저 렌더링 파이프라인으로 바로 들어간다.
(응답 본문 = 새 페이지로 렌더링)
응답 데이터를 JS 코드에서 직접 가공하거나 조건에 따라 분기 처리하는 것은 불가능하다.
따라서 "조건에 따라 다른 페이지로 보낸다" 같은 로직은 서버에서 결정해야 한다.
Form 전송 후 서버가 3xx 상태 코드(302 Found, 303 See Other 등)를 응답하면,
브라우저는 자동으로 Location 헤더에 지정된 URL로 이동한다.
이 과정에서 개발자가 중간에 자바스크립트로 개입할 수 없다.
즉, 리다이렉트를 서버가 제어해야 한다.
HTTP/1.1 302 Found
Location: /home → 브라우저는 /home 자동 이동된다!

fetch는 응답이 JS로 전달되고, 서버가 3xx 응답을 보내면 브라우저 fetch가 내부적으로 그 리다이렉트를 따라가서 최종 응답까지 자동으로 받아온다.
const res = await fetch("/login", { method: "POST" }); // follow(기본)
if (res.redirected) {
// 필요하면 여기서 직접 네비게이션
window.location.href = res.url;
}

redirect: "follow"으로 자동 추적하고, 중간의 3xx 응답은 JS에 노출되지 않고, Promise는 최종 응답으로 resolve 된다.위의 응답에 따라 브라우저의 동작 과정이 달라지고 사용자 경험까지 달라지게 된다.
| 구분 | HTML Form | fetch API |
|---|---|---|
| 요청 생성 | 브라우저가 자동 조립 (제한적 제어) | 개발자가 완전 제어 가능 |
| 응답 처리 | 브라우저가 페이지로 렌더링 | JS 코드에서 직접 가공 |
| 네트워크 연결 | 쿠키/세션 자동 포함 | credentials 옵션으로 통제 |
| UX 영향 | 전체 페이지 리로드 | 페이지 유지 + 부분 업데이트 |
두 방식은 동일한 HTTP 계층을 사용하지만, '응답 처리 주체'와 '화면 갱신 방식'에서 본질적인 차이를 보인다.