🌎 클라이언트 서버 구조
클라이언트 요청-> 서버
서버 응답-> 클라이언트
- 서버와 클라이언트를 분리하는게 중요
- 비즈니스 로직,데이터(서버)
- UI(클라이언트)
- 각각 독립적으로 진화
🌎 무상태 프로토콜(Stateless)
- 서버가 클라이언트의 상태를 보존X
- 장점: 서버 확장성 높음
- 단점: 클라이언트가 추가 데이터 전송
![](https://velog.velcdn.com/images/ehddbs4521/post/028e0686-cd3f-4409-a635-f86590ca1eeb/image.png)
![](https://velog.velcdn.com/images/ehddbs4521/post/6a5a9862-3de6-4772-95a7-1929bffa4b99/image.png)
![](https://velog.velcdn.com/images/ehddbs4521/post/39ac268b-b67a-4669-8940-c6ce4cd4ad9f/image.png)
![](https://velog.velcdn.com/images/ehddbs4521/post/2481748f-0711-4a43-828d-c06810802f50/image.png)
![](https://velog.velcdn.com/images/ehddbs4521/post/545e6505-41f0-4b7a-a31f-b8a22b61f830/image.png)
- 상태 유지: 중간에 다른 점원으로 바뀌면 안된다.
(중간에 다른 점원으로 바뀔 때 상태 정보를 다른 점원에게 미리 알려줘야 한다.)
- 무상태: 중간에 다른 점원으로 바뀌어도 된다.(갑자기 고객이 증가해도 점원을 대거 투입할 수 있다. 갑자기 클라이언트 요청이 증가해도 서버를 대거 투입할 수 있다.)
- 무상태는 응답 서버를 쉽게 바꿀 수 있다.(무한한 서버 증설 가능)
Stateful
- 클라이언트A가 서버1에 요청을하면 서버1은 상태를 보관하고 응답을한다. 이때 서버가 중간에 장애가 나면 재시작을 해야한다.
Stateless
- 클라이언트A가 서버1에 요청을하면 서버1은 상태를 보관하지 않는다. 이때 서버가 중간에 장애가 나면 중계서버거 다른 서버에 요청을 해 서버2가 응답을 보낸다.
Stateless 한계
- 모든 것을 무상태로 설계 할 수 있는 경우도 있고 없는 경우도 있다.
- 무상태 ex) 로그인이 필요없는 단순한 서비스 소개 화면
- 상태 유지 ex) 로그인
- 로그인한 사용자의 경우 로그인 했다는 상태를 서버에 유지
- 일반적으로 브라우저 쿠키와 서버 세션등을 사용해서 상태 유지
- 상태 유지는 최소한만 사용
머리를 쥐어짜서라도 무상태로 만들어야 함
🌎 비연결성
연결 유지
- 다른 클라이언트들과 연결할때 연결했던 클라이언트들과의 연결을 유지하며 서버의 자원을 소모
연결 유지 X
HTTP는 기본적으로 연결을 유지하지 않는다.
- 빠른 속도로 응답
- 서버자원 효율
- 단점: TCP/IP를 새로 연결하여 3 way- handshake 시간이 증가
![](https://velog.velcdn.com/images/ehddbs4521/post/c132c27d-3af7-4e2c-a5f2-5eafb202d55a/image.png)
![](https://velog.velcdn.com/images/ehddbs4521/post/7c23bdc0-0707-49ad-9fb1-68c48729a357/image.png)
🌎 HTTP 메시지
HTTP 메시지에 모든것을 전송한다.
![](https://velog.velcdn.com/images/ehddbs4521/post/02c83977-61cc-4070-88be-6b011935ac8d/image.png)
시작라인(요청 메시지)
- start-line = request-line / status-line
- request-line = method SP(공백) request-target SP HTTP-version CRLF(엔터)
- method종류: GET,POST,PUT,DELETE(서버가 수행해야 할 동작)
- 절대경로로 요청 대상을 지정
- HTTP Version
시작라인(응답 메시지)
- HTTP 상태 코드(요청 성공,실패를 나타냄)
- 200: 성공
- 400: 클라이언트 요청 오류
- 500: 서버 내부 오류
헤더
- header-field = field-name ":" OWS(띄어쓰기 허용) field-value OWS
![](https://velog.velcdn.com/images/ehddbs4521/post/c7afc59a-a347-4438-8bfc-05cb376b91bb/image.png)
- HTTP 전송에 필요한 모든 부가정보
- 예) 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보,서버 애플리케이션 정보, 캐시 관리 정보 등등
바디
![](https://velog.velcdn.com/images/ehddbs4521/post/ec3da290-4377-4967-b4b3-3ca640249ea5/image.png)
단순함 확장 가능
*참고: 사진은 김영한님의 강의자료를 참고하였습니다
좋은 글 감사합니다.