[HTTP/HTTPS] HTTP(S)를 완벽하게 파헤쳐보자!

이상돈·2024년 3월 14일

서두

기본적으로 HTTP/HTTPS에 대한 개념, 어느정도의 지식은 알고있다.
하지만 여기서 좀 더 깊게 파헤쳐보고 싶었다. 나는 HTTP메서드들, CORS정책, 콘솔창에서 network탭에 들어가면, 어떤걸 실어서 요청하는지,어떻게 응답이 오는지만 봤다. 하지만, 이번기회에 어떻게 요청하는지 제대로 파헤쳐 볼 거다!!!!!

Base

내가 지금 알고있는 지식들을 적어보겠다.

  • http는 어플리케이션 계층에서 데이터 전달하는 통신규약중 하나다.
  • http통신은 기본적으로 non-persistent방식이다. 즉, 서버와 클라이언트 연결상태가 유지 되지 않는다. 또한, 클라이언트와 통신하고 난뒤, 클라이언트의 상태를 저장해놓지 않는다.(stateless)
  • https는 어플리케이션레이어와 트랜스포트레이어 사이에서 SSL인증서를 적용시켜 보안성을 강화시킨 통신규약이다.
  • 통신을 연결할때, 3way-handshaking 방식을 사용하며, 4way-handshaking방식으로 연결을 해제한다.
    • 해제할때 한 단계가 더 늘어난 이유는?
      클라이언트가 연결 해제를 요청하고, FIN 플래그를 담아 보낸다.
      이떄 서버는 TIME_WAIT상태가 되는데, 아직 서버에서 클라이언트 측에 보내지 못한 데이터가 존재할 경우를 대비하여 한 단계 더 늘어난것이다. 더이상 보낼 데이터가 없다고 판단하면, 서버도 마찬가지로 FIN 플래그를 보내어 서로 연결을 종료한다.
  • Http 통신 방식을 최대한 활용하고, 쉽게 데이터를 주고 받기 위하여 설계된 아키텍쳐가 그 유명한 Restful 방식이다.
  • http 통신은 기본적으로 TCP통신을 사용하여, 안정적이고, 신뢰성있는 통신방식이다.
  • non-persistent라 요청/응답에 매 연결을 해야하므로, 오버헤드가 클 수 있다. 따라서 http 1.1버전부터는 keep-alive connection이 도입되어 persistent-connection기능도 제공해준다.

TCP헤더 파헤치기

  1. Source Port: 송신자의 포트번호가 들어간다.
  2. Destination Port: 수신자의 포트번호가 들어간다.
  3. Sequence Number: Squence Number는 TCP 세그먼트의 연속된 데이터 번호이다. 이 필드를 통해 흐름제어를 제공한다.
  4. Acknowledgment Number: ACK Number는 상대방으로 부터 받아야하는 다음 TCP 세그먼트 데이터 번호이다.
  5. Offset: 헤더필드의 길이
  6. Reserved: 예약된 필드를 나타내는데, 현재 사용하지 않는다.
  7. TCP Flags:
  8. Window: 자신의 수신 버퍼 여유용량 크기를 통보하여 얼마만큼의 데이터를 받을 수 있는지 상대방에게 알려주어 흐름제어를 수행하게 되는 필드이다.
  9. Checksum: 비트 오류를 검출하기 위해 체크섬을 사용한다.
  10. Urgent Pointer: 어디서부터 긴급 값인지 알려주는 플래그 (TCP Flags의 U와 세트)

HTTP 버전 파헤치기

1. HTTP/0.9

  • 특징
    요청은 단일 라인으로 구성되며, GET Method만 존재한다.
    HTTP 헤더도 없고 HTML파일만 전송 가능하다.
    응답도 파일 내용 자체로만 구성되어 매우 단순하다.

2. HTTP/1.0

  • 특징
    HTTP 헤더 개념이 도입되었다.
    POST 메소드, PUT, DELETE 메쏘드들을 지원하였지만, 선택적이였다.
    Content-Type 도입으로 HTML 이외의 문서 전송 기능이 가능해졌다.
    버전 정보와 요청 method가 함께 전송되기 시작하였다.
  • 한계
    커넥션 하나당 요청 하나와 응답 하나만 처리 가능했다. -> 매우 비효율적
    즉, non-persistent

3. HTTP/1.1

  • 특징
    Persistent Connection 방식이 도입되었다. 즉, 지정한 timemout 동안 커넥션을 닫지 않는 방법을 통해 커넥션의 사용성이 높아졌다.
    Pipelining 추가되어 앞 요청의 응답을 기다리지 않고 순차적인 여러 요청을 연속적으로 보내고 그 순서에 맞춰 응답을 받는 방식이 등장하였다. 따라서, 순차적으로 하나씩 요청 / 응답이 처리되는 기존 방식을 개선하였다.
    하나의 커넥션에 여러개의 요청이 들어 있을 뿐, 동시에 여러개의 요청을 처리해 응답으로 보내주는 것은 아니다 (multiplexing 되지는 않음)
    현재 제일 많이 쓰이고, 표준버전이다!
  • 한계
    Head Of Line Blocking (HOL): 결국 앞 요청의 응답이 너무 오래걸리면 뒤 요청은 Blocking 되어버린다.
    Header 구조의 중복: 연속된 요청의 헤더의 많은 중복이 발생한다.

4. HTTP/2.0

HTTP 2.0은 기존 HTTP 1.1 버전의 성능 향상에 초점을 맞춘 프로토콜이다.

  • 특징
  1. HTTP 1.1까지는 한번에 하나의 파일만 전송이 가능했다. 비록 파이프라이닝 기술이 있었지만, 여러 파일을 전송할 경우 선행하는 파일의 전송이 늦어지면 HOLB(Head Of Line Blocking)이 발생하였다. 따라서 HTTP 2.0에서는 이 문제를 해결하기 위해 여러 파일을 한번에 병렬로 전송한다.
  2. HTTP 1.1과 HTTP 2.0의 주요한 차이점은 HTTP 메세지가 1.1에서는 text로 전송되었던 것과 달리, 2.0에서는 binary frame로 인코딩되어 전송된다는 점이다
profile
사람들의 더 나은 삶을 위한 개발자

0개의 댓글