왜 "HTTP는 상태 비 저장 프로토콜"이라고되어 ​​있습니까?


170

HTTP에는 HTTP 쿠키가 있습니다. 쿠키는 서버가 사용자 상태, 연결 수, 마지막 연결 등을 추적 할 수 있도록합니다.

HTTP에는 동일한 TCP 연결에서 여러 요청을 보낼 수있는 영구 연결 (Keep-Alive)이 있습니다.


3
"stateless-ness"가 표시되지 않는 또 다른 영역은 Authorization, 특히 Proxy-Authorization에 있습니다. 협상 중에는 상태가 양호 해 보입니다. NTLM 인증의 경우 클라이언트는 프록시 인증 유형을 기억해야하며 NTLM 메시지 유형에 대한 순서가 있으므로 서버는 상태 저장이 필요합니다. 그래서 나는 대답을 이해하지 못합니다.
Lindsay Morsillo 18

1
이제 HTTP / 1.1을 추가해야합니까? HTTP / 2에 상태가 있다고 생각하기 때문입니다.
Jose Nobile

4
HTTP / 2는 상태 저장입니다. HTTP 1은 상태 비 저장입니다. 쿠키와 같은 HTTP 1에 대한 추후 추가 상태 추가. 이러한 추가 사항은 "핵심"HTTP 1 사양과 다릅니다. 이것이 실제로는 아니지만 HTTP 1이 상태 비 저장 프로토콜이라고하는 이유입니다. 반면에 HTTP / 2는 상태 저장 구성 요소가 구워 지도록 설계되었습니다. "상태 저장"이라고 표시되는 요구 사항을 충족시키기 위해 추가 할 필요는 없습니다.
Zamicol

답변:


130

동일한 HTTP 연결을 통해 여러 요청을 보낼 수 있지만 서버는 동일한 소켓을 통해 도착하는 데 특별한 의미를 부여하지 않습니다. 이는 각 요청에 대한 연결을 다시 설정하는 데 소비되는 시간 / 대역폭을 최소화하기위한 성능 일뿐입니다.

HTTP에 관한 한, 이들은 여전히 ​​별도의 요청이며 요청을 이행하기에 충분한 정보를 자체적으로 포함해야합니다. 이것이 "무국적"의 본질입니다. 서버가 알고있는 일부 공유 정보가 없으면 요청이 서로 연결되지 않습니다. 대부분의 경우 쿠키의 세션 ID입니다.


1
서버가 세션 (서버 측)을 기억하고 이에 따라 사용자 경험을 사용자 정의하면 어떻게됩니까?
NurShomik

3
@NurShomik : 세션의 일반적인 작동 방식에 대한 설명은 stackoverflow.com/a/3521393/319403 을 참조하십시오 .
cHao

12
@Andrew : HTTP는 "빌드 온"TCP가 아니며 TCP의 상태는 HTTP가 아닙니다. 두 개는 스택의 서로 다른 계층에서 완전히 별개의 프로토콜입니다. 원할 경우 명명 된 파이프를 통해 HTTP를 제공하거나 파일을 전송하여 동의 할만한 충분한 마조히스트를 확보 한 경우 HTTP를 제공 할 수 있으며 HTTP는 전송 프로토콜에 구애받지 않기 때문에 정확하게 작동합니다. 이 수준에서는 요청과 응답 만 있습니다. 따라서 하위 수준 또는 더 높은 수준의 프로토콜에서 사용 / 유지 / 필요한 상태에 관계없이 HTTP 자체를 상태 비 저장 상태로 만듭니다.
cHao

@cHao 좋아, 인정 할게 상태 비 저장을 " 작동하기 위해 반드시 상태를 가질 필요는 없음"으로 정의한 경우 (위키 백과에서 인용 한 HTTP 내의 상태에 대한 옵션을 나열하는 아래 dimo414의 답변 참조) 각 프로토콜을 그 아래 계층을 기준으로하지 않고 자체적으로 엄격하게 보는 경우 그렇다면 HTTP가 "상태 비 저장"이라는 데 동의 할 수 있습니다.
앤드류

101

에서 위키 백과 :

HTTP는 상태 비 저장 프로토콜입니다. 상태 비 저장 프로토콜은 서버가 여러 요청 기간 동안 각 사용자에 대한 정보 또는 상태를 유지하도록 요구하지 않습니다.

그러나 일부 웹 응용 프로그램은 예를 들어 웹 서버가 사용자를 위해 웹 페이지의 내용을 사용자 지정해야하는 경우 페이지 간 사용자 진행 상황을 추적해야 할 수 있습니다. 이러한 경우에 대한 솔루션은 다음과 같습니다.

  • HTTP 쿠키 사용.
  • 서버 측 세션
  • 숨겨진 변수 (현재 페이지에 양식이 포함 된 경우)
  • URI로 인코딩 된 매개 변수를 사용하여 URL 재 작성 (예 : /index.php?session_id=some_unique_session_code)

프로토콜을 상태 비 저장 상태로 만드는 이유는 서버가 여러 요청에 대한 상태를 추적 할 필요 가없고 원하는 경우 수행 할 수 없다는 것입니다. 이것은 클라이언트와 서버 사이의 계약을 단순화하며 많은 경우 (예를 들어 CDN을 통해 정적 데이터를 제공하는 경우) 전송해야하는 데이터의 양을 최소화합니다. 클라이언트 방문 상태를 유지하기 위해 서버가 필요한 경우 요청을 발행하고 응답하는 구조가 더 복잡합니다. 모델의 단순성은 가장 큰 특징 중 하나입니다.


21

상태 비 저장 프로토콜은 서버가 여러 요청 기간 동안 각 통신 파트너에 대한 세션 정보 또는 상태를 유지하도록 요구하지 않기 때문입니다.

HTTP는 상태 비 저장 프로토콜이므로 트랜잭션이 끝나면 브라우저와 서버 간의 연결이 끊어집니다.


2
그러나 HTTP는 쿠키를 사용하여 서버에 정보를 저장할 수 있습니다. 연결 유지 HTTP는 각 요청에서 연결을 닫지 않습니다.
호세 노 빌레


18
서버에 정보를 저장한다고해서 연결이 계속 유지되는 것은 아닙니다.
srijan

1
@srijan 글쎄요. 그래서? 아무도 다른 주장을하지 않았습니다.
Mark Amery

10

HTTPstateless protocol각 요청이 이전에 실행 된 요청에 대한 지식없이 독립적으로 실행되기 때문에 호출됩니다. 즉, 트랜잭션이 종료되면 브라우저와 서버 간의 연결도 끊어집니다.

프로토콜을 만드는 것은 stateless원래 디자인에서 HTTP 가 비교적 간단 하다는 것입니다 file transfer protocol.

  1. URL로 이름이 지정된 파일을 요청하고
  2. 응답으로 파일을 가져옵니다.
  3. 분리하십시오.

동일한 클라이언트에서도 연결간에 관계가 유지되지 않았습니다. 이는 클라이언트와 서버 간의 계약을 단순화하고 많은 경우 전송해야하는 데이터의 양을 최소화합니다.


3

프로토콜 HTTP가 State full protocol로 제공되면 브라우저 창은 단일 연결을 사용하여 웹 응용 프로그램에 대한 여러 요청에 대해 웹 서버와 통신합니다. 이는 브라우저 창에서 브라우저 창과 웹 서버 간의 연결을 오랫동안 유지하고 유지할 수있는 기회를 제공합니다 클라이언트의 대부분의 연결이 유휴 상태 인 경우에도 웹 서버의 최대 연결에 도달하는 상황이 발생할 수 있습니다.


1
HTTP는 이미 연결 유지 상태이므로 서버는 연결을 닫지 않으며 클라이언트는 동일한 연결에서 많은 요청을 할 수 있습니다.
Jose Nobile

3

HTTP는 비 연결형이며 이는 HTTP가 상태 비 저장 프로토콜이라는 직접적인 결과입니다. 서버와 클라이언트는 현재 요청 중에 만 서로를 알고 있습니다. 나중에 둘 다 서로를 잊어 버립니다. 이 프로토콜의 특성으로 인해 클라이언트와 브라우저는 웹 페이지에서 다른 요청간에 정보를 보유 할 수 없습니다.


1

무국적이란?

요청이 이루어지고 응답이 클라이언트로 다시 렌더링되면 연결이 끊어 지거나 종료됩니다. 서버는 요청자에 대한 모든 것을 잊어 버릴 것입니다.

왜 무국적?

웹은 상태 비 저장 프로토콜을 선택합니다. 웹의 원래 목표는 문서 (웹 페이지)를 매우 크게 제공하지 못하도록하는 것이기 때문에 천재적인 선택이었습니다. 서버에 매우 기본적인 하드웨어를 사용하는 사람들

오래 실행되는 연결을 유지 관리하는 데 많은 리소스가 소모되었을 것입니다.

웹이 상태 저장 프로토콜을 선택한 경우 방문자의 연결을 유지하기 위해 서버의로드가 증가했을 것입니다.


1

HTTP무국적자입니다. TCP상태가 양호합니다. 더 소위가 없습니다 HTTP connection만, HTTP request하고 HTTP response. 우리는 다른 것을 만들기 위해 유지할 것이 필요하지 않습니다 HTTP request. "keep-alive"인 연결 헤더 TCP는 항상 HTTP연결을 끊고 다시 연결하는 대신 후속 요청 및 응답에 의해 재사용되는 것을 의미합니다 TCP.


0

누군가가 STATELESS 개념으로 매우 불행한 이름을 선택했다고 생각하므로 전체 오해가 발생합니다. 모든 종류의 리소스를 저장하는 것이 아니라 클라이언트와 서버 간의 관계에 관한 것입니다.

고객 : 모든 자료를 제 옆에두고 처리해야 할 모든 중요한 품목의 "목록"을 보내드립니다. 당신의 일을하십시오.

서버 : 알겠습니다. 적절한 응답을 제공하기 위해 중요한 사항을 필터링하는 데 책임을집니다.

이는 서버가 클라이언트의 "슬레이브"이며 각 요청 후에 "마스터"를 잊어야한다는 것을 의미합니다. 실제로 STATELESS는 서버 상태 만 나타냅니다.

https://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm#sec_5_1_3

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.