HTTP 헤더1 - 일반 헤더

yiwoojung·2023년 9월 1일
0

개요

  • http message : start line ⇒ header ⇒ 공백 ⇒ body
  • header-field = field-name:(공백)field-value
  • 대소문자 구분 없음

용도

  • http 전송에 필요한 모든 부가정보를 헤더에 넣는다
    • 메세지 바디 내용, 메시지 바디 크기, 압축, 인증, 요청 클라이언트, 서버정보, 새키 정보 등..
  • 표준 헤더가 굉장히 많음
  • 필요 시 임의의 헤더 추가 가능

분류

과거 1999년 RFC2616

http header

  • general - 메시지 전체에 적용되는 정보
  • request - 요청을 보낼 때
  • response - 응답 정보, 웹브라우저 정보 뭔지, 서버 정보가 뭔지
  • entity - 엔티티 바디 정보
    • text/html

http body

  • 메시지 본문은 엔티티 본문을 전달하는데 사용된다
  • 엔티티 본문은 요청이나 응답에서 실제 전달할 데이터
  • 엔티티 헤더는 엔티티 본문의 데이터를 해석할 수 있는 정보 제공
    • 데이터 유형, 데이터 길이, 어떤걸로 압축되어 있는지 등..

엔티티와 관련없는 헤더도 있다

최신 RFC723x (개정 후)

  • 엔티티(Entity) → 표현(Representation)
  • 표현 = 표현 메타데이터 + 표현 데이터
  • 메시지 본문을 통해 표현 데이터 전달
  • 메시지 본문 = 페이로드
  • 표현은 요청이나 응답에서 전달할 실제 데이터
  • 표현 헤더는 표현 데이터를 해석할 수 있는 정보를 제공한다
    • 데이터 유형, 길이, 압축 정보 등
  • 표현 헤더는 표현 메타데이터와 페이로드 메시지를 구분해야 한다

표현

표현 리소스를 html으로 전달할거야 / json으로 전달할거야 이거를 json, xml등으로 표현한다

  • 표현헤더는 전송, 응답 둘 다 사용한다
  • content-type: 표현 데이터의 형식
  • content-encoding: 표현 데이터의 압축방식
  • content-language: 자연언어
  • content-length: 데이터의 길이

Content-Type

  • 표현 데이터의 형식
  • 바디에 들어가는 내용이 뭐야?
  • 예시
    • text/html; charset=utf-8

    • application/json

    • image/png


Content-Encoding

  • 표현데이터를 주로 압축할 때 사용
  • 서버에서 압축했으면 클라이언트에서는 읽을 때 인코딩 헤더의 정보로 압축 해제
  • 예시
    • gzip
    • deflate
    • identity
      • 압축안함


Content-Language

  • 표현 데이터의 자연 언어를 표현
    • ko
    • en
    • en-US

Content-Length

  • 표현 데이터의 길이
  • 바이트 단위
  • transfer-encoding(전송코딩, 끊어서 보냄)을 사용하면 안에 내용이 다 들어가 있기 때문에 content-length를 사용하면 안됨

협상(콘텐트 네고시에이션)

  • 클라이언트가 선호하는 표현 요청
  • 클라이언트가 원하는 표현으로 서버한테 요청하는 것
  • 서버: 그래 니가 원하는 대로 만들어줄게
  • 협상 헤더는 요청시에만 사용
  • Accept: 클라이언트가 선호하는 미디어 타입
  • Accept-Charset: 선호하는 문자 인코딩
  • Accept-Encoding: 선호하는 압축 인코딩
  • Accept-Language: 선호하는 자연언어

Accept-Language

  • 클라이언트가 선호하는 자연언어

예시1

  • 클라이언트 :
    • 내가 선호하는 언어는 ko야
    • accept-language: ko
  • 서버:
    • content-language: ko

예시2

  • 한국어 브라우저
    • accept-language: ko
  • 다중 언어 지원 서버
    • 기본 독일어, 영어도 지원
    • content-language: de
    • 독일어 보내버림!!
  • 이때 필요한 것이 협상과 우선순위다

협상과 우선순위1

Quality Values(q)

  • quality values(q)값 사용
  • 0~1, 생략하면 1
  • 클수록 높은 우선순위
  • 예시
    • Accept-Language: ko-KR, ko;q=0.9;en-US;q=0.8;en;q=0.7
      1. ko-KR
      2. ko
      3. en-US
      4. en

협상과 우선순위2

  • 구체적인 것이 우선
  • Accept: text/, text/plain, text/plain;format=flowed, /*
    1. text/plain;format=flowed
    2. text/plain
    3. text/*
    4. */*

협상과 우선순위3

  • 구체적인 것을 기준으로 미디어 타입을 맞춘다
  • 매칭 되는 것이 없다면 남은 것을 매칭한다
  • Accept: text/;q=0.3, text/html;q=0.7, text/html;level=1, text/html;level=2;q=0.4, /*;q=0.5
    1. text/html;level=1 `1`
    2. text/html, text/html;level=3 `0.7`
    3. image/jpeg `0.5`
    4. text/html;level=2 `0.4`
    5. text/plain `0.3`

전송 방식

단순 전송

  • 예시
    • content-length: 3423
  • 전송하면 길이를 주는거다
  • 단순하게 요청하고 쭉 받는거

압축 전송

  • 예시
    • content-encoding: gzip
    • content-length: 521
  • 서버에서 데이터를 압축을 해서 보낸다.
  • 용량이 굉장히 줄어든다.
  • 뭘로 압축되어 있는지 같이 보내줘야 한다.

분할 전송

  • 예시
    • transfer-encoding: **chunked**
  • 용량이 큰걸 한번에 보내면 기다려야하는데 분할해서 전송하면 오는대로 바로 표시 할 수 있다
  • content-length를 넣으면 안된다
    • 어차피 처음에 총 길이가 예상이 안된다

    • 분할해서 보내면 chunk 마다 바이트 길이가 있어서


범위 전송

  • Range, Content-Range
  • 이미지를 받는데 중간에 절반을 받다가 끊겼을 때 처음부터 다시 요청하면 용량이 아까우므로 범위를 지정해서 요청하는 방식
  • 예시
    • content-range: bytes 1001-2000 / 2000


일반 정보

http의 정보성 헤더들

From

  • 유저 에이전트의 이메일 정보
  • 검색 엔진 같은 곳에서 주로 사용
  • 요청에서 사용

Referer

  • 현재 요청된 페이지의 이전 웹 페이지 주소
  • a ⇒ b로 이동할 때 referer: a를 포함해서 요청
  • 유입 경로 분석할 때 사용
  • 요청에서 사용

User-Agent

  • 클라이언트 애플리케이션 정보(웹 브라우저 정보 등등)
  • 어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능
  • 통계 정보에서 사용
  • 요청에서 사용

Server

  • 요청을 처리하는 origin 서버의 소프트웨어 정보
    • 여러 프록시 서버를 거치게 되는데 나의 요청을 실제로 처리해주는 마지막 서버를 말한다
  • 응답에서 사용

Date

  • 메시지가 발생한 날짜와 시간
  • 응답에서 사용


특별한 정보

특별한 정보를 제공하는 header들

Host

  • 하나의 IP 주소에 여러 도메인이 적용되어 있을 때 구분을 해준다
    • 가상 호스트를 통해 여러 도메인을 한번에 처리할 수 있는 서버
    • 만약 호스트가 없다면 서버 입장에서는 GET/hello 가 어느 도메인으로 들어가야 하는지 알 수 없다(구분할 수 있는 방법이 없다) = 가상 호스팅
    • 그래서 host header 필드를 필수로 넣어주어야 한다
  • 요청한 호스트 정보 (도메인)
  • 필수값
  • 요청에서 사용
  • 하나의 IP 주소에 여러 도메인이 적용되어 있을 때
    • 요청이 왔을 때 어떤 도메인에 연결되어 있는지 확인해야 함

Location

  • 웹 브라우저는 3xx 응답의 결과에 location 헤더가 있으면 location 위치로 자동 이동한다(리다이렉트)
  • 201(created)
    • location 값은 요청에 의해 생성된 리소스 uri
  • 3xx
    • location 값은 요청을 자동으로 리다이렉션 하기 위한 대상 리소스를 가리킴

Allow

  • 허용가능한 http 메서드
  • 405(Method Not Allowed) 오류를 내리면서 응답에 포함해야 함

Retry-After

  • 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간
  • 503
    • 서비스가 언제까지 불능인지 알려줄 수 있음
  • 날짜를 표시할 수도 있고 초 단위로 표시할 수도 있다

인증

Authorization

  • 클라이언트의 인증정보를 서버에 전달 가능
  • 인증 방법마다 value 값이 다 다르다

WWW-Authenticate

  • 접근을 했는데 인증이 안됐을 때
  • 리소스 접근시 필요한 인증 방법을 정의할 때 사용
  • 401 unauthorized 응답과 함께 사용
  • 401이 나면 이 헤더와 함께 보내줘야 한다

Reference.

profile
프론트엔드 개발자

0개의 댓글