✏️ HTTP Header의 협상과 전송 방식

2026. 7. 19. 00:59·Backend/HTTP·Web

이 글은 Velog에서 이전한 글입니다. Velog 원문 보기

⭐️ 협상(Content-Negotiation)

Content-Negotiation?
클라이언트와 서버가 있다고 하자. 클라이언트가 원하는 표현으로 달라고 서버한테 요청을 한다. 그렇다면** 서버는 클라이언트가 원하는 우선순위에 맞춰서 표현 데이터를 만들어 준다.**

클라이언트가 선호하는 표현 요청

  • Accept: 클라이언트가 선호하는 미디어 타입 전달
  • Accept-Charset: 클라이언트가 선호하는 문자 인코딩
  • Accept-Encoding: 클라이언트가 선호하는 압축 인코딩
  • Accept-Language: 클라이언트가 선호하는 자연 언어
  • 협상 헤더는 요청시에만 사용

📌 Accept-Language 적용 전

예를 들어서 내가 한국어 브라우저를 사용한다고 하자. 그리고 외국에 있는 /event라는 사이트에 접속한다. 이 사이트는 다중 언어를 지원하는 서버인데 우선순위가 기본으로는 영어를 지원하고 한국어 또한 지원한다.
그런데 클라이언트가 보낸 요청 메시지에는 클라이언트가 원하는 언어가 한국어인지 나타나 있지가 않다. 그렇기 때문에 서버는 클라이언트에게 기본 언어인 영어로 지원한다.

📌 Accept-Language 적용 후

클라이언트에서 서버에 요청을 할 때 Accept-Language: ko를 요청 메시지에 포함한다. 서버는 한국어를 지원하고 클라이언트가 한국어를 원한다는 것을 알기 때문에 기본 언어는 영어이지만 콘텐츠 네고시에이션에 따라서 서버는 클라이언트에게 한국어로 지원한다.

✔︎ 복잡한 예시


그렇다면 클라이언트가 한국어를 요청했지만 서버의 기본 언어가 독일어이고, 한국어를 지원하지 않는다면?
대부분의 경우 독일어보다는 영어가 익숙하기 때문에 그나마 익숙한 영어로 지원해주기를 바랄 것이다. 이런 경우 때문에 우선순위가 필요한 것이다.

📌 협상과 우선순위1


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;q=1 (q생략)
        1. ko;q=0.9
        1. en-US;q=0.8
        1. en;q=0.7

Google에 hello를 검색한 결과

      1.  

📌 협상과 우선순위2

📌 협상과 우선순위3

표의 text/plain은 Accept에서 정확히 매칭되는 것이 없기 때문에 text/*에 속한다. 따라서 Quality가 0.3이다.

⭐️ 전송 방식

  • 단순 전송
  • 압축 전송
  • 분할 전송
  • 범위 전송

📌 단순 전송 - Content-Length

클라이언트가 서버에 요청을 하면 서버는 요청에 따라서 응답을 주는데 Content-Length를 포함해서 응답 데이터의 길이를 알 수 있게 해준다.

📌 압축 전송 - Content-Encoding


서버에서 응답을 보낼 때 메시지 바디 부분을 압축해서 보내준다. 이때 Content-Encoding이라는 것이 있어야 한다.

📌 분할 전송 - Transfer-Encoding

Transfer-Encoding: chunked는 데이터를 쪼개서 보낸다는 뜻이다. 즉, 데이터를 분할해서 전송하는 것이다.

📌 범위 전송 - Range, Content-Range

Content-Range를 이용해서 데이터의 범위를 지정해서 요청이 가능하다.


출처
모든 개발자를 위한 HTTP 웹 기본 강의

해당 게시물의 사진 자료는 위 강의의 자료를 사용하였습니다.

'Backend > HTTP·Web' 카테고리의 다른 글

✏️ 쿠키  (0) 2026.07.20
✏️ HTTP Header의 정보  (0) 2026.07.19
✏️ HTTP 헤더1 - 일반 헤더  (0) 2026.07.19
✏️ HTTP 상태코드  (0) 2026.07.19
✏️ HTTP 메서드 활용  (0) 2026.07.19
'Backend/HTTP·Web' 카테고리의 다른 글
  • ✏️ 쿠키
  • ✏️ HTTP Header의 정보
  • ✏️ HTTP 헤더1 - 일반 헤더
  • ✏️ HTTP 상태코드
pp8817
pp8817
공부한 내용, 개발 관련 지식, 트러블 슈팅 등을 기록합니다. 이전 블로그: https://velog.io/@pp8817/posts
  • pp8817
    끄적이는 개발 log
    pp8817
  • 전체
    오늘
    어제
    • 분류 전체보기 (273)
      • Project (71)
        • 척척학사 (29)
        • Book (23)
        • Saynow (3)
        • YAPP 27기 (4)
        • 나의 작은 프로젝트 (10)
        • Landit (2)
      • Backend (88)
        • Spring (13)
        • Spring MVC (13)
        • Spring Security (4)
        • JPA (26)
        • Database (19)
        • HTTP·Web (13)
        • Architecture (0)
      • Language·CS (59)
        • Java·Kotlin (5)
        • CS Interview (17)
        • Backend Interview (5)
        • Concepts (32)
      • Algorithm (25)
        • Algorithm (24)
        • 소마 알고리즘 스터디 (1)
      • Infra (8)
      • Troubleshooting (11)
      • Retrospective (6)
      • Etc (5)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    HTTP WEB 기본 지식
    나의 작은 프로젝트
    http
    Spring MVC
    트러블슈팅
    Python
    object
    BOJ
    java
    interview
    척척학사
    Algorithm
    CS Interview
    게시판
    Spring
    jpa
    Project
    개념 정리!
    Book
    OS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
pp8817
✏️ HTTP Header의 협상과 전송 방식
상단으로

티스토리툴바