인프런 강의 모든 개발자를 위한 HTTP 웹 기본 지식 수강내용 정리


HTTP

HTTP 는 HyperText Transfer Protocol 으로 HTML, TEXT 를 전송하기 위해서 만들어졌으나 현재는 이미지, 영상, 음성, JSON 등 거의 모든 형태의 데이터를 HTTP 메세지를 통해 전송한다.


HTTP 역사

  • HTTP/0.9 1991년 GET 메서드만 지원, HTTP 헤더X

  • HTTP/1.0 1996년 메서드, 헤더 추가

  • HTTP/1.1 1997년 가장 많이 사용

  • HTTP/2 2015년 성능 개선

  • HTTP/3 진행중 TCP 대신 UDP 사용해서 성능 개선


클라이언트/서버

HTTP 는 request, response 구조로 분리되어 클라이언트에서 요청을 보내고, 서버는 요청을 기다렸다가 요청에 대한 결과를 만들어서 응답한다.

이렇게 분리가 되면 클라이언트에서는 UI와 사용성에 집중하게 되고 서버는 비즈니스 로직과 데이터 처리에 집중해서, 각각 독립적으로 발전할 수 있다.


무상태

HTTP 는 무상태 프로토콜(Stateless)을 지향한다.

상태를 유지한다는 것은 서버에서 클라이언트로부터 보낸 요청이 기억되고 있는 것을 의미한다.

하지만 이렇게 되면 상태를 기억하는 서버 외에는 요청받는 서버를 변경할 수 없고 클라이언트의 요청이 증가하면 기억하는 서버에 부담이 될 수 있다.


무상태 프로토콜은 클라이언트에서 보낸 요청에 응답을 보낸 후에는 요청상태를 기억하지 않는 방식이다.

상태를 보존하지 않기 때문에 클라이언트에서 새로운 요청을 보내기 위해서는 요청에 대한 데이터를 모두 정리해서 한번에 보내야 한다.

요청사항을 기억하지 않아도 되기 때문에 서버에 부담이 적고, 한번의 메세지에 요청사항에 대한 정보가 모두 담겨있기 때문에 어떤 서버가 요청을 받아도 처리할 수 있게 되므로 서버의 확장성에 용이하다.

하지만 한번 데이터를 응답하고 끝나는 페이지가 아닌 로그인 상태에 따라 응답을 주어야 하는 경우 상태 유지가 필요하므로, 이렇게 꼭 필요한 경우에만 브라우저 쿠키와 서버 세션등을 사용해서 상태를 유지하도록 한다.


비연결성

TCP/IP 는 기본적으로 연결 후 요청/응답이 처리가 되어도 연결이 끊어지지 않고 유지된다.

연결이 계속 유지가 되므로 서버의 자원이 소모된다.

따라서 HTTP 는 TCP/IP 연결 후 요청/응답이 처리가 완료되면 연결을 끊어서 서버에서 최소한의 자원만을 사용하도록 한다.


하지만 연결이 바로 끊어지면, 매 연결마다 3 way handshake 로 가상연결을 해야하므로 해당 작업 때문에 연결시간이 길어진다.

게다가 웹 브라우저로 사이트를 요청하면 HTML 뿐 아니라 javascript, 이미지 등 많은 자원을 요청해야 하므로 매번 새로 연결하면 시간이 더욱 길어지게 된다.

따라서 HTTP 지속 연결을 통해 해당 페이지의 모든 자원을 받아온 후 연결을 끊도록 한다.

HTTP2 와 3에서는 1.1에 비해 이 부분의 성능이 개선되었다.


HTTP 메세지

HTTP 메세지는 start-line, header, empty line, message body 의 구조로 되어있다.

  • start-line
    요청 메세지와 응답메세지의 형식이 다르다.
    – 요청 메세지 : method(요청 메서드 GET, POST 등) request-target(절대경로) HTTP-version
    – 응답 메세지 : HTTP-version status-code(상태 코드 200, 400 등) reason-phrase(상태 코드 설명)

  • header
    field-name: field-value 로 구성되어 HTTP 전송에 필요한 모든 부가정보를 포함한다.
    body 내용의 타입, 크기, 압축, 인증, 클라이언트(브라우저)정보, 서버 어플리케이션, 캐시 관리 정보 등 모든 정보를 포함할 수 있다.
    헤더정보는 임의로 추가할 수도 추가할 수 있다.

  • empty line
    body 위 공백라인 하나가 필수로 들어가야 한다.

  • body
    실제 전송할 데이터가 위치한다.
    byte 로 표현할 수 있는 HTML, 이미지, JSON 등 모든 데이터를 전송할 수 있다.