HTTP(Hyper Transfer Protocol)란? 웹상에서 서로 다른 서버 간 하이퍼텍스트 문서(HTML)을 주고받을 수 있도록 만들어진 통신 규약이다. 이러한 통신 형식을 프로토콜(protocol)이라 하고 가장 널리 사용되는 프로토콜이 HTTP다.
통신 방식
HTTP 요청과 응답
- HTTP는 요청(request)과 응답(response)의 구조로 되어있다.
👉 클라이언트가 HTTP 요청을 서버에 보내면 서버는 요청 처리 후 결과에 따른 HTTP 응답을 클라이언트에게 보냄으로써 하나의 HTTP 통신이 된다.
Stateless
- 상태(state)가 없다는 뜻으로 HTTP 통신에서는 상태라는 개념이 존재하지 않는다.
- 각각의 HTTP 통신은 독립적이며 그 전에 처리된 HTTP 통신에 대해 전혀 알지 못한다.
장점
- 서버 디자인이 간단해지고 효과적이다.
👉 HTTP 통신들의 상태를 서버에서 저장할 필요가 없으므로 다른 HTTP 통신간의 진행 및 연결 상태의 처리나 저장을 구현하고 관리하지 않아도 된다.
✔️ 각각의 HTTP 요청에 대해 독립적인 응답만 보내주면 된다.
단점
- 해당 요청을 처리하기 위해 필요한 모든 데이터를 매번 포함시켜 요청해야 한다.
👉 예를 들어 새로운 요청에 사용자의 로그인 여부를 포함시켜 보내야 한다면 클라이언트가 사용자의 로그인 사실 여부를 기억하고 있어야 되므로 쿠키(cookie)나 세션(session) 등을 사용하여 요청을 처리할 때 필요한 진행 과정이나 데이터를 저장한다.
쿠키
- 웹 브라우저(클라이언트 측)는 쿠키라고 하는 파일을 사용하여 웹사이트에서 보내온 필요한 정보를 저장한다.
세션
요청 구조
Start Line
ex. GET /search HTTP/1.1
HTTP 메소드
- 해당 HTTP 요청이 의도하는 액션을 정의하는 부분이다.
- POST, GET, PATCH, PUT, DELETE, OPTIONS 등 여러 메소드들이 있다.
Request target
- 해당 HTTP 요청이 전송되는 목표 주소를 말한다.
HTTP version
- HTTP 버전에는 1.0, 1.1, 2.0이 있다.
- 버전에 따라 요청 메시지의 구조나 데이터가 다를 수 있으므로 버전을 명시한다.
헤더
ex. HOST : google.com
- HTTP 요청 그 자체에 대한 정보를 담고 있다.
👉 ex.
요청 메시지의 전체 크기(Content-length)
- 파이썬의 딕셔너리처럼 Key:Value로 되어 있다.
Host
- 요청이 전송되는 target 호스트의 URL 주소를 알려주는 헤더.
User-Agent
- 요청을 보내는 클라이언트에 대한 정보로 예를 들면 웹 브라우저에 대한 정보.
Accept
- 해당 요청이 받을 수 있는 응답 body 데이터 타입을 알려주는 헤더.
- MIME(Multipurpose Internet Mail Extensions) type이 value로 지정된다. 참고👀
👉 JSON 데이터 타입을 요청하는 경우 application/json MIME type을 value로 정해 주고 모든 데이터 타입을 허용하는 경우 */*
로 지정해주면 된다.
Connection
- 해당 요청이 끝난 후 클라이언트와 서버가 네트워크 연결을 유지할 것인지에 대해 알려 주는 헤더.
👉 HTTP 통신에서 서버 간 네트워크 연결 과정이 다른 작업에 비해 시간이 걸리므로 요청이 계속되는 한 처음 만든 연결을 재사용하는 것이 선호된다.
- connection 헤더의 값이
keep-alive
이면 유지, close
이면 닫아도 된다는 뜻이다.
Content-Type
- HTTP 요청이 보내는 메시지 body의 타입을 알려주는 헤더.
- Accept 헤더와 마찬가지로 MIME type이 사용된다.
Content-Length
- HTTP 요청이 보내는 메시지 body의 총 사이즈를 알려 주는 헤더.
Body
- HTTP 요청이 전송하는 데이터를 담고 있는 부분으로 전송하는 데이터가 없다면 비어 있게 된다.
응답 구조
Status Line
ex. HTTP/1.1 404 Not Found
- 응답 메시지의 상태를 요약하여 알려 주는 부분이다.
HTTP version
- start line과 마찬가지로 사용되고 있는 버전을 나타낸다.
Status code
- 응답 상태를 미리 지정되어 있는 숫자로 된 코드로 나타낸다.
status text
- 응답 상태를 간략하게 글로 설명해 주는 부분이다.
헤더
- HTTP 요청의 헤더 부분과 동일하지만 응답에서만 사용되는 헤더 값들이 있다.
👉 ex.
User-Agent 헤더 대신 Server 헤더가 사용된다.
Body
- HTTP 요청 메시지의 body와 동일하다. 전송하는 데이터가 없다면 비어 있게 된다.