Post

[HTTP] HTTP 기본 지식

HTTP

대부분 데이터를(텍스트, 음성, 영상, 이미지, 서버간 데이터를 주고받을 때 등) HTTP 메시지를 이용해 전송한다.

자세히 알고싶다면 HTTP 1.1 : RFC7230~7325(2014) 스펙을 참고하자.

특징

  • 클라이언트 서버 구조
  • 무상태 프로토콜(스테이스리스), 비연결성
  • HTTP 메시지
  • 단순함, 확장가능

프로토콜

TCP : HTTP/1.1, HTTP/2

UDP : HTTP/3

클라이언트 서버 구조

Request Response 구조

  1. 클라이언트가 서버에 요청을 보내고, 응답을 대기
  2. 서버가 요청에 대한 결과를 만들어서 응답

이미지

관심사 분리

  • 클라이언트 : ui, ux 그리는데 집중
  • 서버 : 비즈니스 로직 처리

무상태 프로토콜

스테이스리스(Stateless)

스테이트풀(Stateful) : 서버가 클라이언트 상태를 보존 -> 서버가 변경되면 클라이언트 상태를 보존한 의미가없어진다.(아니면 변경된 서버에게 보존된 클라이언트 정보를 넘겨줘야한다)

스테이스리스(Stateless) : 서버가 클라이언트 상태를 보존하지 않음. 상태를 보존하지 않아도 되게 설계를 해야한다. 클라이언트가 요청시에 필요한 정보를 다 담아서 요청한다. -> 갑작스러운 클라이언트의 대량요청도 그냥 대량 서버를 투입시켜 해결이 가능하다.

Stateless 한계

모든 것을 무상태로 설계 할 수 없다. (ex : 로그인) 일반적으로 브라우저 쿠키와 서버세션 등을 이용해 상태유지

그리고 정보를 저장하지 않기 때문에 데이터를 보낼때 더 보내야한다.

비연결성

클라이언트와 서버의 연결을 계속 유지하지않는다(서버 자원을 많이 사용하게된다.) 하지만 연결이 필요없을 때 연결을 끊으면 자원을 필요할때만 사용할 수 있다.

비연결성 한계와 극복

TCP/IP 연결은 3 way handshake 를 해야되므로 시간이 걸린다.

웹브라우저로 사이트 요청시 HTML 뿐만 아니라 자바스크립트, css, 이미지등도 다운해야하는데 이것도 하나 하나 연결 재연결 하다보면 비효율적이다.

지금은 HTTP 지속연결(Persistent Connection) 을 이용해 해결, HTTP/2 HTTP/3 에서 많이 발전했다.

HTTP 지속연결 : 필요한것을 다 다운할 때까지 연결을 종료하지 않는다.

이미지

서버 개발자의 고통

같은 시간에 딱 맞추어 발생하는 대용량 트래픽(티켓팅, 수강신청 등) 의 경우 스테이트풀일 경우 서버가 한정되어있어 대응하기 어렵다(서버 증설에 많은 노력이 필요하다)

그래서 최대한 스테이스리스하게 설계해야한다. 스테리트풀이어야 되는 문제도 잘 분리해서 최대한 스테이스리스하게 설계해야 한다. 스테이스리스 하면 서버 증설은 매우 간단하기 때문이다.

HTTP 메세지

HTTP 는 요청메세지와 응답메세지 구조의 틀자체는 비슷하지만 start-line 이 다르다. 요청메시지는 request-line, 응답메시지는 status-line 이다.

이미지

CRLF 는 공백라인으로, 요청메시지든 응답메세지든 필수로 존재한다. 요청메세지에는 message body 가 없지만 그렇다고해서 CRLF 가 없는건 아니므로 보낼 때 주의하자.

HTTP 요청 메시지 구조

start-line(request-line), Http header, CRLF 로 구성되어 있다.

이미지

start-line(request-line)

 start-line(request-line)HTTP 메소드요청대상HTTP 버전
문법method SP(공백) request-target SP HTTP-version CRLF(엔터)methodrequest-targetHTTP-version
원문GET /search?q=hello&hl=ko HTTP/1.1GETsearch?q=hello&hl=koHTTP/1.1

HTTP 메소드 : GEP, POST, PUT, DELETE

요청 대상 : 보통 절대경로를 사용한다. “/” 로 시작한다.

HTTP header

 Headerfield-namefield-value 상태코드
문법field-name “:” OWS field-value OWS (OWS : 띄워쓰기허용)field-namefield-value
원문Host: www.google.comHostwww.google.com

field-name 은 대소문자 구분하지 않는다.

HTTP 응답 메시지 구조

start-line(status-line), Http header, CRLF, Http body 로 구성되어 있다.

이미지

start-line(status-line)

 start-line(status-line)HTTP 버전HTTP 상태코드이유 문구
문법HTTP-version SP status-code SP reason-phrase CRLFHTTP-versionstatus-codereason-phrase
원문HTTP/1.1 200 OKHTTP/1.1200OK

HTTP 상태 코드

  • 200 : 성공
  • 400 : 클라이언트 요청 오류
  • 500 : 서버 내부 오류

이유 문구 : 사람이 이해하도록 상태코드에 대한 짧은 글

HTTP header

1
2
Content-Type: text/html;charset=UTF-8
Content-Length: 3423

HTTP 전송에 필요한 모든 부가정보가 있다.(ex 압축/인증/캐시관리정보/메시지바디내용 등)

표준 헤더필드가 매우많다. 임의의 헤더도 만들 수 있지만 그에따른 클라이언트와 서버 설계가 필요해서 잘 안만든다.

HTTP body

실제 전송할 데이터, byte 로 표현할 수 있는 모든 데이터 전송 가능하다.(이미지, 동영상 등)

Reference

https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/dashboard

This post is licensed under CC BY 4.0 by the author.