[Network] HTTP와 메시지 (Message)
HTTP
HTTP(Hyper Text Transfer Protocol)은 웹 상에서 서버 및 클라이언트 간의 데이터를 주고받기 위한 응용 계층(Application Layer)의 프로토콜로 초기엔 하이퍼 텍스트 형식의 데이터를 주고받았고 현재엔 이미지, 비디오 등 거의 모든 형식의 데이터를 주고받을 수 있게 되었다.
실제로 위와 같이 브라우저에서 확인해보면 HTTP를 사용해서 데이터들을 받는 것을 볼 수 있다.
HTTP의 특징
1. 클라이언트 - 서버 (Client - Server) 구조
Request Response 구조
클라이언트는 서버에 요청을 보내고 대기하면 서버는 요청에 대한 결과를 만들어서 응답해준다.
2. 무상태 (Stateless)
HTTP 통신에서 서버는 클라이언트의 상태를 보존하지 않는다.
Stateful, Stateless 차이
카페에서 커피를 주문할 때
stateful
손님 : 아이스 아메리카노 얼마예요?
점원 : 4100원입니다. (아이스 아메리카노 상태 유지)
손님 : 2잔 주세요
점원 : 8200원입니다. 카드로 결제하시나요? (아이스 아메리카노, 2잔 상태 유지)
손님 : 네
점원 : 8200원 결제됐습니다. (아이스 아메리카노, 2잔, 카드 상태 유지)
단순히 커피를 주문하는 일상적인 과정이지만 손님이 2잔 달라고 했을 때 점원이 바뀌었다고 가정하면 해당 점원은 어떤 음료를 2잔 달라는 건지 알지 못한다.
그렇기 때문에 어떤 음료를 2잔 달라는 건지 알기 위해 대화하는 과정에서 항상 기록하고 있어야 한다.
stateless
손님 : 아이스 아메리카노 얼마예요?
점원 : 4100원입니다.
손님 : 아이스 아메리카노 2잔 주세요
점원 : 8200원입니다. 카드로 결제하시나요?
손님 : 아이스 아메리카노 2잔 카드로 결제할게요
점원 : 8200원 결제됐습니다.
stateless는 중간에 점원이 바뀌어도 고객이 필요한 정보를 계속 알려주기 때문에 아무 문제가 되지 않는다.
상태를 저장하지 않기 때문에 로그인 같은 상태를 알기 귀해서는 쿠시-세션, API 등으로 상태를 확인할 수 있다.
stateful : 중간에 점원이 다른 점원으로 바뀌면 안 된다. (바뀌게 되면 상태 정보를 다른 점원에게 미리 알려줘야 한다.)
-> 서버 하나와 통신을 시작하면 계속 그 서버와 통신해야 한다.
stateless : 중간에 다른 점원으로 바뀌어도 문제가 되지 않는다.
-> 갑자기 고객이 증가해도 점원을 대거 투입할 수 있다.
==> 클라이언트 요청이 증가해도 서버를 대거 투입할 수 있다.
3. 비 연결성 (Connectionless)
http는 클라이언트가 요청을 하고 응답하면 연결을 끊어버린다. 이렇게 되면 서버는 최소한의 자원으로 서버를 효율적으로 사용할 수 있다.
하지만 http 통신 방식은 요청을 할 때마다 3 way handshake를 계속하기 때문에 추가적인 시간이 소요되고 수많은 데이터를 다운로드 하지만 요즘은 HTTP Persistent Connections로 문제를 해결한다.
HTTP 메시지 (Messages)
HTTP Messages는 클라이언트와 서버 사이에서 데이터가 교환되는 방식이다. 메시지는 요청 (Requests)과 응답 (Responses) 유형이 있다.
각 메시지들은 start-line, HTTP headers, empty line, body로 구성되어 있다.
Start line = request-line / status-line
Request (request-line)
GET /search?q=hello HTTP/1.1
GET : HTTP Method (GET, POST, PUT, DELETE,...)
/search?q=hello : 요청 대상(request-target)
HTTP/1.1 : HTTP Version
Response (status-line)
HTTP/1.1 200 OK
HTTP/1.1 : HTTP Version
200 : HTTP 상태 코드 (요청의 경과를 HTTP 상태 코드로 알려준다.)
OK : 상태 코드에 대한 설명
HTTP headers
Host : www.google.com
헤더 필드는 field-name : filed-value의 형식으로 작성된다.
filed-name의 경우엔 대소문자 구분이 되지 않는다.
헤더에는 HTTP 전송에 필요한 모든 부가정보가 들어있다.
ex) 메시지 바디의 내용, 바디의 크기, 인증,....
필요하면 임의의 헤더도 추가할 수 있다.
General header : 메시지 전체에 적용되는 정보
Request header : 요청 정보
Response header : 응답 정보
Representation header (Entity header) : 메시지 본문의 내용들을 해석할 수 있는 정보를 제공 (데이터 타입, 길이, 압축 정보 등등)
Payload 헤더
Content-Type : 표현 데이터의 형식 ex) text/html; charset=utf-8, application/json, image/png,...
Content-Encoding : 데이터의 압축 방식 ex) gzip, deflate, identity,...
Content-Language : 데이터의 자연 언어 ex) ko, en, en-US,...
Content-Length : 데이터의 길이
Accept 헤더
클라이언트에서 선호하는 방식을 서버에 전달한다. 서버 측에선 Accept 헤더에 있는 정보를 보고 처리가 가능하면 제공해준다.
Accept : 클라이언트가 선호하는 미디어 타입
Accept-Charset : 선호하는 인코딩
Accept-Encoding : 선호하는 압축 인코딩
Accpet-Language : 선호하는 자연 언어
일반 정보
From : 유저 에이전트의 이메일 정보
Referer : 현재 요청된 페이지의 이전 웹 사이트의 주소 A -> B로 이동을 요청할 때 Referer: A를 포함해서 요청
User-Agent : 클라이언트의 애플리케이션 정보
Server : 요청을 처리하는 origin 서버의 소프트웨어 정보
특별한 정보
Host : 요청한 호스트의 정보
Location : 페이지 리다이렉션
Allow : 허용 가능한 HTTP 메서드
Retry-After : 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
쿠키
HTTP는 무상태(stateless) 프로토콜이기 때문에 로그인 같은 상태를 유지해야 할 필요가 있기 때문에 사용
Set-Cookie : 서버에서 클라이언트로 쿠키 전달
Cookie : 서버에서 받은 쿠키를 클라이언트가 저장하고 요청 시 서버에 전달
expires : 만료일, 만료일이 되면 쿠키 삭제
max-age : 0이나 음수를 지정하면 쿠키 삭제
세션 쿠키 : 만료 날짜를 생략하면 브라우저 종료 시까지만 유지
영속 쿠키 : 만료 날짜를 입력하면 해당 날짜까지 유지
Body
<html>
<body>.... </body>
</html>
요청이나 응답 형태에 따라서 전송할 데이터가 들어간다.
HTML 문서, 이미지, 영상 등 Byte로 표현 가능한 모든 데이터를 전송할 수 있다.
김영한님 모든 개발자를 위한 HTTP 웹 기본 지식 참고
https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC
'Computer Science > Network' 카테고리의 다른 글
[Network] nginx reverse proxy, redirect 적용 (0) | 2022.12.21 |
---|---|
[Network] URI, URL, URN (0) | 2022.10.10 |
[Network] 전송계층(Transport layer)과 TCP/UDP (0) | 2022.10.06 |
[Network] IP 주소 (IP Address) & 서브넷 마스크 & 서브넷팅 (0) | 2022.10.04 |
[Network] TCP/IP 4계층 (1) | 2022.10.04 |