[Computer Network] HTTP
📝HTTP (Hypertext Transfer Protocol)
-
HTTP는 World Wide Web에서 정보를 주고 받을 수 있게 해주는 프로토콜이다.
- 웹에서 송수신 되는 정보는 HTML, CSS, JS, 이미지 등이 있다.
- HTTP는 TCP 기반에서 동작하며, 80번 포트를 사용한다. (HTTP 3는 UDP 기반에서 동작한다.)
📌 Client-Server Model
- HTTP는 클라이언트와 서버로 구현된다.
- 클라이언트가 서버에게 HTTP 요청을 보내면, 서버는 요청에 대한 HTTP 응답을 되돌려준다.
- 예를들어 클라이언트인 웹 브라우저가 HTTP를 사용해서 서버에게 HTML이나 이미지 등을 요청하면
- 서버는 필요한 정보를 해당 브라우저에게 전달하며, 요청에 응답한다.
- 브라우저는 서버로부터 응답받은 정보를 화면에 렌더링하여 모니터를 통해 사용자가 시각적으로 정보를 볼 수 있게 한다.
- HTTP 클라이언트로는 Chrome, Internet Explore, Fire Fox 등의 웹 브라우저가 있다.
📌 HTTP Request
- HTTP는 HTTP 메서드라고 불리는 여러 종류의 요청 명령을 지원한다.
- HTTP 요청 메세지는 한 개의 HTTP 메서드를 갖는다.
- HTTP 메서드는 서버가 어떤 동작을 취해야 하는지 알려준다.
HTTP 메서드 | 설명 |
---|---|
GET | 서버에게 데이터 전송을 요청 |
POST | 클라이언트에서 서버로 데이터 전송 |
DELETE | 서버의 데이터 삭제 요청 |
PUT | 클라이언트에서 서버로 데이터 전체 갱신 요청 |
PATCH | 클라이언트에서 서버로 데이터 일부 갱신 요청 |
HEAD | 서버에게 헤더 요청 |
📌 HTTP response
- 모든 HTTP 응답 메세지는 HTTP 상태 코드와 함께 반환된다.
- 상태 코드는 클라이언트에게 요청이 성공했는지, 실패했는지, 추가 조치가 필요한지 등을 알려주는 3자리 숫자다.
HTTP 상태코드 | 설명 |
---|---|
200 (OK) | 요청이 성공적으로 되었다. |
201 (Moved Permanently) | 요청 객체가 영원히 이동 되었다. |
400 (Bad Request) | 서버가 요청을 이해할 수 없는 오류 코드 |
404 (Not Found) | 서버에서 요청받은 리소스를 찾을 수 없다. |
505 (HTTP VErsion Not Supported) | 요청 HTTP 프로토콜 버전을 서버가 지원하지 않는다. |
📌 HTTP 메세지 포멧
- HTTP Message는 ASCII로 쓰여있어서 사람이 읽을 수 있다.
- HTTP Message의 각 줄은 CR과 LF로 구별된다. 마지막 줄은 추가 CR과 LF가 요구된다.
📜 HTTP Request Massage
🔎 분석
-
HTTP Request Massage의 첫 줄은 request line이다. HTTP Method, URL, HTTP 버전 필드를 갖는다.
-
request line
: HTTP 버전은 1.1이고 /index.html 객체를 GET 방식으로 요청하고 있다. -
Host
: 객체가 존재하는 호스트는 www-net.cs.umass.edu 이다. -
User-Agent
: Server에게 요청하는 브라우저 타입이다. Firefox 3.6.10 버전임을 알 수 있다. -
Accept-Language
: 요청하는 객체의 언어 버전이다. 영어(미국), 영어 버전을 요청한다. -
Accept-Encoding
: 응답 객체를 gzip 또는 deflate 압축 알고리즘으로 압축해서 보내도 됨을 나타낸다. -
Accept-Charset
: 클라이언트가 지원하는 인코딩을 나타낸다. 클라이언트가 ISO-8859-1 또는 utf-8 인코딩을 지원함을 알 수 있다. -
Connection
: keep-alive로 되어있다. Persistent Connection 연결을 사용한다. -
Keep-Alive
: Persistent Connection 연결 지속 시간이다. (초단위) 115초의 time out을 갖는다.
📜 HTTP Response Massage
🔎 분석
- HTTP Response Massage의 첫 줄은 Status Line이다. HTTP 버전, 상태 코드, 상태 메세지 필드를 갖는다.
Status Line
: HTTP 1.1 버전을 사용하고 있고 요청이 성공적으로 되었음을 상태 코드를 통해 알 수 있다.Date
: Response Message를 보낸 시간을 의미한다. 2010년 9월 26일 일요일 20:09:20 GMT에 응답 메세지를 보냈다.Server
: Response Message가 Apache 웹 서버에 의해 만들어졌음을 나타낸다. Request Message의 User-agent와 비슷하다.Last-Modified
: 객체가 생성되거나 마지막으로 수정된 시간과 날짜를 나타낸다. 프록시 서버에서 캐싱을 할때 매우 중요하다. 2007년 10월 30일 수요일 17:00:02 GMT에 마지막으로 수정됐음을 알 수 있다.Content-Length
: 송신되는 객체의 바이트 수를 1 나타낸다. 객체의 크기는 2652 Byte이다.Content-Type
: 객체의 타입을 나타낸다. html text임을 알 수 있다.
**📌 **Connectionless Protocol(비연결성 프로토콜)
- HTTP 클라이언트와 서버는 TCP 연결을 맺고, 클라이언트 요청과 서버의 응답이 오간다.
- Connectionless란 한 번의 요청과 응답이 오간 후에 맺었던 연결을 끊어 버리는 성질을 말한다.
- 장점 : 서버는 다수의 불특정 클라이언트와 연결을 유지 하지 않아도 된다.
- 단점 : 서버는 매번 다수의 클라이언트에 대해 새로운 연결을 맺어야 하는 오버헤드가 발생한다.
- HTTP 1.0부터 추가된 KeepAlive 헤더를 통해 HTTP 연결이 지속되게 할 수 있다.
- 연결을 유지하느냐 안 하느냐에 따라 HTTP 연결은 아래와 같이 구분된다.
- Non-Persistent Connection
- 한 번의 TCP 연결에, 하나의 객체를 전송할 수 있다. 각각의 모든 요청에 대한 TCP 연결이 필요하다.
- 모든 Request/Response에 대한 TCP 사전 연결을 설정을 하고, 연결을 유지 해야한다.
- 이러한 방식은 Client와 Server에 심각한 부담을 준다.
- Persistent Connection
- 한 번의 TCP 연결에, 여러 개의 객체를 전송할 수 있다. Sever가 Client에게 Response를 보낸 후에 TCP 연결을 그대로 유지한다. (연결은 일정시간 사용되지 않으면 종료된다.)
- Persistent Connection을 사용하면 HTTP 파이프라이닝이 가능하다는 장점이 있다.
- HTTP/1.1부터 디폴트로 지원된다.
- Non-Persistent Connection
📌 Stateless Protocol(무상태 프로토콜)
- HTTP 서버는 클라이언트의 요청 내역을 기억하지 않는다.
- 따라서 서버는 클라이언트가 누구인지 식별하지 못한다.
- 클라이언트가 누구인지 식별 해야하는 경우 상태유지기술인 쿠키와 세션을 사용한다.
🔎 출처 & 더 알아보기
- HTTP 1.1 Keep-Alive 기능
- HTTP/3는 왜 UDP를 선택한 것일까?
- HTTP 압축 작동 원리
- HTTP 인코딩, 국제화 관련
- HTTP 상태 코드
- HTTP (HyperText Transfer Protocol)
- HTTP 특성(비연결성, 무상태)과 구성요소 그리고 Restful API