Kawaii_Jordy

[HTTP] 헤더란? 헤더의 역할과 종류 본문

취준/일반 개발 지식

[HTTP] 헤더란? 헤더의 역할과 종류

Kawaii_Jordy 2021. 10. 14. 23:27

대표적인 크로스 도메인 이슈(CORS) 회피하기 위한 헤더

[Access-Control-Allow-Origin: * , Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS]

위와 같이 헤더를 사용하고 있었지만 이해하지않고 사용했었다.

 

최근에 소셜라이트로 토큰을 발급받고 토큰을 헤더로 전송하고 받는다는 걸 활용하려고 했는데

잘 되지않기도 해서 HTTP 헤더에 대해서 공부하게 됐다.

 

우선 자주 찾아보는 웹사이트 MDN 웹 문서를 참고했다.

 

"HTTP 헤더는 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있도록 해줍니다. HTTP 헤더는 대소문자를 구분하지 않는 이름과 콜론 ':' 다음에 오는 값(줄 바꿈 없이)으로 이루어져 있습니다. 값 앞에 붙은 빈 문자열은 무시됩니다."

 

링크로 들어가면 핵심 내용이 바로 첫 줄에 있다.

 

HTTP헤더는 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송을 할 수 있게 한다.

 

그렇기에 요청 그리고 요청에 대한 응답을 위한 부가정보라고 보면 되겠다.

어쩌면 당연한 말이지만 웹사이트가 보이는 부분과  처리하는 부분이 나눠져 있기 때문이다.

 

헤더를 세부적으로 나누면 4가지로 구성되어있다.

 

General header: 요청과 응답 모두에 적용되지만 바디에서 최종적으로 전송되는 데이터와는 관련이 없는 헤더.

Request header: 페치 될 리소스나 클라이언트 자체에 대한 자세한 정보를 포함하는 헤더.

Response header: 위치 또는 서버 자체에 대한 정보(이름, 버전 등)와 같이 응답에 대한 부가적인 정보를 갖는 헤더.

Entity header: 콘텐츠 길이나 MIME 타입과 같이 엔티티 바디에 대한 자세한 정보를 포함하는 헤더.

 

네이버 페이지 창에서 F12를 눌러 개발자 창을 열고 Network카테고리에서 naver.com을 클릭해보자

요청 헤더와 응답 헤더들을 볼 수 있다

 

다시 돌아가서 요청 헤더는 클라이언트 자체에 대한 자세한 정보를 포함한다.

GET /home.html HTTP/1.1
Host: developer.mozilla.org
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.9; rv:50.0) Gecko/20100101 Firefox/50.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate, br
Referer: https://developer.mozilla.org/testpage.html
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Mon, 18 Jul 2016 02:36:04 GMT
If-None-Match: "c561c68d0ba92bbeb8b0fff2a9199f722e3a621a"
Cache-Control: max-age=0

GET 요청하겠으며 호스트 이름은 developer.milla.org이라는 정보를 제공한다.

Accept은  MIME 타입으로 표현되는, 클라이언트가 이해 가능한 콘텐츠 타입이 무엇인지를 알려준다.

예를 들어 텍스트, 이미지, html를 표기해 타입을 알려주는 역할을 한다.

 

응답 헤더는 HTTP 응답에서 사용될 수 있는 HTTP 헤더이다.

200 OK
Access-Control-Allow-Origin: *
Connection: Keep-Alive
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
Date: Mon, 18 Jul 2016 16:06:00 GMT
Etag: "c561c68d0ba92bbeb8b0f612a9199f722e3a621a"
Keep-Alive: timeout=5, max=997
Last-Modified: Mon, 18 Jul 2016 02:36:04 GMT
Server: Apache
Set-Cookie: mykey=myvalue; expires=Mon, 17-Jul-2017 16:06:00 GMT; Max-Age=31449600; Path=/; secure
Transfer-Encoding: chunked
Vary: Cookie, Accept-Encoding
X-Backend-Server: developer2.webapp.scl3.mozilla.com
X-Cache-Info: not cacheable; meta data too large
X-kuma-revision: 1085259
x-frame-options: DENY

 

HTTP 헤더

헤더?

저장 되거나 전송되는 데이터 블록의 맨 앞에 위치한 데이터를 가리킵니다.
특정 프로토콜의 헤더의 내용은 특정 프로토콜의 기능을 제공하기 위한 정보를 담고있습니다.
헤더의 뒤에 이어지는 데이터는 페이로드 혹은 바디로 불립니다.

HTTP 헤더의 역할

HTTP 헤더는 클라이언트와 서버가 요청 또는 응답으로 부가적인 정보를 전송할 수 있도록 해줍니다.

HTTP 헤더의 종류

종단간 헤더(end-to-end)

최종 수신자에게 전달되어야 하는 헤더.
request에 대해서는 서버, response에 대해서는 클라이언트입니다.
중간 프록시는 종단간 헤더를 수정되지 않은 상태로 재전송해야하며, 캐시는 이를 반드시 저장해야합니다.

홉간 헤더(hop-by-hop)

이러한 헤더는 단일 전송-레벨 연결에서만 의미가 있으며 프록시에의해 재전송되거나 캐시되어선 안됩니다. 이러한 헤더들은 다음과 같습니다. Connection, Keep-Alive, Proxy-Authenticate, Proxy-Authorization, TE, Trailer, Transfer-Encoding, Upgrade. 홉간 헤더는 Connection 일반 헤더를 사용해 설정될 수도 있음에 유의해야합니다.

General header

요청 및 응답 메시지 모두에서 사용되지만 컨텐츠 자체에는 적용되지 않는 헤더.
사용되고 있는 Context에 따라 response, request 헤더로 사용됩니다. 그러나 entity헤더는 아닙니다.

가장 흔한 general 헤더는 Date, Cache-Control 및 Connection입니다.

  • Date : 현재시간
  • Pragma : 캐시제어(no-cahce), HTTP/1.0에서 쓰던 것으로 HTTP/1.1에서는 Cache-Control이 쓰인다.
  • Cache-Control : 캐시제어 > **request context**
    • max-age= : 캐시의 유효기간을 명시합니다.
    • max-stale[=] : 만료된 캐시를 응답으로 받아들일지 지정합니다. optional하게 응답이 만료되어서는 안되는 시간을 지정할 수 있습니다.
    • min-fresh= : 클라이언트가 지정 된 시간동안 신선한(문제가 없는) 상태로 유지 될 응답을 원함을 나타냅니다.
    • no-cache : 캐시를 사용하기 전에 재검증합니다.(서버로 요청을 보냄)
    • no-store : 아무것도 캐시하지 않습니다.
    • no-transform : 응답에 대해 변형이나 변환을 허용하지 않습니다.
    • only-if-cached : 무조건 캐시를 사용합니다.
    • response context
    • must-revalidate : 캐시를 사용하기전에 만료 상태를 확인하며, 만료된 것은 절대 사용하지 않습니다.
    • no-cache : 캐시를 사용하기 전에 재검증합니다.(서버로 요청을 보냄)
    • no-store : 아무것도 캐시하지 않습니다.
    • no-transform : 응답에 대해 변형이나 변환을 허용하지 않습니다.
    • public : 응답이 어떤 캐시에 의해서든 캐시된다는 것을 나타냅니다.
    • private : 응답이 단일 사용자를 위한것이며 공유 캐시에 의해 저장되지 않아야 한다는 것을 나타냅니다.
    • proxy-revalidate :must-revalidate와 동일하지만, 공유 캐시에만 적용됩니다.
    • max-age= : 캐시의 유효기간을 명시합니다.
    • s-maxage= : max-age 혹은 Expires 헤더를 재정의하나, 프록시 같은 공유 캐시에만 적용되며 사설 캐시에 의해서는 무시됩니다.
  • Upgrade : 프로토콜을 업그레이드 HTTP/2.0
  • Via : 이용할 프록시의 이름, 프로토콜 버전, 호스트명
  • Connection : 전송이 완료된 후 연결을 유지할지 말지 나타냅니다. HTTP/1.1의 경우 keep-alive가 default입니다.

Request header

HTTP 요청에서 사용되지만 메시지의 컨텐츠와는 관련이 없는 헤더입니다.
Accept, Accept-*, If-*와 같은 request 헤더 들은 조건부 요청 수행을 허용합니다.
Cookie, User-Agent, Referer와 같은 다른 것들은 컨텍스트를 정확히 나타내어 서버가 응답에 맞출 수 있게 합니다.

  • Host : 서버의 도메인명과 서버의 포트를 지정합니다.
  • User-Agent : 클라이언트 정보를 포함합니다(예:브라우저 정보)
  • Referer : 현재 주소로 접근할 수 있었던 이전 주소의 정보를 포함합니다.
  • Accept : 클라이언트가 이해할 수있는 미디어 타입에 대한 정보를 포함합니다.
  • Accept-Charset : 클라이언트가 이해할 수 있는 캐릭터 셋에 대한 정보를 포함합니다.캐릭터 셋과 인코딩 1
    캐릭터 셋과 인코딩 2
  • Accept-Language : 클라이언트가 어떤 언어를 이해할 수 있는지, 그리고 locale중 어떤 것이 선호되는지에 대한 정보를 포함합니다.
  • Accept-Encoding : 클라이언트가 이해 가능한 컨텐츠 인코딩 방법에 대한 정보를 포함합니다.
  • Authorization : 클라이언트의 자격증명을 포함합니다.
  • Origin : fetch를 요청한 원래의 주소의 정보를 포함합니다. 경로 정보는 포함하지 않습니다.
  • Cookie : Set-Cookie헤더와 함께 서버에 의해 이전에 전송되어 저장된 쿠키를 포함합니다.

Response header

HTTP 응답에서 사용될 수 있는 헤더입니다. 역시 컨텐츠와는 관련이 없습니다.
Age, Location, Server와 같은 response 헤더는 더 상세한 응답의 컨텍스트를 제공하기 위해 사용됩니다.

  • Transfer-Encoding : body 내용 자체 압축 방식 지정Transfer-Encoding: chunked
    Transfer-Encoding: compress
    Transfer-Encoding: deflate
    Transfer-Encoding: gzip
    Transfer-Encoding: identity
  • // 어떤 값들은 쉼표로 구분하여 나열될 수 있습니다
    Transfer-Encoding: gzip, chunked
  • Expires : 응답의 유효기간을 설정합니다.응답 내에 max-age 혹은 s-max-age 디렉티브를 지닌 Cache-Control 헤더가 존재할 경우, Expires 헤더는 무시됩니다.
  • Last-Modified : 서버가 알고 있는 가장 마지막 수정 된 날짜와 시각을 표시합니다.
  • ETag : 특정 리소스를 식별하는 식별자. 컨텐츠가 변경되었는지 알 수 있습니다.
  • Set-Cookie : 서버에서 사용자 브라우저에 쿠키를 전송하기 위해 사용됩니다.
  • Location : 리다이렉트 될 주소에 대한 정보를 포함합니다. Status Code가 3xx 혹은 201일 경우에 볼 수 있다.
  • Server : 요청을 처리하는 서버의 소프트웨어 정보를 포함합니다.
  • Age : Max-Age의 시간 내에서 얼마나 흘렀는지에 대한 정보를 포함합니다.
  • WWW-Authenticate : 리소스에 접근하기 위해 사용되어야 하는 메소드에 대한 정보를 포함합니다. 401 Unauthorized 응답과 함께 전송됩니다.

Entity header

메시지 바디의 컨텐츠를 나타내는 헤더입니다.
HTTP Request, Response 모두에서 사용됩니다.

  • Content-Encoding : 미디어 타입을 압축하기 위해서 사용됩니다. 클라이언트는 본문을 압축한 방식을 알 수 있습니다.
  • Content-Encoding: gzip
    Content-Encoding: compress
    Content-Encoding: deflate
    Content-Encoding: identity
    Content-Encoding: br
  • Content-Type : 본문의 미디어 타입을 나타내기위해 사용됩니다.
  • Content-Length : 본문의 길이를 나타냅니다.
  • Content-Language : 본문이 대상으로 하는 언어를 의미합니다.
  • Content-Location : 컨텐츠에 접근할 수 있는 위치를 나타냅니다.
  • Allow : 리소스가 지원하는 메소드의 집합을 의미합니다.

아래의 URI의 맨 뒷 부분에 헤더 이름을 추가하면 예시와 문법을 볼 수 있습니다.
https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/

Comments