HTTP는 request/response를 주고받는 프로토콜이다.
그런데 HTTP에는 웹을 이해할 때 반드시 짚고 넘어가야 하는 특징이 있다.
- 비연결성(connectionless)
- 무상태성(stateless)
이 두 가지 때문에 웹은 “가볍게 많은 요청을 처리할 수 있는 구조”가 되었고,
동시에 “로그인 상태 같은 걸 유지하기 어려운 구조”가 되었다.
비연결성: 요청과 응답이 끝나면 연결을 끊는다
비연결성은 말 그대로 연결을 계속 붙잡고 있지 않는다는 의미이다.
HTTP 통신은 기본적으로 이런 흐름이다.
- 브라우저가 서버에 요청(request)을 보낸다
- 서버가 처리한 뒤 응답(response)을 보낸다
- 이 요청/응답 처리가 끝나면 연결을 종료한다
즉, 서버 입장에서는
- 한 요청 처리하고
- 응답 보내고
- 연결을 정리하고
- 다음 요청을 받을 준비를 한다
이런 방식으로 동작한다.
왜 굳이 연결을 끊는가
웹의 특성상 수많은 사용자가 동시에 서버를 호출한다.
만약 서버가 사용자 한 명당 연결을 계속 유지해야 한다면
서버 자원이 금방 고갈된다.
비연결성은 다음 장점을 만든다.
- 요청 하나를 빨리 처리하고 연결을 정리한다
- 같은 자원으로 더 많은 요청을 처리할 수 있다
- 서버가 동시에 많은 사용자를 상대하기 쉬워진다
즉 비연결성은 “서버 확장성”을 위해 선택된 특성이다.
무상태성: 서버는 이전 요청을 자동으로 기억하지 않는다
무상태성은 한마디로 이런 뜻이다.
서버는 이전 요청이 무엇이었는지 기억하지 않는다
HTTP는 기본적으로 요청/응답이 한 번 끝나면 관계도 끝난다.
그래서 다음 요청이 들어왔을 때 서버는 “새로운 요청”으로 취급한다.
예를 들어 이런 요청이 연속으로 들어온다고 해보자.
- 첫 요청: 로그인 페이지 요청
- 두 번째 요청: 로그인 성공
- 세 번째 요청: 마이페이지 요청
사람 입장에서는 “같은 사람의 연속 행동”처럼 보이지만,
HTTP만 놓고 보면 서버는 기본적으로 다음을 보장하지 않는다.
- “이 요청이 아까 로그인한 사용자 요청인지”
- “이 사용자가 이전에 무슨 요청을 했는지”
즉, HTTP 자체만으로는 사용자 상태를 자동으로 이어붙여주지 않는다.
새로고침이 왜 이런 식으로 동작하는가
브라우저에서 새로고침을 누르면
브라우저는 보통 “마지막으로 성공한 요청”을 다시 보낸다.
여기서 중요한 포인트는 이것이다.
- 새로고침은 “무조건 GET부터 다시 시작”이 아니다
- 브라우저는 “현재 화면을 만들었던 마지막 요청”을 재실행하려고 한다
그래서 마지막 요청이 POST였다면
새로고침 시 POST 재전송 경고가 뜨는 경우가 생긴다.
이 문제를 해결하기 위해 POST-Redirect-GET(PRG) 패턴 같은 흐름이 등장한다.
비연결성/무상태성이 만들어내는 현실적인 문제
이 특성 때문에 웹에서는 이런 문제가 생긴다.
- 로그인 상태를 유지하기 어렵다
- 사용자가 누군지 매번 다시 확인해야 한다
- 장바구니처럼 “사용자별 상태”를 기억해야 하는 기능이 어렵다
그래서 웹에서는 상태 유지를 위해 별도의 메커니즘을 사용한다.
대표적인 방식이 다음이다.
- 쿠키(cookie)
- 세션(session)
이게 바로 “세션 트래킹”이라는 주제로 이어진다.
정리
- 비연결성: request/response 처리가 끝나면 연결을 종료한다
- 무상태성: 서버는 이전 요청을 자동으로 기억하지 않는다
- 장점: 같은 자원으로 많은 요청을 처리할 수 있다
- 단점: 로그인 같은 상태 유지를 별도로 구현해야 한다
이제 웹의 기본 동작 구조는 완성됐다.
'Web > Web Basics' 카테고리의 다른 글
| [서블릿과 JSP] 1. 서블릿이란? (0) | 2026.03.29 |
|---|---|
| [웹 기초] 9. 개발자 도구(Network)로 request/response를 눈으로 확인하는 방법 (0) | 2026.03.29 |
| [웹 기초] 7. HTTP 메시지는 왜 Header와 Body로 나뉘는가 (0) | 2026.03.29 |
| [웹 기초] 6. 프로토콜과 HTTP/HTTPS (0) | 2026.03.29 |
| [웹 기초] 5. 웹 서버와 WAS (0) | 2026.03.29 |