[우아한테크코스] 8월 31일 TIL

2 minute read

HTTP

HTTP 메시지

  1. 메시지 유형

    HTTP-message		= Request|Response		:HTTP/1.1 messages
                    *message-header
                    CRLF
                    [ message-body ]
    

    헤더 필드의 끝을 표시하는 빈 라인 (CRLF: \r\n) 이나 message body로 구성

  2. 메시지 헤더

    해더 필드는 field-name: field-value CRLF 으로 구성

  3. 메시지 본문

    요구나 응답과 관련된 Entity-Body wjsthddp tkdyd

    message body의 존재는 Message-Header에 Content-Length나 Transfer-Encoding 헤더 필드를 포함으로써 알 수 있다.

  4. 메시지 길이

    메시지바디가 없는 응답 메시지는 헤더 필드의 존재 유무에 상관없이 헤더 필드 다음의 첫 빈 라인으로 항상 종료

    Transfer-Encoding을 포함해 엔티티를 수신하는 모든 HTTP/1.1 애플리케이션은 반드시 chunked 전송을 허용해서 메시지의 길이를 미리 결정할 수 없을 때 사용될 수 있도록 해야한다.

    Content-Length 헤더 필드 값이 메시지바디의 길이를 의미

    multipart/byteranges가 있다면 이것이 길이

    chunked와 Content-Length 공존 불가능

  5. 일반 헤더 필드

    요청과 응답 메시지 모두에 적용할 수 있지만 전송되는 엔티티에는 적용되지 않는 헤더필드

    Cache-Control, Connection, Date, Pragma, Transfer-Encoding, Upgrade, Via

Request

형식

Request-Line
general-Header, request-header, Entity-Header
CRLF
message-body
  1. Request-Line

    Method SP Request-URI SP HTTP-Version CRLF

    • Method: OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE
    • Request-URI: *, absoluteURI, abs_path
  2. Request Header Field

    Accept, Accept-Charset, Accept-Encoding, Accept-Language, Authorization, From, Host, If-Modified-Since, If-Match, If-None-Match, If-Range, If-Unmodified-Since, Max-Forwards, Proxy-Authorization, Range, Referer, User-Agent

Response

형식

Status-Line
general-Header, request-header, Entity-Header
CRLF
message-body
  1. Status-Line

    Http-Version SP Status-Code SP Reason-Phrase CRLF

    Reason-Phrase는 상태 코드에 대해 짧은 텍스트 형태의 설명 제공(오토마타가 상태 코드 사용, 사람이 문구 사용)

    • Status-Code
      • 1xx: 알림 정보
      • 2xx: 성공
      • 3xx: 방향 재설정
      • 4xx: 클라이언트 오류
      • 5xx: 서버 오류
  2. Response header Field

    status-line에 표시할 수 없는 응답에 대한 추가 정보 전달

    Age, Location, Proxy-Authenticate, Public, Retry-After, Server, Vary, Warning, WWW-Authenticate

http 활용하기

다운로드하는 데이터 양이 늘어나면서 최대한 빠른 시간 안에 요청과 응답을 가져와야 한다.

http 서버에서 개선할 수 있는 내용

  • 불필요한 다운로드 제거

    리소스를 전송하지 않는게 제일 빠르다. 전송할 필요가 없는 리소스는 제거하도록 한다.

    자바스크립트의 코드 분할을 이용해 사용자에게 필요한 부분만 전송한다.

    css, js를 하나로 압축해 배포한다.

    css, svg 사용, 이미지 합치기

  • 리소스 최적화 및 압축

    Html, js, css 리소스 최적화

    • GZIP을 적용해 나머지 텍스트 리소스 압축\

      GZIP은 모든 바이트 스트림에 적용할 수 있는 범용 압축 프로그램으로 서버에서 압축을 활성화하면 리소스를 줄일 수 있다.

      server.compression.enabled=true

  • http 캐싱

    캐싱이란 응답 리소스의 복사본을 재사용하는 것으로 GET 응답만 캐싱하는 것이 일반적이다.

    캐싱 키는 GET 요청과 URI다.

    • HTTP 캐시 기본 헤더

      • Cache-Control

        • :public

          브라우저 외에도 중간 프록시도 캐시 허용

        • :private

          브라우저만 캐시 허용. 중간 프록시, CDN은 캐시 불가

        • :public, max-age=31536000

          초 단위로 캐시하는 시간 범위 설정, 1년

      • Expires

        지정한 만료 날짜까지만 캐시 허용

        이후부터는 브라우저가 새로운 복사본 허용

    • 조건부 요청

      브라우저가 서버에 업데이트된 리소스가 있는지 요청을 보내고 없으면 304와 빈 응답 본문 생성

      • Time-Based

        Last-modified로 조건 활성화할 수 있음, If-Modified-Since

      • Content-Based

        ETag로 조건 활성화, If-None-Match