- 요즘에는 모든 것이 HTTP 위에서 동작합니다.
따라서 HTTP를 제대로 이해하고, 그 위에서 Spring Web MVC와 같은 웹 기술들을 공부해야 합니다.
- HTTP는 HyperText Transfer Protocol의 줄임말입니다.
처음에는 HTML, TEXT 등을 전송하는 것으로 시작했는데,
지금은 모든 것(Image, 음성, 영상, 파일, JSON 등)을 HTTP에 담아서 전송합니다.
그리고 서버 간에 데이터를 주고 받을 때도 대부분 HTTP를 사용합니다.
- HTTP의 역사를 간단하게 보면,
HTTP 1.1이 1997년에 등장했는데, 지금 가장 많이 사용합니다.
HTTP2와 HTTP3는 성능 개선에 초점이 맞춰져 있습니다.
- HTTP 1.1과 HTTP2는 TCP 기반으로, HTTP3는 UDP 기반으로 개발되어 있습니다.
TCP는 TCP 3way handshake도 해야 하고, 안에 데이터도 너무 많고,
속도가 빠른 메커니즘이 아닙니다.
- HTTP의 특징은 다음과 같습니다.
(1) 기본적으로 클라이언트-서버 구조로 동작합니다.
(2) 무상태(Stateless) 프로토콜을 지향하고, 비연결성(Connectionless)의 특징을 갖습니다.
(3) HTTP 메시지를 통해서 통신합니다.
(4) 단순하고, 확장 가능합니다.
(1) 클라이언트-서버 구조
- HTTP는 클라이언트가 HTTP 메시지를 통해서 서버에 요청을 보내고,
클라이언트는 서버의 응답이 올 때까지 기다립니다.
응답이 오면, 응답 결과를 열어서 클라이언트가 동작합니다.
이렇게 클라이언트와 서버를 분리하는게 중요한데,
비즈니스 로직이나 데이터는 서버에 밀어 넣고, 클라이언트는 UI나 사용성에 집중합니다.
이렇게 하면 클라이언트와 서버가 각각 독립적으로 진화할 수 있습니다.
(2) 무상태(Stateless) 프로토콜
- 무상태 프로토콜이란 서버가 클라이언트의 상태를 보존하지 않는다는 것입니다.
반면, Stateful은 상태를 유지한다는 것입니다.
무상태 프로토콜은 응답 서버를 쉽게 바꿀 수 있으므로, 무한한 서버 증설이 가능하다는 장점이 있습니다.
즉, 클라이언트 요청이 갑자기 증가했을 때, 서버를 대거 투입할 수 있습니다.
반면, Stateful한 서버는 서버를 늘리기 어렵고, 장애가 발생했을 때, 다시 처음부터 동작해야 합니다.
- 즉, 무상태는 Scale out에 굉장히 유리합니다.
하지만, 무상태도 한계가 있습니다.
예를 들어, 이벤트 소개 페이지는 상태를 유지할 필요가 없지만,
로그인과 같은 기능은 상태를 유지해야 합니다.
또한, 데이터를 너무 많이 보낸다는 점도 단점입니다.
(3) 비연결성(Connectionless)
- TCP/IP 연결 같은 경우는 기본적으로 연결을 유지합니다.
그리고 연결을 유지함으로써, 연결을 유지하는 서버의 자원이 소모됩니다.
이것의 단점은 사용하지 않는 서버도 연결을 유지해야 한다는 점입니다.
반면, 요청과 응답 이후 연결을 바로 끊어버리면, 서버가 유지하는 자원을 최소한으로 줄일 수 있습니다.
- HTTP는 기본적으로 연결을 유지하지 않는 모델입니다.
일반적으로 초 단위 이하의 빠른 속도로 응답합니다.
1시간 동안 수천명이 서비스를 사용해도, 실제 서버에서 동시에 처리하는 요청은
수십개 이하로 매우 작습니다.
따라서 서버 자원을 매우 효율적으로 사용할 수 있습니다.
- 비연결성 방식은 단점이 있는데, TCP/IP 연결을 새로 맺어야 한다는 점입니다.
즉, 3 way handshake로 인한 오버헤드가 발생합니다.
또한, 연결을 할 때마다 수많은 자원을 함께 다운로드해야 한다는 문제도 있습니다.
그래서 지금은 HTTP 지속 연결을 통해 문제를 해결합니다.
HTTP2와 HTTP3는 이 부분을 더 최적화 했습니다.
(3) HTTP 메시지
- HTTP는 HTTP 요청 메시지, HTTP 응답 메시지를 갖는데, 두 개의 구조가 다릅니다.
HTTP 메시지는 start-line, header, empty line, message body를 갖습니다.
요청 메시지의 start-line에는 HTTP 메소드, URl, HTTP 버전이 있습니다.
응답 메시지의 start-line에는 HTTP 버전과 응답 코드가 들어갑니다.
응답 메시지의 헤더에는 Content-Type, Content-Length 등이 들어갑니다.
(3-1) 시작 라인
- start-line은 request-line과 status-line으로 구분됩니다.
- HTTP 메서드는 GET, POST, PUT, DELETE 등이 있습니다.
-> GET은 서버로부터 해당 리소스를 달라고 요청하는 것이고,
POST는 이 리소스에 데이터를 줄 테니까 처리해달라는 것이고,
DELETE는 삭제해달라는 것입니다 .
- 요청 대상은 절대 경로로 시작합니다.
- 요청 메시지의 마지막은 HTTP 버전입니다.
- 응답 메시지는 HTTP 버전이 들어가고, 상태 코드가 들어가고,
200은 성공했다는 것이고,
400은 클라이언트가 잘못 보냈다는 것이고,
500은 서버에 장애가 있고, 문제가 있어서 서버 내부에 오류가 발생했을 때입니다.
참고
김영한, 모든 개발자를 위한 HTTP 웹 기본 지식
'네트워크' 카테고리의 다른 글
OSI 7계층과 TCP/IP 4계층을 비교하여 설명하기 (1) | 2022.09.19 |
---|---|
Oauth (0) | 2022.09.07 |
OSI 7계층 - 데이터 링크 계층 (0) | 2022.09.01 |
OSI 7계층 - 물리 계층 (0) | 2022.08.31 |
Restful 설계 원칙 (0) | 2022.08.26 |