[HTTP/Network] HTTP Header.1

dk.han·2022년 10월 7일
0
post-thumbnail

HTTP-Headers

HTTP header는 HTTP 전송에 필요한 모든 부가정보를 포함한다. 대표적으로 메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트와 서버 정보, 캐시 관리 정보... 등 굉장히 많은 종류의 헤더가 존재한다. 또한 필요시에는 커스터마이징해서 임의의 헤더를 추가할 수 있다.

1. 헤더의 종류

Representation header( 표현 헤더 )

표현 헤더는 전송, 응답 둘다 사용한다.

  • Content-Type: 표현 데이터의 형식을 알려준다.

    • 메시지 바디에 HTML이 들어오는 경우 : text/html; charset=utf-8
    • JSON 데이터가 들어오는 경우: application/json
    • 이미지가 들어오는 경우: image/png
  • Content-Encoding: 표현 데이터의 압축 방식을 알려준다.

    표현 데이터를 압축하기 위해 사용한다. 데이터를 전달하는 곳에서 압축 후 인코딩 헤더에 무엇으로 압축( gzip, deflate, identity ) 했는지 적어서 넘겨주게 되면, 데이터를 읽는 쪽에서 인코딩 헤더의 정보로 압축을 해제한다.

  • Content-Language: 표현 데이터의 언어가 무엇인지 알려준다. ( ko, en, en-US.. 등 )

  • Content-Length: 표현 데이터의 길이를 알려준다.

    • 바이트 단위로 표시한다.
    • Transfer-Encoding(전송 코딩)을 사용하면 Content-Length를 사용하면 안된다.

Content negotiation ( 콘텐츠 협상 헤더 )

클라이언트가 원하는 표현으로 데이터를 보내달라고 서버에게 협상 헤더로 요청을 하면, 서버는 협상 헤더를 확인하고 우선순위를 파악해서 표현 데이터를 만든다.

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

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

    • Quality Values(q)값 사용.
    • 0 ~ 1 사이의 값으로 표현하며, 클수록 높은 우선순위를 가진다. 생략시 1로 간주한다.
    • ko-KR;q > ko;q=0.9 > en-US;q=0.8 > en:q=0.7의 우선순위를 가진다.
  • Accept : 클라이언트가 선호하는 미디어 타입 전달.

    구체적인 것을 우선순위로 해서 미디어 타입을 맞춘다.

    ex) Accept: text/*;q=0.3, text/html;q=0.7, text/html;level=1,
 text/html;level=2;q=0.4, */*;q=0.5

    • text/html;level=1 > text/html > */* > text/html;level=2 > text/*
  • Accept-Encoding: 클라이언트가 선호하는 압축 인코딩

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

전송 방식

  • 단순 전송

    Content-Length를 알고 있을 때 사용 하며, 단순하게 요청하고 응답을 받는 절차.

  • 압축 전송

    표현 데이터를 압축해서 보내기 때문에, Content-Encoding 헤더가 있어야 한다.

  • 분할 전송

    표현 데이터를 분할 해서 보내는 방식. 이때는 Content-Length를 사용하면 안된다. 이유는 데이터를 분할 해서 보내기 때문에 데이터의 Length를 예측 할수 없다.

  • 범위 전송

    Content-Range 헤더에 범위를 지정해서 데이터를 받을 수 있다.

일반 정보

  • Referer

    요청 시 사용되는 헤더이며, 현재 요청된 페이지의 이전 웹 페이지 주소를 담는다. A에서 B로 이동하는 경우 B를 요청할 때 Referer: A를 포함해서 요청하는 방식이다. Referer를 사용해서 유입 경로 분석이 가능하다.

  • User-Agent

    요청 시 사용되는 헤더이며, 클라이언트의 애플리케이션 정보 ( 웹 브라우저 정보, 등등 )를 의미한다. 서버 입장에서는 어떤 종류의 브라우저에서 장애가 발생하는지 파악할 수있다. 또한 통계 정보를 뽑아내기 좋다.

  • Server

    응답시 사용되는 헤더, 요청을 처리하는 ORIGIN 서버의 소프트웨어 정보를 의미한다.

  • Date

    응답시 사용되는 헤더, 메시지가 발생한 날짜와 시간을 의미한다.

  • From

    요청시 사용되는 헤더, 유저 에이전트의 이메일 정보를 의미한다. 일반적으로 잘 사용되지 않지만, 검색 엔진 같은 곳에서 주로 사용한다.

특별한 정보

  • Host

    요청시 사용하는 필수적인 헤더. 하나의 서버가 여러 도메인을 처리 해야 할 때, 하나의 IP 주소에 여러 도메인이 적용되어 있을 때 사용한다.

  • Location

    • 201 (Created): Location 값은 요청에 의해 생성된 리소스 URI
    • 3xx (Redirection): Location 값은 요청을 자동으로 리다이렉션하기 위한 대상 리소스를 가리킴
  • Allow: 지원하는 HTTP 메서드의 종류를 적어주는 헤더.

  • Retry-After

    유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간을 적어준다. 503 status code를 보내 줄 때 같이 보내는 헤더이지만, 서버 점검이 아닌 이상 사용하기는 힘든 헤더.

인증

  • Authorization

    클라이언트 인증 정보를 서버에 전달하는 헤더.
    ex) JWT token 사용시 Authorization: Bearer xxxxxxxxxxxxxx

  • WWW-Authenticate

    리소스 접근 시 필요한 인증 방법을 정의하는 헤더이다. 리소스에 접근을 시도했으나 인증이 제대로 안되어 문제가 생긴 경우, 401(Unauthorized) 응답과 함께 사용한다.
    ex) WWW-Authenticate: Newauth realm="apps", type=1, 
title="Login to \"apps\"", Basic realm="simple"

쿠키

사용자 로그인 세션 관리, 광고 정보 트래킹에 많이 쓰인다. 쿠키 정보는 항상 서버에 전송되므로 세션 id, 인증 토큰과 같은 최소한의 정보만 사용하는것이 좋다. 서버에 전송하지 않고, 웹 브라우저 내부에 데이터를 저장하고 싶을 땐 웹 스토리지 (localStorage, sessionStorage)를 사용한다.
보안에 민감한 데이터인 주민번호, 신용카드 정보 등은 저장하면 안 된다.

  • Set-Cookie: 서버에서 클라이언트로 쿠키 전달( 응답 )

    • 쿠키의 생명주기는 expires, max-age로 관리한다.

      ex) Set-Cookie: expires=Sat, 26-Dec-2020 04:39:21 GMT
      ex) Set-Cookie: max-age=3600 (3600초)

    • domain을 명시하면 명시한 문서 기준 도메인 + 서브 도메인 까지 포함하게 된다.

      ex) domain=example.org을 지정해서 쿠키를 생성하면, example.org는 물론이고, dev.example.org도 쿠키 접근이 가능하다.

    • path를 통해 경로도 지정 할 수 있다. 일반적으로 path=/ 루트로 지정한다.

      ex) path=/home 이 경로를 포함한 하위 경로 페이지만 쿠키가 접근.

    • 쿠키와 관련된 보안은 Secure, HttpOnly, SameSite 3가지가 있다.

      Secure
      쿠키는 http, https를 구분하지 않고 전송하나, Secure를 적용하면 https인 경우에만 전송한다.

      HttpOnly
      HttpOnly를 사용하면 자바스크립트에서 쿠키에 접근하지 못하게 하여, XSS 공격을 방지하고, HTTP 전송에서만 쿠키를 사용 할 수 있다.

      SameSite
      요청 도메인과 쿠키에 설정된 도메인이 같은 경우만 쿠키가 전송 되도록 하는 옵션. XSRF 공격을 방지한다.

  • Cookie: 클라이언트가 서버에서 받은 쿠키를 저장하고, HTTP 요청시 서버로 전달.

Reference

모든 개발자를 위한 HTTP 웹 기본 지식

0개의 댓글