상태 저장과 상태 비 저장의 차이점은 무엇입니까?


86

MVC에 관한 서적과 문서는 Stateful 및 Stateless 용어를 사용하는 것입니다. 솔직히 말해서, 나는 그 책에 대해 이야기하는 아이디어를 얻을 수 없습니다. 그들은 HTTP가 stateless이고 ASP.NET MVC와 함께 Microsoft가 그것과 함께 가고 있다고 말하는 것보다는 어느 한 상태를 이해하는 예제를 제공하지 않습니다. 스테이트 풀이 무엇이며 스테이트 풀이 동일한 이유와 스테이트리스가없는 이유를 이해할 수 없기 때문에 몇 가지 기본 지식이 누락되었습니다.

버튼이나 텍스트 상자와 같은 컨트롤에 대한 간단하고 짧은 예는 내가 이해하는 것을 단순화 할 수 있습니다.

답변:


40

Stateless는 HTTP가 상태에 대한 지원을 기본적으로 제공하지 않음을 의미합니다. 예를 들어, 사용자가 로그인했거나 다른 작업을 수행 한 경우 저장할 수 없습니다.

가장 일반적인 해결책은 세션을 사용하여 해당 문제를 극복하는 것입니다. 즉, 각 응답 또는 요청에 세션 식별자를 포함 할 수 있어야합니다. 이는 세션 쿠키를 생성하거나 모든 링크에 세션 식별자를 포함시켜 수행됩니다.

WebForms는 MVC가 수동으로 처리하도록 강제하는 동안 ViewState를 사용하여 모든 것을 투명하게 만듭니다.

귀하의 예에서 버튼과 텍스트 상자를 언급했습니다. 상태를 유지하는 가장 쉬운 방법은 전체 페이지 게시를 중지하는 것입니다. MVC는 (jQuery를 통해) ajax에 대한 훌륭한 지원을 받았으며 현재 페이지에서 무언가를 원한다면 ajax를 사용하는 것이 좋습니다.


3
이것은 내가 웹 사이트에 로그인하면 방문하는 모든 페이지가 세션 식별자 또는 세션 쿠키를 통해 콘텐츠를 렌더링하기 전에 인증을 다시 확인한다는 것을 의미합니다 ??
Pankaj Upadhyay

3
네 맞습니다.
jgauffin

무국적 상태가 나아지나요?
Lucas-더 나은 코딩 아카데미

1
@ think123 : 상태를 관리 할 필요가 없으므로 성능이 더 뛰어납니다 (예 :로드 밸런싱 등이 훨씬 쉽습니다). 인공 상태를 관리해야하므로 훨씬 더 복잡합니다.
jgauffin

5
@ jgauffin : 퍼포먼스는 잘못된 단어입니다. 상태 를 캐시 할 기회가없고 반복적으로 찾아야하기 때문에 상태 비 저장은 성능 이 떨어 집니다. 무엇인가하는 것은 더 확장 ; 이것이 바로로드 밸런싱이 시작되는 곳이며 확장 성으로 인한 이익은 시스템이 충분히 커지면 성능 손실을 상쇄 할 수 있습니다.
메이슨 휠러

108

상태 비 저장-프로그램에서 유지 관리하는 메모리 (상태)가 없습니다

상태 저장-프로그램에 메모리가 있습니다 (상태)

상태 개념을 설명하기 위해 상태 저장 기능 과 상태 비 저장 기능을 정의하겠습니다.

무국적

//The state is derived by what is passed into the function

function int addOne(int number)
{
    return number + 1;
}

상태 저장

//The state is maintained by the function

private int _number = 0; //initially zero 

function int addOne()
{
    _number++;
    return _number;
}

다른 사람들이 말했듯이 http는 본질적으로 무국적입니다. 따라서 상태는 응용 프로그램에 내장되어야합니다.

클라이언트 브라우저가 서버 프로세스와 통신하는 웹을 통한 요청을 상상해보십시오. 상태 비 저장 http 프로토콜을 통해 상태를 유지하기 위해 브라우저는 일반적으로 각 요청마다 서버에 세션 식별자를 보냅니다. 각 요청에 대해 서버는 "아,이 사람"과 같습니다. 그런 다음이 세션 ID를 기반으로 서버 측 메모리 또는 데이터베이스에서 상태 정보를 조회 할 수 있습니다.

순수한 상태 비 저장 환경에서는이 세션 ID가 필요하지 않습니다. 각 요청에는 서버가 처리하는 데 필요한 모든 정보가 포함됩니다. 그러나 많은 응용 프로그램은 특정 콘텐츠를 보거나 사용자의 활동을 추적하기 위해 세션의 인증 여부를 추적하기 위해 상태를 유지해야합니다. 각 요청에 대해 유선으로 사용자 자격 증명을 보내지 않을 것입니다.


빠른 질문 : 따라서 다른 사용자가 세션 ID를 사용하면 (즉, 도난 당했을 경우), 서버는 이것이 다른 사람인지 모를 것입니다?
mihai

4
맞습니다. https 또는 httponly 쿠키 사용과 같은 사용자의 신원을 보호하는 방법이 있습니다. 그러나 사용자의 컴퓨터가 손상되면 공격자는 서버가 자신을 사용자라고 생각하도록 속일 수 있습니다.
코더

2
명확하고 선명한 코드 예는 +1입니다. 가장 복잡한 IT 용어는 상황에 대해서만 이해 될 수 있다고 확신합니다.
Sebastian

세션 ID를 도난 당했을 가능성이 있으므로 CMS와 같은 응용 프로그램이나 OAuth와 같은 응용 프로그램을 사용하여 훨씬 더 어렵게 만들 수 있습니다.
Elin

4
각 요청에 대해 서버는 "아,이 녀석"과 같이 될 것 입니다. 다른 모든 예에서 내가 보았던 모든 것
Rafael Eyng

69

stateless는 과거의 기억이 없다는 것을 의미합니다. 모든 트랜잭션은 마치 처음 수행 된 것처럼 수행됩니다.

statefull은 과거의 기억이 있음을 의미합니다. 이전 거래는 기억되며 현재 거래에 영향을 줄 수 있습니다.


9
답변이 수여되었습니다. 여기서 가장 명확하고 정확한 답변입니다.
Mawg

3
간단하고 정확합니다.
Ivan Ivković

2
차이를 이미 알고있는 사람에게는 정확합니다.
Rafael Eyng

3

간단히 말해서 ASP.NET (상태 저장)과 ASP.NET-MVC (상태 비 저장)의 차이점은 첫 번째는 서버 쪽 컨트롤을 제공하고 다른 것은 그렇지 않다는 사실과 격리 될 수 있습니다.

ASP.NET 웹 양식 접근 방식은 이벤트 모델 중심 모델에서 사용되는 이전 VB 및 VC ++ 프로그래머를 전환하는 데 적합하므로 클릭과 동일한 이벤트 모델 패러다임에 따라 웹 프로그래밍을 빠르게 학습 할 수 있습니다. 이벤트를 시작하는 버튼과 짜잔! 이제 이벤트 핸들러에서 코드를 작성하기 만하면됩니다. 이 때문에 ASP.NET은 서버 상태를 모니터링하기 위해 뷰 상태 및 포스트 백과 같은 개념을 각 왕복마다 제어해야했습니다.

그러나 ASP.NET-MVC는 서버 쪽 컨트롤을 사용하지 않으므로 상태를 유지할 필요가 없습니다. MVC 모델은 문제 도메인을 3 개의 파티션으로 분리하여 데이터가 간소화 된 방식으로 클라이언트에 전달되도록합니다.

요약하면 서버 측 컨트롤은 상태 저장 및 상태 비 저장과 다른 점에서 다릅니다.


1

@coder 정확한 답변에 추가.

국가의 아이디어는 이전 데이터 를 기억 하는 것 입니다.
예를 들어, 값이 "A, B, C"이고 "A"가 선택된 서버의 목록 제어가 있습니다. 목록은 클라이언트 브라우저로 이동합니다. "B"를 선택하십시오. 그리고 서버에 다시 게시하십시오. 값이 변경되었음을 어떻게 알 수 있습니까?

  • ASP.NET
    Microsoft는 ASP.NET 에서 ViewState 라는 용어를 사용합니다 . 개발자들 사이에 큰 오해가 있습니다.
    ViewState는 목록의 모든 초기 상태를 <input type="hidden" value="base64 encoded" />"A, B, C"값으로 표시하고 "A가 선택됨"으로 표시합니다.
    그런 다음 포스트 백 브라우저로 ViewState를 전송하고 "B가 선택되었습니다"를 서버에 보냅니다. ASP.NET은 목록의 초기 상태를 복원하고 새로운 "B"선택을 적용합니다. 이것은 WinForms 개발자를 유혹하기 위해 수행되었습니다 (@Ronald가 언급 함). 웹 서버에서 목록 변경 사항을 구독 할 수 있습니다 listObject.Changed += OnChanged.

  • ASP.NET MVC
    ViewState의 문제는 크기입니다. 몇 년 동안 .NET 개발자는 모든 왕복에 대해 20 개의 컨트롤 상태와 같은 킬로바이트의 쓸모없는 정보를 전송해야했습니다.
    새로운 접근 방식은 새롭고 작은 "B"값만 전송하는 것입니다.
    또는 "A"에서 "B"로의 변경을 추적하려면 직접 변경하십시오. 자바 스크립트를 사용하여 "Was A, Now B"를 보냅니다. 또는 SQL Server에서 ID로 상태를 저장하고 검색하십시오.

  • ASP.NET MVCASP.NET 은 인증 및 캐싱 상태를 구현합니다. 따라서 ASP.NET MVC가 완전히 stateless라고 말하는 것은 올바르지 않습니다.
  • 답변에 언급 된 메모리 는 컴퓨터 메모리가 아니라 "기억"을 의미합니다. 파일 시스템, SQL 서버 또는 컴퓨터 메모리에 데이터를 저장하여 상태를 구현할 수 있습니다.

빼기 전에 건설적이고 오류를 설명하십시오
Artru

0

상태 저장 작업은 시스템의 일부 상태를 수정하거나 필요로하지만 상태 비 저장 작업은 그렇지 않습니다.

상태 저장 텍스트 상자의 예는 StackExchange에서 이전에 편집 된 주석입니다. 텍스트 상자는 이전 주석을 표시하고 입력을 승인하고 처리하기 위해 관련된 스레드를 알아야합니다.

mailto : 태그가 포함 된 일반적인 전자 메일 주석 양식은 상태 비 저장 텍스트 상자가됩니다. 입력 내용을 받아 들여 정보를 유지하지 않고 워크 스테이션의 메일 응용 프로그램에 입력합니다.


일반적인 "이메일 주소와 메시지를 남겨두면 연락 드리겠습니다"양식도 무국적자입니다. 양식을 제출하면 서버는 어디에서 왔는지 상관하지 않으며 데이터를 일부 고객 서비스 할 일 목록에 복사하고 잊어 버립니다.
StarWeaver
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.