HTTP란 하이퍼 텍스트 전송 프로토콜로 오늘날 웹에서 가장 널리 사용되는 프로토콜입니다.
HTTP 핵심 특징은 비연결성과 무상태성입니다. 비연결성은 서버가 클라이언트와의 연결을 필요 이상으로 계속 점유하지 않고, 요청/응답 단위로 자원을 사용하는 성질입니다. HTTP/1.1 이후에는 연결을 재사용할 수 있지만, 애플리케이션 관점에서는 각 요청이 독립적으로 처리됩니다.
무상태성은 서버가 이전 요청의 상태를 기본적으로 기억하지 않는 성질이라, 필요한 정보는 클라이언트가 매 요청에 함께 보내야 합니다. 이 구조는 서버 확장에는 유리하지만, 로그인처럼 상태 유지가 필요한 기능은 쿠키, 세션 , 토큰과 같은 별도의 매커니즘으로 보완해야 합니다.
왜 HTTP는 무상태성으로 설계했을까요?
서버가 이전의 요청을 기억하지 않고 각각의 요청을 독립적으로 처리합니다.
따라서 서버는 특정 클라이언트의 상태에 의존하지 않기에 수평 확장에 용이합니다.
다만 로그인 기능과 같이 상태가 요구되는 상황에서는 쿠키, 세션, 토큰을 활용하여 상태를 별도로 관리합니다.
세션으로 로그인 상태를 저장하면 수평 확장에 어떤 문제가 생기나요?
세션을 각 서버의 메모리에만 저장하면 다른 서버가 요청을 받았을 때 로그인 상태를 알 수 없습니다. 공유 세션 저장소나 세션 복제, 특정 서버로 보내는 sticky session 등을 검토해야 합니다. HTTP가 무상태라는 사실만으로 애플리케이션의 상태 공유 문제가 해결되지는 않습니다.
HTTP의 비연결성이란 무엇인가요?
초기 HTTP/1.0의 기본 방식은 요청·응답 후 연결을 닫는 것이었습니다. 하지만 매번 연결을 만들면 비용이 발생하므로 HTTP/1.1은 지속 연결을 기본으로 사용합니다. 따라서 HTTP가 무상태라는 이유로 매 요청마다 TCP 연결을 끊는다고 설명하면 안 됩니다. RFC 9112의 지속 연결
연결을 끊지 않으면 한 HTTP 응답이 어디에서 끝나는지 어떻게 알 수 있나요?
HTTP/1.1에서는 상태 코드와 메서드에 따른 본문 유무, Content-Length, chunked 전송의 종료 표시 등의 규칙으로 메시지 경계를 판단합니다. 연결 종료로 본문 끝을 나타내는 경우에는 그 연결을 재사용할 수 없습니다. TCP의 한 번 읽기가 HTTP 응답 하나와 같지는 않습니다. RFC 9112의 메시지 길이
HTTP가 무상태인데 SSE처럼 응답을 오래 유지해도 되나요?
가능합니다. 무상태성은 요청 간 업무 상태를 자동으로 기억하지 않는다는 뜻이며, 하나의 응답을 얼마나 오래 보낼 수 있는지와는 별개입니다. SSE는 클라이언트가 시작한 HTTP 요청에 대해 응답을 스트리밍합니다.
HTTP는 TCP 위에서 동작하는데 비연결성이라고 말할 수 있나요?
HTTP는 TCP 위에서 동작하기 때문에 실제 데이터 전송 시에는 TCP 연결을 사용합니다.
다만 HTTP에서 말하는 비연결성은 하나의 요청과 응답을 처리한 뒤 애플리케이션 차원에서 클라이언트와 서버의 연결을 반드시 계속 유지할 필요가 없다는 의미입니다.
HTTP에 Sticky Session을 붙이면 무상태성이 아닌건가요?
Sticky Session을 사용한다고 해서 HTTP 프로토콜 자체의 무상태성이 사라지는 것은 아닙니다. 하지만 특정 사용자 의 이전 상태를 특정 서버가 보관하고, 이후 요청도 해당 서버로 보내야 한다면 애플리케이션 서버는 Stateful한 구조가 됩니다. 이 때문에 서버 확장이나 장애 대응이 어려워질 수 있으며, 이를 피하기 위해 세션을 Redis 같은 외부 저장소에 두거나 JWT처럼 요청 자체에 필요한 정보를 포함시키는 방식을 사용할 수 있습니다.