HTTP
HTTP
Hyperlink
를 포함한 문서인 hypertext
를 전송하기 위한 application layer 프로토콜- 클라이언트 - 서버 모델에서 요청-응답 프로토콜로서 사용됨
- 클라이언트가
HTTP 요청 메시지
를 서버에 제출하면, 서버는 HTTP 응답 메시지
를 클라이언트에 반환 - Well known port인 80번 포트를 이용함
- 여러 요청이 지속되는 동안 사용자의
상태
를 저장하지 않는 stateless 프로토콜- 사용자 세션을 관리해야 할 때는 http 쿠키 등을 이용
HTTP 버전별 기능
- HTTP/0.9
- 1991년에 발표된 최초의 버전
- GET 방식으로 HTML 문서만 가져올 수 있었음
- 서버가 응답한 후 TCP/IP 연결이 끊김. 즉, 연결이 persistent 하지 않았음
- HTTP/1.0
- 1996년에 완성되고 문서화됨
- 클라이언트가 캐시한 리소스를 사용하기 위해 헤더를 도입
- HTTP/1.1
- 1997년에 1.0을 업그레이드해 발표됨
- 캐시된 리소스를 더 잘 관리하기 위해 새로운 헤더를 추가
- 하나 이상의 요청 및 응답에 TCP 연결을 재사용 가능하도록 하는 keep-alive 매커니즘이 도입됨
- 즉, 여러 리소스 요청에 TCP 연결을 사용 가능한 persistent한 연결을 제공
- TCP 3-way handshake를 다시 할 필요가 없으므로 요청 대기 시간이 비약적으로 줄어듦
- 응답을 받기 전에 요청을 여러 개 보내는 http 파이프라이닝도 추가됨
- 현재는 1.1 이후의 버전만 지원
- HTTP/2
- 2015년에 발표됨
- HTTP 헤더에 텍스트 대신 메타데이터 사용
- 한 개의 TCP/IP 연결만을 이용해 동시에 요청 및 응답을 보내서 persistenct한 연결을 확장
- 이외에도 여러 개선사항을 통해 1.1 버전보다 통신 속도가 훨씬 빨라짐
- HTTP/3
- 2022년에 발표됨
- TCP/IP 연결 대신 QUIC + UDP를 이용해 더욱 개선
HTTP 요청 메시지
- 클라이언트에서 서버로 보내는 메시지. 다음과 같이 구성됨
- 요청 line: request method, 요청을 보내는 URL, HTTP 버전으로 구성
- 요청 헤더: 0개 이상의 필드로 구성
- 요청 메시지 body (선택적)
- Request method 는 리소스(서버)에서 수행할 작업을 나타냄. 다음은 대표적인 메소드 목록
- GET: 리소스가 상태(데이터)를 전송하도록 함
- POST: 리소스에 상태를 처리하도록 함
- PUT: 리소스에 상태를 업데이트 혹은 생성하도혹 함
- DELETE: 리소스가 상태를 삭제하도록 함
HTTP 응답 메시지
- 서버가 클라이언트로 보내는 메시지. 다음과 같이 구성됨
- 상태 line: HTTP 버전, response status code, 이유 구문 (선택적)
- 응답 헤더: 0개 이상의 필드로 구성
- 응답 메시지 body (선택적)
- Response status code는 요청에 따른 서버의 결과를 나타내는 3자리 정수 코드
- 첫 번째 숫자가 대략 어떤 상황인지를 나타내며 정리되며, 다음과 같음
1XX
: 요청이 접수되었으며 프로세스가 계속됨2XX
: 성공을 의미. 요청을 성공적으로 받았고, 실행되었음3XX
: Redirection을 의미. 요청을 완료하기 위해서 추가 조치 필요4XX
: 클라이언트 오류를 의미. 요청이 잘못되어서 수행할 수 없음5XX
: 서버 오류를 의미. 서버에 문제가 생겨 유효한 요청임에도 수행할 수 없음
References
- https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol