HTTP 통신의 구조
HTTP(Hyper Text Transport Protocol, 하이퍼텍스트 전송 프로토콜)는 브라우저-서버가 통신할 수 있게 만들어주는 프로토콜(규약)이다. 주로 HTML 문서를 주고받는데 쓰인다.
일반적으로 전송 계층 프로토콜로 TCP, 네트워크 계층 프로토콜로 IP를 사용한다. TCP/IP 에서 IP 주소를 사용해 통신할 컴퓨터를 결정하고, 포트 번호를 사용해 해당 컴퓨터의 어떤 프로그램과 통신할지 결정한다.
HTTP에서는 클라이언트가 서버에 요청 메세지를 보내고, 서버는 클라이언트 요청(Request)에 대한 응답(Response을 반환한다. 연결 상태를 유지하지 않는 비연결성(stateless) 프로토콜이다.
Http Request는 클라이언트가 서버로 전달해 서버의 액션이 일어나게끔하는 메세지다.
Request 구조는
- start Line,
- Header Lines,
- Body 로 이루어져있다.
시작라인은 요청이 시작되는 줄로
- HTTP메서드(GET, POST 등)
- 요청 타겟, 즉 URL, 포트, 도메인
- HTTP 버전이 들어간다.
헤더라인은..
- 대소문자 구분 없는 문자열 다음 콜론(' : ')이 붙으며, 그 뒤 값은 헤더에 따라 달라진다.
- 헤더는 또다시 General, Request, Entity 헤더로 나눌수 있다.
바디는..
- 리퀘스트 마지막 부분에 들어가며, 리소스를 가지고 오는 요청(GET, DELETE ...)에는 들어가지 않는다.
- 바디는 단일자원 / 다중 리소스 본문으로 나누어진다.
GET / HTTP/1.1 -> 리퀘스트 라인
// 리퀘스트헤더 시작
Host: www.naver.com:443
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36
// 리퀘스트헤더 종료
---공백 라인---
바디
Accept, Content-Type?
요청 헤더에는 Accept, content-type이 있다. Accept 헤더는 서버가 응답하기 위해 HTTP 메시지를 구성할때, 알맞은 형태로 제공해달라는 정보이고, Content-Type 헤더는 HTTP 메시지에 포함된 데이터가 어떤 형태로 구성되는지 서버에게 알려준다.
즉, 클라이언트에서 HTTP 요청을 할때 HTTP 메세지에 포함되는 형태에 따라 콘텐트타입 헤더를 제공해야하고, 서버로부터 특정 메세지 형태로 제공받고 싶다면 Accept 헤더에 알맞은 값을 지정해야 한다.
Accept 헤더에 주로 사용되는 헤더값
- text/plain, text/html, text/css, text/javascript
- application/json, application/xml, application/octet-stream
Content-Type
- 요청 데이터가 폼 데이터형태 일때 -> application/x-www-form-urlencoded
- 대용량 바이너리 데이터를 전송(파일첨부)할때 -> multipart/form-data
- Content-Type: Application/octet-stream - 디폴트 미디어 타입은 운영체제 종종 실행파일, 다운로드를 의미
- JSON 형태일때 -> application/json
HTTP Response는 요청에 대한 서버의 응답이다.
Response는
- Status Line
- Header
- Body 로 구성된다.
Status Line에는..
- 프로토콜 버전
- 요청의 성공여부 - HTTP 상태코드(404, 200...)
- 짧은 상태 텍스트 (Not Found) 가 담겨있다.
Header에는
- 마찬가지로 HTTP 헤더 기본 구조를 따른다.
- General Header, Request Header, Entity Header으로 나눌 수 있다.
Body
- 201, 204 와 같은 상태 코드를 가진 응답에는 보통 본문이 없다.
- 본문은 크게 세 종류로 나뉜다.
- 길이가 알려진 단일 파일로 구성된 단일-리소스 본문: 헤더 두개(Content-Type, Content-Lenght) 로 정의한다.
- 길이를 모르는 단일 파일로 구성된 단일-리소스 본문: Transfer-Encoding이 Chuncked 로 설정되어 있으며 파일은 청크로 나뉘어 인코딩 되어있다.
- 서로 다른 정보를 담고 있는 multipart로 이루어진 다중 리소스 본문
HTTP/1.1 200 // Status Line
// Response header 시작
cache-control: no-cache, no-store, must-revalidate
content-encoding: gzip
content-type: text/html; charset=UTF-8
date: Wed, 25 Aug 2021 02:42:02 GMT
p3p: CP="CAO DSP CURa ADMa TAIa PSAa OUR LAW STP PHY ONL UNI PUR FIN COM NAV INT DEM STA PRE"
pragma: no-cache
referrer-policy: unsafe-url
server: NWS
strict-transport-security: max-age=63072000; includeSubdomains
x-frame-options: DENY
x-xss-protection: 1; mode=block
// Response header 시작
-- 공백 라인--
바디
'개발 > 네트워크' 카테고리의 다른 글
TCP/IP 4계층과 OSI 7계층, 전송 계층의 handshake (0) | 2023.05.03 |
---|---|
[네트워크] IP 주소와 서브네팅 (0) | 2022.07.29 |