[HTTP] HTTP 헤더 ( 표현헤더, 협상헤더,전송 방식)

미밈·2023년 3월 23일
post-thumbnail

HTTP 헤더

  • header-field = field-name ":" OWS field-value OWS

    • (OWS: 띄워쓰기 허용)
    • field-name = 대소문자 구분 X
    • 예시 )
      Content-Type(field-name): text/html;charset=UTF-8 (field-value)
  • 용도
    전송에 필요한 모든 부가정보 👌
    최신 http 표준 : RFC7230~7235


표현(Representation)

엔티티->표현(Representation)

표현 = 표현 메타데이터 + 표현 데이터

요청이나 응답에서 전달할 실제 데이터


표현 헤더

  • 표현 데이터를 해석할 수 있는 정보 제공
  • 전송, 응답 둘다 사용
    예시 ) 데이터 유형(html, json), 데이터 길이, 압축 정보

👉 Content-Type: 표현 데이터의 형식

Content-Type: text/html; charset=utf-8
Content-Type: application/json

content-body에 들어가는 내용 -> (미디어 타입, 문자 인코딩)

👉 Content-Encoding: 표현 데이터의 압축 방식

표현 데이터를 압축할 때 사용 (gzip, deflate, identity)
데이터 전달하는 곳에서 압축 후 인코딩 헤더 추가
=> 클라이언트가 뭐로 압축되어 있는지 알아야 압축을 풀어서 확인 가능
실제로 헤더가 압축을 하는게 아니고 그냥 압축 형식만 알려줌

Content-Encoding: gzip

👉 Content-Language: 표현 데이터의 자연 언어(ko, en, en-US)

큰 공식사이트에 들어가면 기본이 영어
-> 클라이언트에서 언어를 바꾸는 부가작업시 사용

Content-Language: ko

👉 Content-Length: 표현 데이터의 길이 (바이트단위)

  • Transfer-Encodiing(전송 코딩)사용시 Content-Length 사용 X
    (내부적으로 정보가 포함되어있어서)
Content-Length: 3423

협상 헤더(Content Negotiation)

  • 클라이언트가 선호하는 표현 요청 ( 요청시에만 사용 )
    Server🗨️ : 원하는대로 표현 데이터를 만들어 줄게!
• Accept: 클라이언트가 선호하는 미디어 타입 전달
• Accept-Charset: 클라이언트가 선호하는 문자 인코딩
• Accept-Encoding: 클라이언트가 선호하는 압축 인코딩
• Accept-Language: 클라이언트가 선호하는 자연 언어

⬇️필요 적용 예시
Accept Language적용 전
📌 상황 1
한국 브라우저( GET /event ) → 다중 언어 지원 서버(우선순위 : en,ko)

GET요청시 들어온 정보 ❌ = 서버는 우선순위 언어 en을 기반 데이터를 전달

📌 상황 2
한국 브라우저( GET /event Accept-Language:ko )
→ 다중 언어 지원 서버(우선순위 : en,ko)

들어온 정보 ⭕ = 서버는 내장하고 있는 ko를 지원

📌 상황 3✨
한국 브라우저( GET /event Accept-Language:ko )
→ 다중 언어 지원 서버(우선순위 : de, en)(독일어, 영어)

→→ ❗복잡한 상황 발생❗

👉 우선순위로 해결

나는 가급적 한국어가 좋은데 안되면 영어를 줘 → 우선순위 필요

  • Quality Values(q)를 사용
    0~1, 클수록 높은 우선순위
    생략시 1
  • 언어; q=?
GET /event
Accept-Language:ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
----------------------------------------------------
▪️ ko-KR,(q=1) q 생략
▪️ ko;q=0.9 
▪️ en-US;q=0.8
▪️ en;q=0.7
  • 구체적인것이 우선
    더 디테일하게 설명되어있는것이 가장 우선
    구체적인 것을 기준으로 미디어 타입 맞춤

전송방식

  • 단순 / 압축 / 분할 / 범위

  • 단순 : 요청하면 응답 줌 ( Content-Length를 알 때 )

  • 압축 : 서버에서 데이터를 압축해서 전송 ( Content-Encoding 추가 기재 )

  • 분할 : Transfer-Encoding : chunked
    서버가 분할해서 전송 (용량이 큰 경우 분할해 전송하면 오는대로 표현가능)
    -> Content-Length는 표현 X : 분할해서 보내기때문에 예상이 안됨

  • 범위 : Range
    예) 이미지 받는데 중간까지 받았는데 다시 받아야할 때 범위 지정해서 재요청 가능 => Range : bytes = 1001-2000

profile
하나씩 차근차근 해보는 초초초급개발자

0개의 댓글