본문 바로가기
cs/컴퓨터 네트워크

HTTP 헤더

by 장인이 2023. 1. 13.

0. 개요

 이번 게시물에서는 HTTP 헤더 대해 작성할 것이다. 해당 게시물을 보기 전, 아래 링크의 글을 보고 오는 것을 추천한다.

(HTTP란?)

 

 

1. HTTP 헤더

 HTTP 헤더HTTP 전송에 필요한 부가정보를 저장하는 곳이다. 메시지 바디의 내용 및 크기, 압축, 인증, 요청 클라이언트 정보 등등.. 수많은 표준 헤더가 존재한다. 이 게시물에서는 주로 사용하는 HTTP 헤더들에 대해 적어볼 예정이다.

 

 우선 모든 HTTP 헤더의 양식은 아래와 같다.

 

field-name ":" OWS field-value OWS (OWS는 띄어쓰기 허용이라는 뜻)

+ field-name은 대소문자를 구분하지 않는다.

 

 

2. 표현(Representation)

 HTTP표준이 RFC7230~7235로 변함에 따라, 기존에 엔티티(Entity)라는 개념 대신 표현(Representation)이라는 개념이 들어왔다. (두 개념이 정확히 일대일로 대응되는 것은 아님)

 표현은 요청이나 응답에서 전달할 실제 데이터이다. 표현은 표현 헤더표현 데이터로 구분할 수 있으며, 표현 헤더는 표현 데이터를 해석할 수 있는 정보를 제공해준다.

- 데이터 유형(html, json), 데이터 길이, 압축 정보 등등...

 

 표현 헤더 요청, 응답 모두 같은 헤더를 사용한다. 그 종류들은 다음과 같다.

 

1) Content-Type

 표현 데이터의 형식을 설명한다. 미디어 타입, 문자 인코딩 정보를 알려준다.

ex) application/json (기본이 utf-8), image/png

 

2) Content-Encoding

 표현 데이터 인코딩 헤더이다

- 표현데이터를 압축하기 위해 사용하고, 데이터를 전달하는 곳에서 압축한 후, 인코딩 헤더를 추가한다.

- 데이터를 읽는 쪽에서는 인코딩 헤더의 정보로 압축을 해제한다.

ex) gzip, deflate, identity

 

3) Content-Language

 표현 데이터의 자연 언어 헤더이다.

- 만일 해당 국가 언어를 지원한다면, 이 헤더로 인해 맞는 언어로 응답받을 수 있다.

ex) ko, en, en-US

 

4) Content-Length

 표현 데이터의 길이 헤더이다.

- 바이트 단위로 저장한다.

- 이따 설명할 Transfer-Encoding(전송 코딩)을 사용하면, Content-Length를 사용하면 안된다.

 

 

3. 콘텐츠 협상

클라이언트가 서버에게 본인이 선호하는 표현 요청을 담는 헤더들이다.

- 협상 헤더는 요청시에만 사용한다.

 

- Accept: 클라이언트가 선호하는 미디어 타입 전달

- Accept-Charset: 클라이언트가 선호하는 문자 인코딩

- Accept-Encoding: 클라이언트가 선호하는 압축 인코딩

- Accept-Language: 클라이언트가 선호하는 자연 언어

 

1) Quality Values(q) 적용 전

 이렇게 선호하는 자연언어가 Accept-Language: ko라고 전달하면, 서버가 지원한다는 가정 하에 한국어로 응답받을 수 있다. 하지만 만일에 한국어를 지원하지 않는다면? 2순위, 3순위도 지정하는게 좋아보인다.

 

2) Quality Values(q) 적용 후

(1) Accept-Language

 자세히 보면, 각 언어 뒤에 q=(숫자) 값을 적어두었다. 이것이 우선순위이며, 0~1사이의 숫자를 기입하고 숫자가 클수록 높은 우선순위를 지닌다. 생략하면 1이다.

ex) Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7

  -> 1. ko-KR;q=1 (q생략)

  -> 2. ko;q=0.9

  -> 3. en-US;q=0.8

  -> 4. en:q=0.7

 

(2) Accept

Accept 헤더같은 경우 따로 숫자를 지정해주지 않고, 구체적인 것을 우선으로 한다. 예시의 우선순위는 다음과 같다.

ex) Accept: text/*, text/plain, text/plain;format=flowed, */*

  -> 1. text/plain;format=flowed

  -> 2. text/plain

  -> 3. text/*

  -> 4. */*

 

 이를 q 숫자로 표현하면 다음과 같다.

 

 

4. 전송 방식

전송 방식은 단순하게 4가지 방법으로 구분할 수 있다.

 

1) Content-Length(단순 전송)

- 응답 시 메시지 바디의 Content-Length를 지정해준다.

- 메시지 바디의 길이를 알고 있을 때 사용하며, 한번에 요청하고 한번에 응답한다.

 

2) Content-Encoding(압축 전송)

- 서버에서 메시지 방식을 정한 후(gzip) 해당 방식을 이용해 압축해서 전달하는 방식이다.

- 따라서 Content-Encoding 헤더를 통해 어떤 방식을 선택하였는지 알려주어야 한다.

 

3) Transfer-Encoding(분할 전송)

- 덩어리로 데이터를 쪼개서 보내는 방식이다.

- 서버에서 클라이언트에게 응답 메시지를 특정 단위로 나누어서 보낸다.

- 용량이 매우 큰 경우 사용하며, 전송되는 대로 표현을 하는 방식이다.

- 당연한 말이지만, 길이를 예측할 수 없기 때문에 Content-Length를 넣으면 안된다.

 

4) Range, Content-Range(범위 전송)

- 이미지와 같이 매우 큰 데이터를 받을때 사용한다.

- 중간에 전송이 끊겼을 경우, 새로 받을 필요 없이 범위를 지정해서 필요한 부분만 응답받는다.

  -> 속도를 높일 수 있다.

 

 

5. 일반 정보

1) From

유저 에이전트의 이메일 정보이다.

- 일반적으로 잘 사용되지는 않으며, 검색엔진 같은 곳에서 사용한다.

- 요청시 사용한다.

 

2) Referer

이전 웹 페이지 주소를 저장한다.

- A -> B로 사이트를 이동하는 경우, B를 요청할 때 Referer: A를 포함해서 요청한다.

- 이를 사용해 유입 경로 분석이 가능해진다.

- 요청 시 사용한다

+ referrer의 오타이다.

 

3) User-Agent

유저 에이전트 애플리케이션 정보를 저장한다.

- 클라이언트의 애플리케이션 정보를 저장하며, 어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능해진다.

- 요청 시 사용한다.

ex) user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/ 537.36 (KHTML, like Gecko) Chrome/86.0.4240.183 Safari/537.36

 

4) Server

요청을 처리하는 ORIGIN 서버의 소프트웨어 정보를 저장한다.

(ORIGIN 서버란, 여러 프록시 서버를 거쳐 내 요청을 받고 응답을 하는 엔드포인트 서버를 뜻한다.)

- 응답 시 사용한다.

ex) Server: Apache/2.2.22 (Debian)

ex) server: nginx

 

5) Date

메시지가 발생한 날짜와 시간을 저장한다.

- 응답 시 사용한다.

ex) Date: Thu, 12 Jan 2023 23:52:31 GMT

 

 

6. 특별한 정보

1) Host

요청한 호스트 정보(도메인)을 담는다.

- 요청 시 필수적으로 사용한다.

- 하나의 서버가 여러 도메인을 처리하는 경우도 있기 때문에, 필수적으로 사용한다.

 

2) Location

페이지 리다이렉션을 위한 헤더이다.

상태코드 201, 3xx에서 주로 사용되며, 자세한 설명은 아래 게시물을 참고 부탁한다.

(HTTP 상태코드)

 

3) Allow

허용 가능한 HTTP 메서드 안내를 위한 헤더이다.

- 경로는 존재하지만, 지원하는 HTTP 메서드가 아닌 경우 지원하는 메서드 안내를 해준다.

- 405 (Method Not Allowed) 응답에 포함되어야 한다.

실제로 사용되는 빈도수는 높지 않다.

ex) Allow: GET, HEAD, PUT

 

4) Retry-After

유저가 다음 요청을 하기까지 기다려야 하는 시간이다.

- 503 (Service Unavailable) 응답에 포함된다.

- 서비스가 언제까지 불능인지 알려준다.

ex) Retry-After: Fri, 31 Dec 1999 23:59:59 GMT (날짜 표기)

ex) Retry-After: 120 (초단위 표기)

 

 

7. 인증

1) Authoriztion

클라이언트 인증 정보를 서버에 전달한다.

- 인증 방식으로는 OAuth, OAuth2, SNS 로그인 등 다양한데, 방식별로 들어가야 하는 값이 다르다.

- 따라서 인증과 관련된 값을 넣어주면 된다.

ex) Authorization: Basic xxxxxxxxxxxxxxxx

 

2) WWW-Authenticate

리소스 접근시 필요한 인증방법을 정의해준다.

- 401 Unauthorized 응답과 함께 사용되는 헤더이며, 자세한 설명은 아래 게시글을 참고 바란다.

(HTTP 상태코드)

ex) WWW-Authenticate: Newauth realm="apps", type=1, title="Login to \"apps\"", Basic realm="simple"

 

 

8. 쿠키

쿠키 관련 정보도 HTTP 헤더에 저장한다. 이 부분은 아래 게시물을 참고 바란다.

https://imgzon.tistory.com/130

 


위 내용은 김영한 님의 인프런 강의 "모든 개발자를 위한 HTTP 웹 기본 지식"의 내용과 강의자료를 토대로 작성된 게시글입니다.

강의 링크:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8

'cs > 컴퓨터 네트워크' 카테고리의 다른 글

HTTP 캐시와 조건부 요청, 프록시 캐시  (0) 2023.01.13
HTTP 쿠키  (0) 2023.01.13
HTTP 상태코드  (0) 2023.01.12
HTTP API 설계하는 법  (0) 2023.01.12
HTTP 메서드(GET, POST, PUT, PATCH, DELETE)  (0) 2023.01.12

댓글