정의
HTTP는 HyperText Transfer Protocol의 약어이다. 공식문서에서 정의된 내용은 HTML과 같은 하이퍼미디어 문서를 전송하기 위한 애플리케이션 레이어 프로토콜이라고 되어있다. 어려운 네트워크 용어를 빼고 해석하자면 클라이언트와 서버가 서로 통신하는 방법을 표준화해둔 것이다. 즉 데이터가 인터넷을 통해 요청되고 전송되는 방식을 정의한다.
초기에는 웹 브라우저와 웹 서버 간의 커뮤니케이션을 위해 디자인되었지만 최근에는 모바일 애플리케이션 및 IoT 등과의 커뮤니케이션과 같이 다목적으로 사용되고 있다. HTTP는 메세지를 캡슐화해 읽기 쉽고 간단하게 설계되었으며 HTTP 헤더를 사용하면 프로토콜을 쉽게 확장할 수 있다.
클라이언트-서버 모델을 따르며, 무상태 프로토콜이라는 두 가지 특징을 갖는다.
클라이언트-서버 모델
HTTP 통신은 항상 요청-응답의 형태를 취하고 있다. 웹을 예로 들면, 클라이언트가 URI를 통해 서버에 요청(Request)하면 서버는 해당 요청에 대한 결과를 응답(Response)하는 형태로 동작한다. 클라이언트와 서버 사이에 데이터가 교환되는 방식은 다음과 같다.
1. Request
클라이언트가 서버에게 보내는 메세지이다.
GET / HTTP/1.1
Host: developer.mozilla.org
Accept-Language: fr
(1) start line
첫 번째 줄에 해당한다.
- GET은 HTTP 메서드로 주로 GET, POST, DELETE 등이 쓰인다.
- '/' 은 Path이며 해당 요청이 도착하는 지점을 의미한다.
- HTTP/1.1은 HTTP의 버전으로, 가장 많이 사용되고 있는 버전은 1.1이다.
- HTTP 메서드
GET : 존재하는 자원에 대한 요청
POST : 새로운 자원을 생성
PUT : 존재하는 자원에 대한 변경
DELETE : 존재하는 자원에 대한 삭제
(2) headers
두 번째 줄부터는 헤더인데, header는 key와 value로 자바스크립트 객체의 형태와 같다. Host 에는 요청을 보내는 웹브라우저의 기본 주소가 담기고 그 외 클라이언트에 대한 정보, body타입의 정보, body에 담기는 데이터의 길이 등을 담아서 보낸다.
(3) body
HTTP 통신 구조의 마지막에 위치하며 모든 요청에 body가 필요한 것은 아니다. 주로 POST나 PUT과 같은 데이터를 업데이트하기 위한 요청에 쓰인다. body의 데이터 타입은 JSON을 가장 많이 사용한다.
// POST 메소드로 글을 작성할 경우
body: {
"id" : 1
"user" : "poylib",
"content" : "포스팅중",
}
2. Response
서버가 클라이언트에 보내주는 메시지이다.
HTTP/1.1 200 OK
Date: Sat, 09 Oct 2010 14:28:02 GMT
Server: Apache
Last-Modified: Tue, 01 Dec 2009 20:18:22 GMT
ETag: "51142bc1-7449-479b075b2891b"
Accept-Ranges: bytes
Content-Length: 29769
Content-Type: text/html
<!DOCTYPE html... (here comes the 29769 bytes of the requested web page)
(1) status
첫 번째 줄에 해당한다.
- 현재 프로토콜의 버전(HTTP/1.1)
- HTTP상태 코드(200)
- 상태 메시지(OK)
상태 코드는 100단위로 1xx : 정보 응답, 2xx : 성공, 3xx : 리디렉션, 4xx : 클라이언트 오류, 5xx : 서버 오류를 뜻한다.
각 번호별 상세 상태코드는 https://developer.mozilla.org/en-US/docs/Web/HTTP/Status 여기서 확인 가능하다.
(2) headers
요청의 헤더와 동일하다. 응답의 추가 정보를 담고 있는 부분
(3) body
요청의 body와 동일하며 요청한 내용의 본문은 HTTP 메시지 구조의 마지막에 위치한다. 요청의 body가 항상 존재하지 않듯이 응답도 데이터를 전송할 필요가 없는 경우엔 body가 없을 수도 있다.
무상태 프로토콜
서버가 클라이언트의 상태를 보존하지 않는다는 것이다. 즉 각각의 HTTP 통신은 독립적이기 때문에 이전에 했던 통신(요청/응답)에 대한 내용을 전혀 알지 못한다. 이는 매 통신마다 필요한 모든 정보를 담아서 요청 보내야 한다는 뜻이다. 예를 들어 쇼핑몰에서 장바구니에 물건을 담겠다는 통신을 할 때, 하나 담을 때마다 회원정보를 물어봐야 하는 것이다.
무상태(stateless)의 특징은 다음과 같다.
- 클라이언트가 데이터를 요청할 때 필요한 데이터를 매번 모두 담아서 보내기 때문에 아무 서버에서나 호출해도 된다. 이는 서버 A에 장애가 생겼을 때 작동 중인 아무 서버와 응답을 주고받을 수 있다는 이점도 있다.
- 서버를 쉽게 바꿀 수 있기 때문에 수평 확장에 유리하다.
- 매번 필요한 데이터를 모두 보내야 하므로 송신할 데이터의 양이 많아진다는 단점이 있다.
앞서 예시로 든 장바구니처럼 여러 번의 통신을 주고받으며 연속된 데이터의 처리가 필요한 경우 토큰, 쿠키, 세션, 로컬 스토리지 같은 기술을 이용해 정보를 유지할 수 있다. 즉, 장바구니에 상품을 담을 때마다 회원정보를 알려주지 않고 이용할 수 있다.
출처)
https://joshua1988.github.io/web-development/http-part1/
https://developer.mozilla.org/ko/docs/Web/HTTP/Overview
https://surprisecomputer.tistory.com/54
https://hanamon.kr/%eb%84%a4%ed%8a%b8%ec%9b%8c%ed%81%ac-http-http%eb%9e%80-%ed%8a%b9%ec%a7%95-%eb%ac%b4%ec%83%81%ed%83%9c-%eb%b9%84%ec%97%b0%ea%b2%b0%ec%84%b1/
https://wooono.tistory.com/366
https://velog.io/@jiseung/02-what-is-http