HTTP 헤더에 대해서

saewoohan·2024년 8월 8일
0

Computer Network

목록 보기
14/14
post-thumbnail

이전에 인턴 중 이미지 캐싱 관련해서 네트워크 헤더를 계속해서 들여본 적이 있다. (AWS S3에서 오는지, Cloud Front에서 전달되는지, 아니면 클라이언트 상의 캐싱에서 오는 것인지)
이때, 생각보다 HTTP헤더에 포함되어 전달되어오는 정보들이 꽤 중요하고 다양한 정보를 포함시킨다는 것을 깨달았고, 그렇기에 이에 대해서 한번 제대로 정리해보자고 한다.

HTTP 헤더란?

  • HTTP헤더는 클라이언트와 서버 간의 HTTP 요청과 응답에서 추가적인 정보를 전달하는 역할을 한다.
  • 예를 들면, Content-Type, Accept, Authorization, Cache-Control, ETag 등이 있다.
  • 헤더는 Key-value로 저장된다. 그렇기에 :로 key와 value가 구분이 된다.

  • 위의 사진은 www.naver.com에 접속했을 때에 개발자 도구를 사용해서 얻은 Http header이다.

Header의 종류

  • Http Header는 다음과 같이 4가지의 종류가 있다.

1.General Headers

  • 요청과 응답 모두에 적용될 수 있는 헤더이다.
  • ex) Cache-Control, Date, Connection 등

2. Request Header

  • 클라이언트가 서버에 요청을 보낼 때 사용하는 헤더이다.
  • ex) Accept, Accept-Encoding, Authorization, Cookie 등

3. Response Header

  • 서버가 클라이언트에 응답을 보낼 때 사용하는 헤더이다.
  • ex) ETag, Location, Set-Cookie 등

4. Entity Header

  • 본문에 대한 메타데이터를 제공하는 헤더이다.
  • ex) Content-Length, Content-Language, Expires

Header 주요 항목들

1. General Headers

Cache-Control: 캐싱 동작을 지정한다.

Cache-Control: no-cache
  • no-cache: 캐시된 리소스를 사용하기 전에 원 서버에 유효성을 확인하도록 동작한다.

  • no-store: 요청 및 응답 데이터를 저장하지 않는다.

  • public: 모든 캐시에서 저장할 수 있음을 뜻한다.

  • private: 특정 사용자에 대한 응답을 캐시한다. (브라우저 같은 특정 사용자 환경에만 저장)

  • 주로 응답 헤더에서 사용이 되지만, "클라이언트 - 중개 서버 - 서버"의 구조에서 원 서버에서 데이터를 사용하려고 한다면, 이 헤더를 추가해야한다.

Connection: 클라이언트와 서버 간의 연결 관리 지시를 포함한다.

Connection: keep-alive
  • keep-alive: TCP연결을 지속적으로 유지하여 여러 요청을 처리한다.
  • close: 현재 연결을 닫느다.

Date: 메시지가 생성된 날짜와 시간을 포함한다.

DAte: Tue, 15 Nov 1994 08:12:31 GMT

2. Request Header

Accept: 클라이언트가 처리할 수 있는 미디어 타입을 나타낸다.

Accept: text/html

Authorization: 인증 정보를 서버에 전달한다.

Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
  • 보통 토큰을 전송할 때, 사용되며 이도 사용되는 컨벤션이 있다.
Cookie: name=value; name2=value2

User-Agent: 요청을 보내는 클라이언트 어플리케이션 정보

User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3

3. Response Header

ETag: HTTP응답의 변경 여부를 알려주는 태그이다.

  • 응답 내용이 달라지면 ETag 값이 달라지고, 이를 통해서 기존의 캐시를 지우고 새 응답을 내려받을 지 결정한다.
  • 예를 들어 처음 Get 요청의 ETag가 12345였다가, 다음 Get 요청에서 응답이 바뀌면 ETag는 12345가 아닌 다른 값이 만들어진다.
  • 이때, 변경으로 인해 캐시를 지우고 새 응답을 호출한다.
  • 이를 통해서 캐시 유효성 검사가 가능하다.
ETag: "686897696a7c876b7e"

Location: 클라이언트를 리다이렉션할 URL을 지정한다.

Location: http://www.example.com/newpage.html
Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1

Access-Control-Allow-Origin: 클라이언트가 요청을 보낼 수 있는 출처(origin)를 지정한다.

  • 서버에서 이 헤더를 설정하지 않으면 브라우저는 동일 출처 정책에 의해 요청을 차단할 수 있다.
  • 값: 특정 출처(예: https://www.example.com) 또는 모든 출처를 허용하는 와일드카드(*).
Access-Control-Allow-Origin: https://www.example.com
Access-Control-Allow-Origin: *

Access-Control-Allow-Methods: 클라이언트가 요청할 수 있는 HTTP 메서드를 지정한다.

  • 일반적으로 REST API에서는 GET,POST,PUT,DELETE 등을 설정한다.
Access-Control-Allow-Methods: GET, POST, PUT, DELETE

Access-Control-Allow-Credentials: 클라이언트가 자격 증명(쿠키, HTTP 인증)을 포함한 요청을 보낼 수 있도록 허용한다.

  • 쿠키를 받아서 사용하기 위해서는 해당 옵션이 필요하다.
Access-Control-Allow-Credentials: true

4. Entity Header

  • 본문에 대한 메타데이터를 제공하기에 Content관련 header들이 존재한다.

Content-Type: 본문의 미디어 타입

Content-Type: text/html; charset=UTF-8

Content-Length: 본문의 길이

  • 요즘에는 멀티플렉싱으로 병렬적으로 처리하기에, 다음 HTTP요청이 어딘지 알기 위해서는 Content-Length는 필요한 정보이다.
Content-Length: 348

Content-Location: 본문이 사용할 수 있는 리다이렉션 위치

Content-Location: /index.htm

처음 개발을 할 때에는 사실, HTTP에 대해서도 잘 모르기도 했고 응답이 오는 각 헤더 데이터에 대해서 별 신경을 안쓰고 있었다. 하지만 개발을 하면 할 수록 HTTP 헤더가 중요한 사실을 느끼고 있으며, 헤더를 통해서 통신이 원할해짐은 물론 헤더를 잘 이용한다면 어플리케이션의 성능과 보안을 개선하는데에 큰 도움이 될 것이라고 생각이 든다.

0개의 댓글