들어가며
- 이전 포스트에서는 리소스를 식별할 수 있는 방법인 URI에 대해 알아보았다.
- 이번 포스트에서는 웹 개발에서 가장 핵심적인 프로토콜이라고 할 수 있는 HTTP에 대해 알아보도록 한다.
HTTP의 정의
- HTTP는 Hyper Text Transfer Protocol의 두문자로 HTTP 메세지에 모든 데이터를 전송할 수 있다.
- HTTP는 현재 1.1버전, 2버전, 3버전이 존재한다.
- HTTP/1.1은 현재 우리가 가장 많이 사용하는 HTTP 프로토콜 버전이다.
- HTTP/2는 1.1에서 성능이 개선된 버전이다.
- HTTP/3은 현재 개발 진행중으로 1.1과 2버전이 기반 연결 프로토콜로 TCP를 사용하는데 반하여 UDP를 사용한다. UDP는 이전에 간략히 설명했지만 TCP에 비하여 신뢰적 연결에 대한 기능이 없는 대신 그만큼의 속도를 메리트로 가져가는 프로토콜로 위의 두 버전보다 더 빠르다
HTTP의 특징
- HTTP은 다음과 같은 특징을 가진다.
- 클라이언트 서버 구조
- 무상태성(Stateless)
- 비연결성(Conectionless)
클라이언트 서버 구조
- 클라이언트 - 서버 구조는 클라이언트에서 요청(Request)을 보내면 서버가 해당 요청을 받고 그에 대한 응답(Response)을 반환하는 구조를 말한다.
- 여기서 요청은 모든 것을 포함한다. 페이지의 이동, 회원의 등록이나 삭제등의 모든 동작이 요청이 될 수 있고, 서버는 해당 요청을 받아 요청받은 동작을 수행하고 그 결과를 반환한다.
무상태성(Stateless)
- 무상태성의 의미는 서버가 클라이언트의 상태를 기억하고 있지 않다는 것이다.
- 예시를 들자면 우리가 가계로 들어가 어떤 물건을 사고 싶다고 점원 A에게 이야기를 하였다. 그리고 잠시 후에 점원 A에게 해당 물건에 대해 이야기를 할 때 점원이 나와 무슨 이야기를 했는지에 대해 기억하고 있지 않는다는 것이다.
- 즉 한번 설정된 연결이 끊기면 서버는 연결되었던 클라이언트에 대한 모든 정보들을 버린다.
- 만약 연결이 끊겼다 다시 설정되어도 서버가 클라이언트의 정보를 기억하고 있다면 이것은 무상태성이 아니다. 즉 상태 유지가 이루어지고 있다는 것이다.
- 클라이언트에 대한 모든 정보를 버리기 때문에 이후에 계속해서 동작을 이행하고 싶다면 그때까지의 모든 정보를 직접 서버에 제공해주어야 한다.
- 위의 예시에선 점원 A에게 어떤 물건을 사고 싶다고 말하였고, 그것을 카드를 사용하여 결재하겠다 라고 나 자신이 이야기 하는 것이 무상태성에서 물건을 사는 과정을 추가적으로 이행하는 방법이 될 것이다.
- 이것이 중요한 이유는 무상태성을 만족할 시 상태 유지를 하는 것에 비하여 요청에 응답하는 서버를 바꾸어도 시스템에 영향이 가지 않기 때문이다.
- 위와 같은 상황에서 상태를 유지하고 있다면 위의 첫 번째 서버에서만 응답을 수행할 수 있을 것이다. 왜냐하면, 다른 2, 3번 서버는 해당 상태를 유지하고 있지 않고, 첫 번째 서버만 클라이언트의 정보를 유지하고 있기 때문이다.
- 즉 1번 서버가 장애가 발생한다면 클라이언트는 다시 다른 서버에 처음부터 동작을 수행해야 할 것이다.
- 하지만 무상태성이라면 이야기가 다르다. 서버 1번에 장애가 발생해도, 클라이언트의 정보를 가지고 있지 않으므로, 다른 서버에 동일하게 정보를 제공한다면 동일한 동작을 다른 서버에서 수행할 수 있을 것이다.
- 이는 서버를 확장시키는데 매우 유리한 특성이다.
- 대신에 한계점도 있는데 클라이언트의 정보를 연결이 끊기면 모두 버려버리기 때문에 로그인 같이 사용자 인증을 해야하는 경우 모든 연결에 대해서 인증이 되었다는 정보를 전송해야 한다는 것이다.
- 이는 한 번의 연결에 다수의 데이터를 포함시켜 보내야 한다는 제약사항이 있고 이는 결과적으로 네트워크에 부하가 걸릴 수 있는 사항이다.
- 그래서 이를 극복하기 위해 상태 유지를 위해 쿠키와 서버 세션을 사용하게 된다. 다만 이러한 상태 유지는 위에서도 살펴 보았듯이 좋은 방식은 아니기 때문에 가급적 최소한으로 사용해야 한다.
무연결성(Connectionless)
- 무연결성의 의미는 서버와 클라이언트 사이의 연결을 계속 유지하지 않고, 응답이 들어오면 연결을 끊는다는 특성이다.
- 만약 서버와 클라이언트가 연결을 계속 유지하는 경우, 서버는 클라이언트와 연결을 유지하는데에 대해 자원을 사용해야 한다. 그렇다면 자연스럽에 다른 클라이언트에 사용할 자원이 모자라게 되고 그만큼의 추가적인 연결을 사용할 수 없게 될 것이다.
- 무연결성은 그러한 자원들을 미연에 회수하기 때문에, 연결을 유지하는 서버보다 더 많은 연결을 수행할 수 있을 것이다.
- 대신 매번 연결을 다시 재설정해야하기 때문에 TCP기반의 HTTP 특성상 3-way handshake를 매 연결마다 수행해야 하고 그만큼의 시간이 낭비된다는 단점이 존재한다.
- 이는 HTTP 지속 연결이라는 해결책이 존재한다. 기존에 HTML, JS, CSS를 받아오는 각각에 대해 새로 연결을 수행했던 것을 한 번의 연결로 모두 가져올 수 있도록 하는 것이다. 대신 무한정으로 연결을 유지하진 않으므로 기존의 방법보다 연결에 덜 시간이 낭비되게 된다.
정리
- HTTP의 정의와 특징에 대해 알아보았다.
- HTTP는 무상태성을 가진다.
- HTTP는 무연결성을 가진다.
- HTTP는 클라이언트 - 서버 구조를 가진다.
- 다음 포스트에서는 HTTP의 구조와 메서드에 대해 알아본다.
'CS > HTTP' 카테고리의 다른 글
HTTP - HTTP 메서드 (0) | 2023.05.17 |
---|---|
HTTP - HTTP API 설계와 HTTP메서드 (0) | 2023.05.15 |
HTTP - HTTP 메시지 구조 (0) | 2023.05.15 |
HTTP - URI의 개념 (0) | 2023.05.11 |
HTTP - 인터넷 통신 기초 (0) | 2023.05.09 |