BE/HTTP
[HTTP] 3. HTTP 기본
m5n
2024. 10. 13. 13:12
모든 것이 HTTP
- HTTP (Hyper Text Transfer Protocol)
- HTTP 메세지에 모든 것을 전송
- IMAGE, 음성, 영상, 파일, JSON, XML ...
- 거의 모든 형태의 데이터 전송 가능
- 기반 프로토콜
- TCP: HTTP/1.1, HTTP/2
- TCP 위에서 동작
- 3 way handshake 해줘야하고, 이것저것 많이 들어가 있어서 속도가 빠른 프로토콜은 아님
- UDP: HTTP/3
- UDP 기반으로 만들어졌음
- TCP 위에서 동작
- TCP: HTTP/1.1, HTTP/2
- HTTP 특징
- 클라이언트 서버 구조
- 무상태 프로토콜 (stateless), 비연결성
- HTTP 메시지 (보낼 때도 받을 때도 HTTP 메시지를 통해서 통신을 함)
- 단순함, 확장 가능
클라이언트 서버 구조
- Request Response 구조
- 클라이언트는 서버에 요청을 보내고, 응답을 대기 (무작정 대기)
- 서버가 요청에 대한 결과를 만들어서 응답
클라이언트, 서버 구조로 나누면 양쪽이 독립적으로 진화를 할 수 있음
클라이언트 쪽은 UI, UX에 집중하면 되고
서버에서는 복잡한 비즈니스 로직을 처리하면 됨
무상태 프로토콜 (Stateless)
- 서버가 클라이언트의 상태를 보존 X
- 장점: 서버 확장성이 높음 (스케일 아웃에 유리)
- 단점: 클라이언트가 추가 데이터 전송을 해야함 (서버가 상태를 저장하지 않으므로 클라이언트가 요청하는 모든 것을 데이터에 담아서 보내야함)
상태유지 (Stateful)을 사용한다면 클라이언트와 서버가 연결되었을 경우 계속해서 같은 서버에 유지 되지 않으면 처음부터 다시 연결을 해야하지만,
무상태 (Stateless)를 사용한다면 서버1이 장애가 나면 그냥 서버2로 다시 연결만 시켜준다면 클라이언트의 요청을 처리해줄 수 있음
- Stateless의 실무 한계
- 모든 것을 무상태로 설계 할 수 있는 경우도 있고 없는 경우도 있음
- 만약, 로그인의 경우 로그인한 사용자의 상태를 서버에 유지해야함
- 일반적으로 브라우저 쿠키와 서버 세션 등을 사용해서 상태 유지
- 상태 유지는 꼭 필요한 경우에만 어쩔 수 없이 사용
- 일반적으로 브라우저 쿠키와 서버 세션 등을 사용해서 상태 유지
비연결성
- 연결을 유지하는 서버의 경우
- 계속해서 클라이언트와 연결되어 있어야 하므로 서버의 자원이 소모됨
- 연결을 유지하지 않는 서버의 경우
- 요청할 때만 연결해서 응답하고 끊어버리기 때문에 최소한의 자원으로 서버유지 가능
- HTTP는 기본이 연결을 유지하지 않는 모델
- 일반적으로 초 단위의 이하의 빠른 속도로 응답
- 수천명이 서비스를 사용하고 있더라도 실제 서버에서 동시에 처리하는 요청은 수십개 이하 (사용하는 사람들이 동시에 버튼을 누르는 경우가 거의 없기 떄문)
- 서버 자원을 매우 효율적으로 사용 가능
- 한계와 극복
- 기존 비연결성의 한계
- 연결할 때마다 TCP/IP 연결을 새로 맺어야함 (3 way handshake 시간 추가)
- 웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 js, css, 이미지 등 수 많은 자원이 함께 다운로드 됨
- 연결할 때마다 TCP/IP 연결을 새로 맺어야함 (3 way handshake 시간 추가)
- 극복
- HTTP Persistent Connections (지속 연결)로 문제 해결
- 몇 초 동안 연결을 유지하면서 필요한 데이터를 다 전송 받고 연결 종료
- 기존 비연결성의 한계
HTTP 메시지
- 시작 라인 (요청 메시지)
- HTTP 메서드
- 서버가 수행해야 할 동작 지정
- GET, POST, PUT, DELETE ...
- 요청 대상
- 절대경로[?쿼리])
- HTTP 버전
- HTTP/1.1
- HTTP 메서드
- 시작 라인 (응답 메시지)
- HTTP-version SP status-code SP reason-phrase CRLF
- HTTP 버전, 상태코드(200, 400, 500), 이유 문구
- HTTP 헤더
- HTTP 전송에 필요한 모든 부가 정보
- 메시지 바디의 내용, 바디의 크기 등 Message Body 빼고 필요한 메타데이터 다 들어있음
- HTTP 전송에 필요한 모든 부가 정보
- HTTP 메시지 바디
- 실제 전송할 데이터
결론적으로,
HTTP는 서버와 클라이언트가 HyperText를 Transfer하기 위한 프로토콜이고
서버와 클라이언트 구조를 가지며, 서버는 stateless 방식으로 작동하고 비연결성으로 동작한다. (stateful하게 동작하면 서버가 계속해서 클라이언트의 정보를 기억하고 있어야하고 장애가 나는 경우나 스케일 아웃이 필요한 경우 대처하기가 어려움) 그래서 최대한 stateless하게 동작하게 만들고 로그인과 같이 어쩔 수 없는 경우에만 stateful하게 동작하게 설계함
김영한 님의
모든 개발자를 위한 HTTP 웹 기본 지식
보고 작성한 내용입니다.
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC