HTTP
HyperText Transfer Protocol 인터넷에서 데이터를 주고 받을 수 있는 프로토콜이다.
클라이언트가 요청을 하면 서버에서는 해당 요청에 맞는 결과를 응답하는 형태로 동작한다.
응답 형태는 HTML, JSON, XML 등이 있다.
HTTP는 연결 상태를 유지하지 않는 비연결성 프로토콜이다.
상태코드
- 1XX (조건부 응답) : 요청을 받았으며 작업을 계속한다.
- 2XX (성공) : 클라이언트가 요청한 동작을 성공적으로 처리했음을 가리킨다.
- 3XX (리다이렉션 완료) : 클라이언트는 요청을 마치기 위해 추가 동작을 취해야 한다.
- 4XX (요청 오류) : 클라이언트에 오류가 있음을 나타낸다.
- 5XX (서버 오류) : 서버가 유효한 요청을 수행하지 못했음을 나타낸다.
HTTP version
HTTP 0.9
- http 초기 버전 method는 GET만 존재
- http 헤더도 없고, HTML파일만 전송 가능하다.
HTTP 1.0
- HTTP 헤더 개념이 도입되었다.
- 버전 정보와 요청 method가 함께 전송되기 시작.
- 상태 코드도 응답의 시작 부분에 추가되었다.
- Content-Type 도입으로 HTML 이외의 문서 전송 기능이 가능해졌다.
한계
커넥션 하나당 요청 하나와 응답 하나만 처리 가능했다.
HTTP 1.1
- Persistent Connection : 지정한 timeout 동안 커넥션을 닫지 않는 방법을 통해 커넥션의 사용성이 높아졌다.
- Pipelining : 앞 요청의 응답을 기다리지 않고 순차적인 여러 요청을 연속적으로 보내고 그 순서에 맞춰 응답을 받는 방식
한계
- Head of Line Blocking(HOL) : 앞 요청의 응답이 너무 오래 걸리면 뒤 요청은 Blocking 되어버림
- Header 구조의 중복 : 연속된 요청의 헤더의 많은 중복이 발생
HTTP 2.0
- Binary Framing 계층 추가
- 보내는 메시지를 프레임(frame)이라는 단위로 분할하며 추가적으로 바이너리로 인코딩을 한다. 바이너리 형식 사용으로 파싱속도 및 전송 속도가 빠르고 오류 발생 가능성이 낮아졌다.
- Multiplexed Streams : 한 커넥션으로 동시에 여러 개 메시지를 주고 받을 수 있으며, 응답은 요청의 순서에 상관없이 stream으로 주고 받아 HOL이 자연스럽게 해결된다.
- Stream Prioritization : 리소스간 우선순위를 설정해 클라이언트가 먼저 필요한 리소스부터 보내준다.
- Server Push : 서버는 클라이언트의 요청에 대해 요청하지 않았지만 추가적으로 필요한 리소스를 보내줄 수 있다.
- Header Compression : Header table과 Huffman Encoding 기법을 이용해 압축했다. 이전 header의 내용과 중복되는 필드를 재전송하지 않아 오버헤드를 감소.
한계
- 서로 다른 stream이 전송되고 있을 때, 하나의 stream에서 유실이 발생되거나 문제가 생기면 다른 stream도 문제가 해결될 때까지 지연되는 현상이 발생.
* 이미지 출처 : https://hirlawldo.tistory.com/106
HTTP 3.0
- QUIC : 구글에서 개발한 UDP 기반의 전송 프로토콜(Quick UDP Internet Connections)
- TCP의 구조적 문제로 성능 향상이 어렵다고 판단해 UDP 기반을 선택
- 3way handshake 과정을 최적화 하는 것에 초점을 두고 개발됨
HTTP method 멱등성
동일한 요청을 한번 보내는 것과, 여러번 보내는 것이 서로 동일한 효과를 지니고, 서버의 상태도 동일.
- 안전한 메소드 [GET] : 서버의 상태를 변경시키지 않는 HTTP 메소드
- 멱등한 메소드 [PUT, DELETE]
- 멱등하지 않은 메소드 [POST]