HTTP 기본

jkpapa·2023년 3월 30일
0

HTTP

목록 보기
3/5

HTTP(Hyper Text Transfer Protocol)

  • HTTP는 하이퍼텍스트, HTML, 문서간의 링크를 통해 연결 할 수 있는 파일을 전송하는 프로토콜로 시작했다.
  • 현재는 이미지, 영상, 음성, 파일 ,JSON 등등 거의 모든 형태의 데이터를 전송 할 수 있다.
  • 심지어 서버간에 데이터를 주고 받을 때도 대부분 HTTP를 사용한다.

HTTP 기반 프로토콜

  • TCP 프로토콜 위에서 동작한다.

  • 크롬 브라우저 개발자도구 네트워크 탭에서 프로토콜 우클릭 후 프로토콜이라는 column을 확인해보자.

h2 는 HTTP/2 버전을 의미한다. 과거에 네이버는 HTTP/1.1을 사용했었는데 어느새 개선된 HTTP/2 프로토콜을 사용하고 있다.

일단 나는 신입개발자니까 HTTP/1.1을 공부하자.

HTTP 특징

  • 클라이언트와 서버구조로 동작한다.
  • 무상태 프로토콜을 지향한다.
  • HTTP 메시지를 통해서 통신한다.
  • 단순하고 확장성이 좋다.

HTTP의 특징을 하나씩 자세히 알아보자

클라이언트와 서버구조

HTTP는 클라이언트가 HTTP메시지를 통해서 서버에 요청을 보낸다.
클라이언트는 서버에서 응답이 올 때 까지 묻지도, 따지지도 않고 그저 대기한다.
서버는 요청에 대한 결과를 만들어서 응답한다.
응답 결과를 열어서 클라이언트가 동작하게 된다.

클라이언트와 서버를 분리해야 한다.

비즈니스 로직과 데이터는 모두 서버에서 처리하고, 클라이언트는 UI에 집중한다.

이렇게하면 클라이언트와 서버가 독립적으로 발전할 수 있다.

클라이언트는 서버가 어떤 일을 하는지 몰라도 된다.

무상태 프로토콜

  • 서버가 클라이언트의 상태를 보존하지 않는다.

이 정의를 이해하기 전에 상태 유지 프로토콜에 대해서 알아보자

Stateful

서버가 클라이언트의 이전 상태를 보전하는 것이다.

상태유지 프로토콜은 클라이언트의 요청을 하나 하나 모두 기억한다.

만약 배달앱에서 상태유지를 하는 서버와 통신을 한다고 가정해 보자.

클라이언트는 순차적으로 이런 요청을 보낸다.

1. 짜장면 2그릇
2. 초인종 누르지 말아주세요
3. 결제는 카드로

서버는 클라이언트의 요청을 받아 응답하고 받은 요청을 기억한다. 그런데 만약 2번째 요청을 받고 서버에 오류가 발생해서 다른 서버로 요청을 보내야 한다고 가정해보자.

서버1
1. 짜장면 2그릇 주문이요~
2. 초인종은 누르지 말아 달래요~

😨 아 갑자기 화장실이 급해서 주문 좀 대신 받아주세요~
    
교체된 서버2
1. 결제는 카드로

🙄🙄🙄🙄🙄🙄 ?? 갑자기... 뭘 주문했는지 말도 안했는데 

이런 식으로 상태를 유지하는 프로토콜을 사용하는 경우에 정상적인 통신을 하려면 클라이언트가 통신해야 하는 서버를 하나 밖에 가질 수 없다.

지금 통신하고 있는 서버만 전체 맥락을 이해 할 수 있으니까!

반면에 ....

Stateless

무상태 프로토콜은 서버가 클라이언트의 요청을 기억해 두지 않는다.

이런 방식으로 진행 된다.

클라이언트
1. 짜장면 2그릇
2. 짜장면 2그릇, 초인종 누르지 말아주세요
3. 짜장면 2그릇, 초인종 누르지 말아주세요, 결제는 카드로

아까와 같은 상황이 벌어졌다고 가정해 보자

서버1
1. 짜장면 2그릇 주문이요~
2. 짜장면 2그릇, 초인종 누르지 말아달래요~

😨 아 갑자기 화장실이 급해서 주문 좀 대신 받아주세요~
    
교체된 서버2
1. 짜장면 2그릇, 초인종 누르지 말아주세요, 결제는 카드로

👌 네, 주문 접수되었습니다.

이 처럼 무상태 프로토콜은 클라이언트가 필요한 데이터를 모두 담아서 서버에 보낸다.

만약 예기치 못한 상황이 서버에 발생해도 중간에 통신하는 서버를 바꿔 클라이언트는 여러 서버와 통신 할 수 있다.

무상태 프로토콜을 사용하는 통신은 서버가 무한정으로 증설 할 수 있겠다. 얼마든지 클라이언트는 다른 서버와 통신 할 수 있을 테니까!

💡정리해 보자

  • 상태유지: 중간에 다른 서버로 바뀌면 안된다. 통신하는 서버가 바뀔 때 클라이언트의 상태 정보를 다른 서버로 넘겨줘야 한다.

  • 무상태: 중간에 통신하는 서버가 중간에 바뀌어도 된다.

    • 무상태는 응답 서버를 쉽게 바꿀 수 있다. -> 무한한 서버 증설 가능
    • 갑자기 서버에 클라이언트 요청이 많아지만 새로운 서버를 대거 투입할 수 있다.
  • 무상태 프로토콜의 한계

  • 모든 것을 무상태로 설계 할 수 있는 경우도 있고 없는 경우도 있다.

  • 무상태가 가능한 경우

    • 로그인이 필요 없는 단순한 서비스 소개 화면과 같이 간단한 웹
  • 상태를 유지해야 하는 경우

    • 로그인, 로그인한 사용자의 경우 로그인 했다는 상태를 서버에 유지해야 한다.
    • 일반적으로 브라우저 쿠키와 서버 세션등을 사용해서 상태를 유지함.
    • 상태 유지는 가급적 최소한만 사용하고, 상태유지는 꼭 필요한 경우에만 사용해야 한다.
  • 데이터를 너무 많이 보낸다. 그때 그때 자신의 상태를 설명해야 하는 데이터를 모두 보낸다.

비연결성

  • HTTP는 클라이언트와 서버가 통신 할 때 연결을 유지하고 있지 않다.

자세히 알아보자

연결을 유지하는 모델

  • TCP/IP프로토콜은 클라이언트가 한 번 서버로 요청을 보내면 계속해서 연결을 유지하고 있다.

    	클라이언트가 아무 요청도 보내지 않아도 연결을 유지함 ....

클라이언트가 아무 요청도 하지 않는데 서버와의 연결을 계속 유지하는 것은 서버에 부담이 많이간다.

하는 것도 없으면서 집에서 밥만 축내는 백수들이 많아지는 것이다.😫

HTTP는 가차없다.

연결을 유지하지 않는 모델

  • HTTP는 클라이언트의 요청에 대해 응답하고 서버가 연결을 끊어버린다. 서버는 연결을 유지하지 않아 최소한의 자원을 사용하며 서버를 유지 할 수 있다.

  • 일반적으로 초 단위 이하의 빠른 속도로 응답한다.

  • 1시간 동안 수천명이 서비스를 동시에 사용해도 실제 서버에서 동시에 처리하는 요청은 수십개 이하로 매우 작음 (연결을 유지 하지 않고 있으니까)

쉬지 않고 계속 검색버튼을 누르는 사람은 많지 않다. (그렇겠지?..)

  • 따라서 서버 자원을 매우 효율적으로 사용할 수 있다.

⚠️ 한계

  • HTTP는 TCP/IP를 사용하고 있기 때문에 클라이언트가 새로운 요청을 보낼 때 마다 3 way handshake를 또 해야 한다.

  • 웹 브라우저로 사이트를 요청하면 HTML 뿐만 아니라 자바스크립트, css, 추가 이미지등 수 많은 자원이 함께 다운로드되어야 하는데 파일하나 받을 때마다 연결을 끊고 다시 연결하고 ... 큰 단점이다.

    	html받고 연결 끊고 TCP연결하고 자바스크립트 받고 연결 끊고 ..... 😥
  • 지금은 HTTP 지속 연결로 문제를 해결했다.

    • 지속연결은 보내야 하는 데이터를 모두 보낼 때 까지 연결을 유지하고 있다가 모든 데이터를 전송 후 연결을 해제한다.

      html 요청 응답 
      css 요청 응답 
      js 요청 응답
      이미지 요청 응답
      .... 모두 받으면 연결 종료

HTTP 메시지

  • HTTP는 요청 메시지와 응답 메시지의 구조가 약간 다르다.

  • HTTP의 메시지 구조

시작라인 satrt-line
헤더 header
공백라인(무조건 있어야하는 필수 라인)
메시지 바디 message body
  • 요청 메시지의 구조
HTTP 메서드 쿼리 HTTP버전
Host(헤더)

예시

Get /search?q=hello HTTP/1.1
Host: www.google.com

💡 요청 메시지도 body본문을 가질 수 있음

  • 응답 메시지 구조
HTTP버전 HTTP상태코드
헤더필드

메시지 바디

예시

HTTP/1.1 200 OK
content-type: text/html;
content-length: 1024

<html>
  <body> ... </body>
</html>

시작라인

  • 요청 메시지
    • start-line: request-line
    • request-line = HTTP메서드 요청대상 HTTP버전
    • HTTP 메서드 종류: GET POST PUT DELETE 메서드는 서버가 수행해야 할 동작을 지정한다.
    • 요청 대상: 절대경로[?쿼리]
    • HTTP 버전: ex) HTTP/1.1, HTTP/2
  • 응답 메시지
  • start-line: status-line
    • status-line = HTTP버전 상태코드 reason-parse
    • 상태코드: 요청 성공, 실패를 나타냄
    • reason-parse: 사람이 이해할 수 있도록 요청 결과를 표현한 짧은 글
  • 헤더필드: 필드이름: 필드값
    • HTTP 전송에 필요한 모든 부가정보가 들어있음
      • 메시지 바디의 내용, 크기, 압축, 인증, 요청 클라이언트(브라우저) 정보, 서버 애플리케이션 정보, 캐시 관리 정보 ....
  • HTTP 메시지 바디

    • 실제 전송할 데이터 HTML, 이미지, 영상 ... byte로 표현할 수 있는 모든 데이터
  • HTTP는 단순하고 확장이 가능, 메시지도 단순

크게 성공하는 표준 기술은 단순하지만 확장 가능한 기술이다...

0개의 댓글