HTTP

HTTP는 HTML 문서와 같은 리소스를 가져올 수 있도록 해주는 프로토콜이다.

클라이언트 - 서버 프로토콜

  • 클라이언트는 서버에게 서비스를 요청하는 사용자나 컴퓨터이다.

  • 서버는 서버 프로그램이 실행되고 있는 하드웨어이다.

  • 클라이언트 - 서버 프로토콜은 수신자측에 의해 요청이 초기화되는 프로토콜이다.

응답과 요청

  • 클라이언트와 서버가 개별적인 메시지 교환에 의해 통신한다.

  • 클라이언트에 의해 전송되는 메시지를 요청(request) 이라고 부른다.

  • 서버에서 응답으로 전송되는 메시지를 응답(response)라고 부른다.

HTTP

  • TCP 혹은 암호화된 TCP 연결인 TLS를 통해 전송된다.

  • 확장성으로 인해 POST 하기 위해서도 사용된다.

HTTP 기반 시스템의 구성 요소

  • 각각의 개별적인 요청들은 서버로 보내지며 서버는 요청을 처리하고 response라고 불리는 응답을 제공한다.

  • 요청과 응답 사이에는 게이트웨이 또는 캐시 역할을 하는 프록시등이 있다.
    (cdn등…)

프록시

  • 간단하게 미들웨어의 역할을 하는 컴퓨터로 생각하면 된다.

  • 다음과 같은 기능들을 한다.

    • 캐싱
    • 필터링
    • 로드 밸런싱
    • 인증
    • 로깅

HTTP의 특징

간단하다.

  • 사람이 읽을 수 있으며 간단하다.
  • HTTP 메시지는 사람이 읽고 이해할 수 있다.

확장 가능하다.

  • 헤더를 통해 여러 기능을 확장할 수 있다.

상태가 없고 세션이 있다.

  • stateless로 작동한다. 상태를 유지하지 않기 때문에 클라이언트의 요청이 갑자기 많아져도 안정적이다. 또는 서버증설을 통해 쉽게 해결할 수 있다.

  • 기본적으로 stateless지만 세션이나 쿠키등으로 상태를 유지한다.(로그인이나 인증 등의 로직을 위해)

HTTP와 연결

  • 기본적으로 TCP/IP는 한 번 요청하고 응답을 보내고 나서는 연결을 끊는다.

  • 이러한 비효율성을 해결하기위해 HTTP/1.1은 파이프라이닝 개념을 통해 지속적인 연결 개념을 도입했다.(Connection 헤더를 사용해 부분적으로 제어 가능하다.)

  • HTTP/2는 단일 연결상에서 메시지를 다중 전송할 수 있도록 하였다.

HTTP로 제어할 수 있는 것

캐시

  • 헤더를 통해 문서가 캐시되는 방식을 제어할 수 있다.

origin

  • cors에서 많이 고통받던 그 녀석이다.
  • 동일한 origin으로 부터 온 페이지만이 정보에 접근할 수 있지만 헤더 설정을 통해 완화할 수 있다.

인증

  • 헤더나 쿠키를 통해 제어할 수 있다.

프록시와 터널링

  • 프록시를 제어할 수 있다.

세션

  • 서버 상태를 요청과 연결하도록 한다.
  • stateless인 프로토콜임에도 state를 유지하며 동작할 수 있다.

HTTP 흐름

HTTP를 통해 클라이언트가 서버와 통신할 때 다음과 같은 과정을 거친다.

  1. TCP 연결을 연다. 요청을 보내거나 응답을 받는데에 사용된다.
  2. HTTP 메시지를 전송한다.
  3. 서버에 의해 전송된 응답을 읽어들인다.
  4. 연결을 닫거나 다른 요청들을 위해 재사용한다.

HTTP 메시지

HTTP 메시지의 요청과 응답은 각자의 형식을 가지고 있다.

요청

요청은 다음과 같은 요소들로 구성된다

HTTP 메서드

클라이언트가 수행하고자 하는 동작이나 options와 head와 같은 명사이다.

가져오려는 리소스의 경로

프로토콜(http),도메인, tcp포트(http의 경우 80 포트)를 제거한 리소스의 URL이다.

그 외
  • HTTP 프로토콜의 버전
  • 여러 헤더
  • 메서드를 위한 전송된 리소스를 포함하는 본문(request.body)

응답

  • HTTP 프로토콜의 버전
  • 요청의 성공 여부와 상태 코드
  • 상태코드의 설명을 나타내는 메시지(response 안에 담아서 보낸다.)
  • HTTP 헤더들.
  • 가져온 리소스가 포함되는 본문.

주로 request의 본문과 메시지를 같이 보내는 것이 좋은 것 같다.
추가로 error code나 메시지를 객체로 정의하여 보내는 경우도 있다.

그 외

주로 데이터를 json으로 주고받게 되는데 다음과 같은 함수들이 있다.

JSON.parse()

  • 문자열을 JSON으로 구문 분석한다.

JSON.stringify()

  • JSON 문자열을 반환한다.

추가

  • JSON.stringify()후 JSON.parse()를 통해 깊은 복사를 할 수 있다.

ref

HTTP overview

클라이언트 서버 통신

HTTP 메시지 구조

댓글