Web

HTTP 웹 기본 지식 정리 - 본격! HTTP 기본

모모토 2021. 9. 8. 12:00
반응형

※ 본 포스팅은 Inflearn - 김영한 강사님의 'HTTP 웹 기본 지식 정리' 을 참고,공부하여 만들었습니다.

 

 

모든 것이 HTTP !

HTTP ( Hyper Text Transfer Protocol )

HTML , TEXT , JSON ,XML 이미지 음성 등등 거의 모든 형태의 데이터가 전송 가능하다.

서버간에 데이터를 주고 받을 때도 대부분 HTTP 사용

고로 지금은 HTTP 시대라고 하는것!

 

우리가 알아야 하는 HTTP의 특징

• 클라이언트 서버 구조부터 파악하자 • 무상태 프로토콜(stateless), 비연결성 • HTTP 메시지 • 단순함, 확장 가능

 

1. 클라이언트 서버 구조부터 파악하자

요청 , 응답 의 구조

클라이언트는 서버에 요청을 보내고 응답을 대기한다.

서버가 요청에 대한 결과를 만들어서 응답

사실 클라이언트와 서버를 분리하는것이 중요하다. 클라이언트는 중요한 로직을 다룰 필요가 없다. 클라이언트는 UI와 사용성 증대에 집중을

서버는 최적화와 데이터 관리 등에 더욱 집중을 할 수 있게 된다.

 

2. 무상태(Stateless) 프로토콜

Stateful VS Stateless

 

  A) 상태 유지(Stateful) : 연결된 서버에 요청 정보(상태)를 저장한다. 따라서 항상 같은 서버가 유지되어야한다. 연결된 서버에서 상태를 저장하기에 클라이언트는 그때 그때 필요한 정보만 입력하면 서버는 응답을 해준다.

따라서 만약 서버에 장애가 발생하면 다른 서버를 사용해야 하는데 처음 서버에 요청 정보가 저장되어 있기 때문에 다시 처음부터 정보를 입력해야한다.

 

  B) 무상태 (Stateless) : 무상태는 특정 서버에 상태를 저장하지 않는다. 따라서 상태 유지와는 달리 이전에 요청했던 정보를 똑같이 보내준다. 이를 각 요청이 독립적이라고 표현할 수 있다.

다음 인용절을 읽어보면 무상태성에 대해서 감이 올 것이다.

HTTP의 무상태(statelessness)는 각 요청이 독립적이라는 것을 말합니다. [1] 첫 번째 요청과 두 번째 요청은 서로에 대해 모릅니다. 각 요청들은 이전에 어떤 요청이 있었는지, 다음에는 어떤 요청이 갈지 전혀 모릅니다. 이를 무상태성이라고 표현합니다. - 김영한

 

따라서 상태유지와는 달리 서버에 장애가 발생하면 중계서버가 다른 서버로 연결할 시에 다시 똑같은 요청을 독립적으로 보낼것이다. 따라서 서버가 바뀌어도 요청에 대한 똑같은 응답을 받을 수 있는 것

이러한 무상태성의 특징 때문에 스케일 아웃 같은 수평 확장에 유리하다 (서버 증설이 용이하다는것)

정리하자면 기본적으로 HTTP 는 stateless한 특성을 가지고 있다. 따라서 기본적으로 서버는 HTTP로 보낸 정보는 저장하지 않는다. 하지만 시대의 요구에 따라서 상태 프로토콜인 HTTP를 가지고 특정 사용자를 식별하여 그 사용자에 맞는 정보를 제공해야 하는 요구가 생겨나게 되었고 그래서 등장한 것이 쿠키(Cookie)이다.

 

그렇다면 모든 것을 무상태성으로 설계가 가능할까?

그렇지 않다.

무상태가 필요한 경우가 있고 , 상태를 유지해야 하는 경우가 있는 것이다.

하지만 원칙은 존재한다. 일반적으로 브라우저 쿠키와 서버 세션등을 사용해서 상태를 유지 시켜야 하고

상태 유지는 최소한만 사용하여야 한다. 왜 그런지는 앞에서 설명한 대로이다.

 

무상태(Stateless) 프로토콜 그리고 비연결성

비연결성을 알아보기전에 연결성에 대하여 알아보자

연결성 모델

연결성 모델은 감이 오겠지만 , 연결을 유지하는 모델이다. 클라이언트 1,2,3이 존재하고 하나의 서버와 연결을 유지한다고 생각해보자

연결을 유지한다는것은 무엇을 의미할까? 바로 서버의 자원을 소모하고 있다는 이야기이다.

클라이언트 1이 서버에 요청을 하고 있는중에 클라이언트 2,3은 아무것도 하지않고 있어도 연결을 유지하고 있다. 즉 자원이 낭비되고 있다.

이와는 반대로 연결을 유지하지 않는 모델은 요청을 받을때만 연결하고 응답을 보낸뒤에는 연결을 끊어 버린다. 따라서 연결을 유지하지 않으므로 최소한의 자원이 소모된다.

항상 이런 개념들은 서비스나 프로그램의 규모가 커질때를 생각해봐야한다. 여기서 규모가 커진다는 것은 사용자가 많아진다는것을 의미하며 이때 생기는 문제들을 최소화할 수 있어야한다.

그런 측면에서 연결을 유지하지 않는 모델이 비교적 더 효율적이다.

HTTP는 기본적으로 연결을 유지하지 않는 모델이고 아주 빠른 속도로 응답이 가능하며 서버 자원을 매우 효율적으로 사용할 수 있다.

그리고 1시간 동안 수천명이 서비스를 사용한다고 해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 적다고 한다 😮

그렇다고 완전하게 장점만 가진것은 아니다.

매번 연결할때마다 TCP/IP 연결을 새로 맺어주어야 한다. 따라서 시간이 좀 더 소모된다는 단점도 있다.

하지만 'HTTP 지속 연결'로 인하여 이러한 단점도 해결하였으며 요즘은 기본적으로 HTTP 지속 연결을 사용한다고 한다.

 

스테이트리스를 기억하자

수강신청이 어려운 이유는 수많은 사람들이 동시에 서버에 달려들기 때문이다. 같은 시간에 수많은 사람들이 접속하면 대용량 트래픽이 발생하는데 비연결성이고 무상태성이고 소용이 없는 이유는 00시00분00초 오차 없이 동시에 접속해버리기 때문이다. 하지만 최대한 무상태성으로 설계하여 서버증설을 할 수 있도록 해야한다.