클라이언트 서버 구조
기본적으로 클라이언트는 서버로 Request를 보내면, 서버는 클라이언트의 응답을 받고 Response를 보내는 구조이다.
- Request Response 구조
- 클라이언트는 서버에 요청을 보내고, 응답을 대기
- 서버가 요청에 대한 결과를 만들어서 응답
클라이언트와 서버가 분리되면, 각각이 독립적인 진화가 가능하다.
- 서버에선 핵심 비즈니스로직과 데이터 처리 담당
- 클라이언트측에서는 사용성과 UI등을 담당
이렇게 될 경우, 서버에서는 데이터를 처리하고 핵심 비즈니스 로직 개발에만 집중하여 진화할 수 있고, 클라이언트 측은 사용자의 사용성과 UI에만 집중하여 개발할 수 있는 장점이 있다.
무상태 프로토콜 (Stateless)
- 서버가 클라이언트 상태를 보존하지 않는다.
- 장점 : 서버 확장성이 높다(스케일 아웃)
- 단점 : 클라이언트가 추가 데이터를 전송해야한다.
대표적으로 세션과 쿠키의 차이가 있다.
- 세션에서는 사용자의 상태를 서버에서 관리하게 되어서 Stateful
- 쿠키는 서버는 사용자의 상태를 관리하지 않고 사용자가 쿠키를 가지고 상태를 확인하기 때문에 Stateless
Stateful(세션)의 경우 만약, 사용자가 늘어서 서버를 추가로 늘린다고 했을 때 추가된 서버는 사용자의 세션을 가지고 있지 않기 때문에
만약, 이를 해결하기 위해서는 별도의 설정이 필요하다. (서버 확장성이 낮음)
하지만 서버에서 사용자의 상태를 관리하기 때문에, 클라이언트가 추가 데이터를 전송할 필요가 없다.
Stateless(쿠키)의 경우에는 서버가 추가된다고 하더라도, 클라이언트가 상태를 데이터로 가지고 있기 때문에 서버 확장성이 높다. 반면에 클라이언트가 데이터를 통신할 때마다 추가 데이터를 전송해야하는 단점이 있다.
비연결성
HTTP통신에서는 클라이언트와 서버를 연결성을 가지지 않고, 요청과 응답시에만 연결을 하고 바로 연결을 끊어버린다.
그렇게 함으로써 여러 클라이언트과의 효과적인 통신을 이끌어냄과 함께 최소한의 자원을 사용할 수 있게 된다.
- HTTP는 기본이 연결을 유지하지 않는 모델
- 일반적으로 초 단위의 이하의 빠른 속도로 응답
- 1시간 동안 수천명이 서비스를 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작음
- 예) 웹 브라우저에서 계속 연속해서 검색 버튼을 누르지 않는다.
- 서버 자원을 매우 효율적으로 사용할 수 있음
한계과 극복
- TCP/IP 연결을 새로 맺어야함 - 3 way handshake 시간 추가
- 웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 자바스크립트, css, 추가 이미지 등 수 많은 자원이 함께 업로드
- 현재는 HTTP 지속 연결(Persistent Connections)로 문제 해결
- HTML/ 자바스크립트 /이미지 응답에 대한 모든 것을 받은 후 연결을 종료
- HTTP/2, HTTP/3에서 더 많은 최적화
HTTP 메시지
- HTTP 메시지 구조는
- Start-line 시작라인
- header 헤더
- empty line 공백라인 (CRLF)
- messagebody
로 구성 되어 있다.
예시) HTTP 요청 메시지
GET /search?q=hello&hello&hi=ko HTTP/1.1 //Start-line
Host: www.google.com //header
//empty line
<html> //message body
<body> ... </body>
</html>
예시) HTTP 응답 메시지
HTTP/1.1 200 OK //Start-line
Content-Type: text/html;charset=UTF-8 //header
Content-Length:3423
//empty line
<html> //message body
<body> ... </body>
</html>
시작라인 - Start-line : 요청메시지
GET /search?q=hello&hello&hi=ko HTTP/1.1
- start-line = request-line / status-line
- request-line = method SP(공백) request-target SP HTTP-version CRLF(엔터)
- HTTP 메서드 (GET: 조회)
- 요청 대상 ('/search?q=hello&hi-ko)
- HTTP Version
HTTP 메서드
- 종류 : GET, POST, PUT, DELETE, PATCH
- 서버가 수행해야 할 동작 지정
- GET : 리소스 조회
- POST : 요청 내역 처리
- PUT, PATCH : 리소스 수정
- DELETE : 리소스 삭제
시작라인 - Start-line : 응답메시지
HTTP/1.1 200 OK
- start-line = request-line / status-line
- status-line = HTTP-version SP status-code SP reason-phrase CRLF
- HTTP 버전
- HTTP 상태 코드 : 요청 성공, 실패를 나타냄
- 200 : 성공
- 400 : 클라이언트 요청 오류
- 500 : 서버 내부 오류
- 이유 문구 : 사람이 이해할 수 있는 짧은 상태 코드 설명 글
HTTP 헤더
Host: www.google.com //header
Content-Type: text/html;charset=UTF-8 //header
Content-Length:3423
- header-field = field-name ":" OWS field-value OWS (OWS: 띄어쓰기 허용)
- field-name은 대소문자 구분 없음 하지만 value는 대소문자를 구분함
헤더의 용도
- HTTP 전송에 필요한 모든 부가정보
- 예) 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보, 서버 애플리케이션 정보, 캐시 관리 정보.. 등등
- 표준 헤더는 엄청나게 많다
- 필요시 임의의 헤더 추가 가능
- helloworld: hihi
HTTP 메시지 바디
<html> //message body
<body> ... </body>
</html>
- 실제 전송할 데이터
- HTML 문서, 이미지, 영상, JSON 등등 byte로 표현할 수 있는 모든 데이터 전송가능
'CS > Http' 카테고리의 다른 글
HTTP 메서드의 속성 (0) | 2023.07.17 |
---|---|
HTTP 메서드 (0) | 2023.07.16 |
HTTP 기본 (0) | 2023.07.14 |
URI, URL, URN란 ? (0) | 2023.07.13 |
인터넷 네트워크 정리 (0) | 2023.07.12 |