무상태 프로토콜 [Stateless]
무상태 프로토콜이란 서버가 클라이언트 상태를 보존하지 않는 것이다.
서버가 클라이언트 상태를 보존한다면 클라이언트가 접속 후 동작했던 내용을 서버가 기억하고 있어 이전에 동작했던 내용을 다시 서버에 전송할 필요 없이 다음 내용을 수행하면 된다.
하지만 서버가 클라이언트 상태를 보존하지 않는다면 클라이언트가 접속 후 동작했던 내용을 서버가 기억하지 않아 다음 내용을 수행하기 위해선 이전의 동작했던 내용을 같이 보내줘야 한다는 소리다.
그렇게 되면 클라이언트에서는 서버로 보내야하는 데이터의 양이 많아지게 된다.
만약 서버에서 장애가 발생한다면
서버가 상태를 보존할 경우 장애 발생시 데이터 보장이 어렵다.
서버가 상태를 보존하지 않는다면 어차피 클라이언트에서 필요한 정보를 모두 보내기 때문에 장애 발생 시 응답 서버를 다른 서버로 교체할 수 있다. 이로 인해 수평적 확장이 가능하다.
그렇지만 로그인과 같이 유저 정보를 보존해야 하는 경우 상태 유지 방식의 stateful로 설계를 해야 한다.
상태 유지를 위해선 주로 브라우저 쿠키와 세션을 사용한다.
세션은 서버 측에서 클라이언트의 상태 정보를 저장하고 쿠키는 클라이언트 측에서 상태 정보를 저장하고 요청 시 서버로 전송한다.
단순한 정보나 서비스 소개 화면은 무상태로 설계하고 꼭 필요한 경우 최소한으로 stateful 설계를 해야 한다.
- Stateful:
- 장점: 클라이언트는 이전 동작 내용을 다시 전송할 필요가 없어 효율적
- 단점: 서버 장애 시 데이터 보장이 어렵고, 확장성이 제한됨
- Stateless:
- 장점: 서버 장애 시 다른 서버로 쉽게 대체 가능하며, 수평적 확장이 용이.
- 단점: 클라이언트가 매 요청마다 필요한 모든 정보를 전송해야 해서 데이터량이 증가
HTTP 구조
구조 |
start-line : 시작라인 |
header : 헤더 |
empty line 공백 라인 CRLF |
message body |
1. start-line = request-line / status-line (시작라인)
시작라인은 요청 메시지(request-line)와 응답 메시지(status-line)로 나눠진다.
1.1 요청 메시지(request-line)
request-line = method SP request-target SP HTTP -version CRLF (SP : 공백, CRLF : 줄 바꿈)
예: GET /index.html HTTP/1.1
요청 메시지라인은 HTTP 메서드, 요청 대상, HTTP 버전으로 이루어진다.
HTTP 메서드 : 서버가 수행할 동작 GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS 등
요청 대상 : 경로, 주로 절대 경로 사용
HTTP 버전 : HTTP 버전
1.2 응답 메시지(status-line)
status-line = HTTP-version SP status-code SP reason-phrase CRLF
예: HTTP/1.1 200 OK
응답 메시지 라인은 HTTP 버전, 상태 코드, 이유 문구로 이루어진다.
HTTP 버전 : HTTP 버전
HTTP 상태 코드 : 요청 성공, 실패를 나타냄
이유 문구 : 사람이 이해할 수 있는 짧은 문구
주요 상태 코드 그룹:
- 1xx: 정보 제공
- 2xx: 성공 (예: 200 OK)
- 3xx: 리다이렉션
- 4xx: 클라이언트 오류 (예: 404 Not Found)
- 5xx: 서버 오류 (예: 500 Internal Server Error)
2. header (헤더)
header-field = field-name ":" OWS field-value OWS (OWS : 띄어쓰기 허용)
예시: Content-Type: text/html User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
헤더는 헤더필드의 이름과 필드 값으로 이루어진다.
헤더 내에는 HTTP 전송에 필요한 모든 부가정보가 들어있다.
3. empty line (공백라인)
헤더 구조에는 필수로 공백라인 한 줄이 포함되어 있다.
4. message body (메시지 바디)
실제 전송할 데이터가 들어있는 곳이다.
HTML 문서, 이미지, 영상, JSON 등 byte로 표현할 수 있는 모든 정보가 포함된다.
GET 요청과 같은 일부 요청에선 body가 없을 수 도 있다.
'백엔드 > HTTP' 카테고리의 다른 글
[HTTP] 동시 요청 멀티쓰레드 (1) | 2024.07.18 |
---|---|
[HTTP] 헤더 (0) | 2024.07.17 |
[HTTP] 메서드 (0) | 2024.07.15 |
[HTTP] 인터넷 네트워크 (0) | 2024.07.13 |