Network

[Network] HTTP에 대해서 알아보자!! (1편 - 특징)

coding-knowjam(코딩노잼) 2022. 1. 5.
728x90

1. HTTP란?

HyperText Transfer Protocol이라고 부르는 HTTP는 무엇일까요?

단순히 한 문장으로 정의하자면, 서버와 클라이언트 간의 정보 전달을 위해 사용하는 프로토콜로써 암호화되지 않은 평문을 전송하며 무상태, 비연결성의 특징을 가지고 있습니다.

그러나 이렇게만 말하면 의미를 잘 모르기도 하고 HTTP에 대해서 잘 알 수 없겠죠?

그러면 HTTP는 어떤 특징을 가지고 있는지 한번 알아보겠습니다.

 

1.1 클라이언트 - 서버 구조(Client-Server)

HTTP는 아래 그림과 같이 클라이언트 - 서버 구조로 이루어져 있습니다.

클라이언트 서버 구조 (출처 : 인프런 - 모든 개발자를 위한 HTTP 웹 기본 지식)

클라이언트는 서버에 요청을 하고 응답을 대기합니다. 

이후 서버는 클라이언트의 요청에 대한 결과를 응답합니다.

이렇게 클라이언트와 서버가 독립적인 구조를 가지고 있기 때문에 필요에 따라서 각자 발전이 가능한 특징을 가지고 있습니다.

예를 들어 현재 서비스의 트래픽이 증가한다면, 클라이언트는 신경 쓰지 않고 서버의 트래픽 처리를 위해서만 집중할 수 있을 겁니다

또는 클라이언트 측이 UI가 변경되는 상황이라면 서버는 이를 신경 쓸 필요가 없겠죠?

이렇게 서로 독립적으로 발전이 가능하다는 특징을 가지고 있습니다.

 

1.2 무상태 프로토콜(Stateless)

HTTP는 서버에서 클라이언트의 상태를 유지하지 않는 무상태의 특징을 가지고 있습니다.

무상태는 정확히 어떤 것일까요?

좀 더 쉬운 이해를 위해 상태를 유지할 때와 상태를 유지하지 않을 때를 비교해보겠습니다.

 

- 상태 유지(Statefull)는 다음과 같이 요청과 응답이 이루어집니다.

클라이언트 : 사과는 얼마인가요?

서버 : 천 원입니다.

클라이언트 : (사과) 2개 주세요

서버 : 결제는 뭘로 하겠습니까?

클라이언트 : (사과 2개) 현금으로 할게요

서버 : 네. 2천 원 결제되었습니다.

 

- 무상태(Stateless)는 다음과 같이 요청과 응답이 이루어집니다.

클라이언트 : 사과는 얼마인가요?

서버 : 천 원입니다.

클라이언트 : 사과 2개 주세요

서버 : 결제는 뭘로 하겠습니까?

클라이언트 : 사과 2개 현금으로 결제할게요.

서버 : 네. 2천 원 결제되었습니다.

 

차이점이 보이시나요?

Statefull(상태 유지) 방식에서는 매 요청마다 클라이언트 상태를 서버가 알고 있으므로, 무엇을 구매할지, 몇 개를 구매할지 알려줄 필요가 없습니다.

반대로 Stateless(무상태) 방식에서는 매 요청마다 무엇을 구매할지, 몇 개를 구매할지 알려줘야 합니다.

 

위의 예시를 보면 상태 유지가 서로에게 편할 거 같은데 왜 HTTP는 무상태의 특징을 가지고 있을까요??

예를 들어 대용량 트래픽을 처리하기 위해 여러 개의 서버가 있다고 아래 그림과 같이 가정해봅시다.

출처 : 인프런 - 모든 개발자를 위한 HTTP 웹 기본 지식(김영한 저)

상태를 유지하게 되면 서버 1에 요청한 고객은 서버 1과 통신을 해야 합니다. 

왜냐하면 서버 2와 서버 3은 해당 클라이언트의 상태를 모르기 때문입니다.

이런 구조의 단점은 요청을 처리하기 위해 해당 클라이언트의 상태를 가지고 있는 서버만 사용되므로, 특정 서버에만 요청이 몰리는 경우가 발생할 수 있습니다.

그런 상황에서 만약에 아래 그림과 같이 서버 1에서 장애가 발생한다면, 서버 1에서 저장한 클라이언트의 정보는 모두 소실될 것입니다. 그러면 서비스적으로 많은 문제가 발생하겠죠??

출처 : 인프런 - 모든 개발자를 위한 HTTP 웹 기본 지식(김영한 저)

그럼 반대로 무상태의 특징을 가진다면 어떨까요?

서버는 매 요청마다 필요한 정보(구매할 물품, 수량, 결제방식 등)들을 클라이언트로부터 받기 때문에 어느 요청을 받아도 동일한 응답을 제공해 줄 수 있습니다. 

또한 서버를 증설하거나 줄이거나 등의 확장성도 Statsfull방식에 비해 높습니다.

이러한 특징 덕분에 하나의 서버에서 장애가 발생하더라도 아래 그림과 같이 다른 서버에서 클라이언트의 요청을 처리해 줄 수 있습니다. 

출처 : 인프런 - 모든 개발자를 위한 HTTP 웹 기본 지식(김영한 저)

이제 한 가지 의문이 생기시겠죠?

로그인이나 장바구니 같은 건 상태를 유지하는 것이 아닌가??

맞습니다. 추후에 다루겠지만 HTTP는 Cookie와 Session 등과 같은 기술을 활용해서 상태를 유지할 수 있습니다.

위와 같은 기술을 활용해서 상태를 유지한다는 것은 Statefull에서 살펴보았던 장애가 동일하게 발생할 수 있기 때문에, 정보 관리를 위해 여러모로 신경을 써야 합니다. (이에 대한 방법들도 추후에 다뤄보겠습니다)

이러한 이유들로 인해 우리는 최대한 무상태로 서비스를 설계해야 합니다.

 

1.3 비연결성 (Connectionless)

비연결성의 의미는 말 그대로 서버와 클라이언트 간의 연결을 유지하지 않는다는 것을 말합니다.

좀 더 자세히 설명하면 클라이언트가 요청을 하고 서버가 요청에 대한 응답을 하는 과정에서는 서로 연결이 되어있지만, 서버가 클라이언트에게 최종적으로 응답을 하고 난 이후에는 연결이 끊어진다는 것입니다.

 

그럼 왜 비연결성의 특징을 가지고 있을까요??

아래 그림과 같이 연결이 계속 유지가 되어있다면 어떨까요??

출처 : 인프런 - 모든 개발자를 위한 HTTP 웹 기본 지식(김영한 저)

만약에 클라이언트가 1번만 요청하고 이후에 요청을 하지 않더라도 서버와 연결이 유지되기 때문에 서버의 자원이 비효율적으로 사용될 것입니다.

그렇기 때문에 HTTP는 요청과 응답이 종료된 이후에 연결을 끊어서 서버의 자원을 효율적으로 사용하는 구조를 가지고 있습니다.

 

그러나 한계점도 존재합니다. TCP/IP 위에서 동작하는 HTTP는 기본적으로 3-way handsahke과정을 통해 연결이 이루어지는데 요청이 잦을수록 이 과정이 빈번하게 수행됩니다.

그래서 HTTP는 이러한 한계를 극복하기 위해 지속 연결(Persistent Connections)을 제공하며 HTTP/1.1에서는 특별한 설정이 없는 한 기본적으로 지속 연결을 사용하고 있습니다.

지속 연결(Persistent Connections)은 요청과 응답이 처리된 이후에도 계속 연결된 상태를 유지하며 해당 Connection을 재 사용함으로써, 성능을 향상하는 방법을 의미합니다.

기본적으로 클라이언트가 서버에 요청을 한 이후에 발생하는 다른 요청들 대부분 동일한 서버에 요청을 하게 되는데, 이러한 특징을 활용해서 아래 그림과 같이 연결을 유지하여 요청과 응답의 처리속도를 높일 수 있습니다.

출처 : 인프런 - 모든 개발자를 위한 HTTP 웹 기본 지식(김영한 저)

지속 연결을 사용함으로써 처리속도를 높일 수는 있지만, 적절하게 연결을 끊어주지 않는다면 계속 유지하는 것과 다르지 않으므로, 적절한 기준을 통해서 연결을 끊어줄 수 있어야 합니다. (입력과 출력 채널 중 한쪽만 끊기, 연결의 지속시간을 설정하기 등)

 

2. HTTP 특징 정리

  • 클라이언트 - 서버 구조를 가짐
  • 무상태(Stateless)의 특징을 지님
  • 비연결성(Connectionless)의 특징을 지님

 

해당 포스팅은 인프런 - 모든 개발자를 위한 HTTP 웹 기본 지식 강의를 참고한 내용이 다수 포함되어 있으며, 다음 포스팅에서는 HTTP에서 사용하는 URI, URL에 대해서 살펴보겠습니다.


728x90

댓글