HTTP : HTTP 1.0과 1.1 / 헤더 / keep-alive

uoayop·2021년 12월 21일
1

WEB

목록 보기
4/8
post-thumbnail

HTTP status에 어울리는 귀여운 고앵이 보러가기
🐱 https://http.cat/

HTTP란?

HyperText Transfer Protocol
HTTP는 W3에 내재된 프로토콜로, 서버와 클라이언트 사이에서 어떻게 메세지를 교환할지 정해놓은 규칙이다.

HTML, CSS, JS, 이미지와 같은 파일들을 주고받기 위해선 클라이언트의 요청(request)과 서버의 응답(response)이 필요하다.

이 때 클라이언트와 서버가 서로 알아들을 수 있게끔 메세지를 주고 받는다.

메세지를 어떻게 보낼지 나타내는 통신 규약이 HTTP이고,
메세지는 requestresponse로 나뉜다.

쉽게 말해서 "어떻게 데이터를 요청할지, 어떻게 데이터를 보낼지" 와 같은 약속이라고 생각하면 된다.

그것이 "약속"이니까

HTTP/1.0 과 HTTP/1.1

잘 정리된 블로그 글이 있어 참고해 작성했다.
분도랑님 _ HTTP 1.0과 HTTP 1.1의 큰 차이점

  • HTTP 1.1의 큰 특징으론 아래의 세가지가 있다.
    1. 커넥션 유지
    2. 호스트 헤더
    3. 강화된 인증 절차

1. 커넥션 유지

  • HTTP를 이용한 데이터 전달은 TCP 세션 기반에서 이루어진다.
  • HTTP/1.0은 요청 컨텐츠마다 TCP 세션을 맺어야 하는 반면,
    1.1은 커넥션 유지 기능으로 한개의 TCP 세션을 통해 여러개의 컨텐츠 요청이 가능하다.
  • 장점
    • 클라이언트 - 응답 속도 개선됨
    • 서버 - TCP 세션 처리 부하 감소됨

1-1. 파이프라이닝

  • HTTP/1.0는 (요청)->(응답) 순으로 이루어져서 연속된 요청이 왔을 경우,
    현재 처리중인 요청에 대해 응답이 없다면 뒤에 요청된 요청들은 무시된다.
  • 1.1엔 이를 개선하기 위해 파이프라이닝 기능이 추가되었다.
    각각의 요청에 따른 응답을 보내는 방식이다.

2. 호스트 헤더

  • HTTP/1.0 에선 하나의 IP당 하나의 도메인만 운영할 수 있었다.
    == 도메인 수만큼 서버의 개수가 늘어나는 구조
  • HTTP/1.1에선 호스트 헤더를 추가해서 가상 호스팅이 가능해졌다.
    이젠 가상 호스팅이 너ㅓㅓㅓ무 흔해져서 대부분의 HTTP 클라이언트가
    HTTP/1.1과 호환되지 않아도 Host 헤더는 구현한다고 한다.

3. 강화된 인증 절차

  • HTTP/1.0에선 서버에서 클라이언트에게 인증을 요구하는 www-authentication 헤더가 있었지만
    클라이언트와 서버 사이에 프록시가 위치하는 경우
    프록시가 사용자의 인증을 요구할 수 있는 방법이 없었다!
  • HTTP 1.1에는 프록시가 클라이언트에게 인증 요청을 할 수 있도록 2개의 헤더가 추가되었다.
    • proxy-authenticate
    • proxy-authorization

HTTP 헤더

  • HTTP 프로토콜은 헤더에 요청과 응답에 대한 정보를 담아 주고 받는다.
  • 헤더는 4가지로 분류할 수 있다.
    • 공통 헤더
    • 요청 헤더
    • 응답 헤더
    • 엔티티 헤더
  • F12를 눌러 개발자 도구를 킨 뒤, 네트워크 탭에서 요청과 응답을 확인할 수 있다.

공통 헤더

요청과 응답 모두에 적용되지만 바디에서 전달되는 데이터와는 관련이 없는 헤더

  • Date : HTTP 메시지를 생성한 일시
  • Connection : 클라이언트와 서버 간 연결에 대한 옵션 설정
    • Connection: close 현재 HTTP 메세지 직후에 TCP 접속을 끊는다.
    • Connection : Keep-Alive 현재 TCP 커넥션을 유지한다.
  • Cache-Control : 캐시를 제어할 때 사용
  • Pragma : 캐시 제어, Http/1.0에서 쓰던 것으로 HTTP/1.1에선 Cache-Control이 쓰인다.

  • 사진에 있는 HTTP 헤더의 아이템들을 역할에 따라 분류해보았다.

캐싱

  • Pragma : 캐시 제어, Http/1.0에서 쓰던 것으로 HTTP/1.1에선 Cache-Control이 쓰인다.

  • Cache-Control : 캐시를 제어할 때 사용

연결 관리

  • Connection : 클라이언트와 서버 간 연결에 대한 옵션 설정
    • Connection: close 현재 HTTP 메세지 직후에 TCP 접속을 끊는다.
    • Connection : Keep-Alive 현재 TCP 커넥션을 유지한다.

컨텐츠 협상

  • Accept : 돌려줄 데이터 타입
  • Accept-Encoding : 돌려줄 리소스에 대한 인코딩 알고리즘
  • Accept-Language : 서버가 돌려주기로 한 예상된 언어

추적

  • dnt : 사용자의 추적 설정

요청 컨텍스트

  • Host : 가상 호스팅을 위해 서버의 도메인명과 서버가 리스닝하는 TCP 포트를 특정
  • User-Agent : 데이터를 요청한 사용자 에이전트의 애플리케이션 타입, 운영 체제, 소프트웨어 벤더 등을 식별할 수 있는 문자열

보안

  • Upgrade-Insecure-Requests : 암호화된 응답과 인증된 응답에 대한 클라이언트의 설정을 서버에 전송

Keep-Alive

Response Header

HTTP/1.1 200 OK
Connection: Keep-Alive
Keep-Alive: timeout=5, max=1000
...

HTTP는 TCP 위에서 동작한다.
TCP가 전송이 끝나면 연결이 끊어지듯이 HTTP도 서로 전송이 끝나면 끊어진다.
그런데 매번 전송이 끝날 때마다 다시 연결을 해야한다면 리소스가 낭비된다.

그래서 keep-alive 헤더가 생겼다.
특정 시간 동안 최대 요청의 수를 알려준다.

예시 코드는 최소 5초동안 최대 1000번의 요청을 한다면 http Connection이 끊어지지 않을 것이다.

http 1.1 부터는 기본적으로 keep-alive로 동작한다.


Reference

profile
slow and steady wins the race 🐢

0개의 댓글