HTTP에서 헤더는 클라이언트와 서버가 요청/응답 본문과 함께 추가 정보를 전달하기 위한 요소다. 요청과 응답에서 모두 사용하는 개념이며, 대소문자를 구분하지 않는 key와 value를 콜론(:)으로 구분하여 헤더를 구성한다. 아래는 HTTP 요청과 응답 메시지의 예인데, 잘 보면 HTTP의 헤더가 많은 부분을 차지하고 있다. 언어, 브라우저 정보, 본문의 길이, 본문의 포맷, 인코딩 정보, 서버 정보 등 주고받을만 한 메타데이터들이 많기 때문이다.

헤더는 그 context에 따라 그룹을 나눌 수 있는데, 다음과 같다.

  • 일반 헤더(General header) : 요청 및 응답에는 적용되지만, 전송되는 데이터와는 관련이 없는 헤더
  • 요청 헤더(Request header) : 가져오고자 하는 리소스, 또는 클라이언트 자체에 대한 자세한 정보가 포함된 헤더
  • 응답 헤더(Response header) : 응답에 대한 추가 정보가 포함된 헤더
  • 엔티티 헤더(Entity header) : 요청이나 응답의 본문에 대한 더 많은 정보가 포함된 헤더

이제 헤더들을 살펴보자. '이런것도 있네' 싶은 헤더들이 종종 있다. 글의 길이가 너무 길어질 것 같아 여러 편에 나누어 구성한다.

Authorization: Basic cGxhbmI6c2VjcmV0

Authorization: <type> <credentials>

Request header로, 사용자의 자격을 증명하기 위해 사용한다. 게시글을 삭제하는 작업을 처리하는 API에서 요청의 Authorization 헤더를 복호화한 뒤 요청자가 리소스에 대한 삭제 권한이 있는지를 확인하는 등의 구현이 있을 수 있다.

type과 credentials를 공백으로 구분하여 value를 구성하며, type은 인증 타입을 나타낸다. BearerBasic, Digest, OAuth 등을 값의 맨 앞에 두는 것을 자주 봤을 것이다. type에 따라 credentials를 구성하는 방식이 달라지므로 서버가 credentials를 복호화하는 방식을 결정할 수 있게 하기 위해서 함께 사용한다. 따라서 credentials는 type에 따라 만들어내는 방식이 달라진다. 예를 들어 Basic 타입은 사용자명과 비밀번호를 콜론을 통해 합친 후(planb:secret), 그 문자열을 base64로 인코딩(cGxhbmI6c2VjcmV0)하여 credentials를 생성한다.

일반적으로, Authorization 헤더가 필요한 곳에 해당 헤더 없이 접근했거나, type이 유효하지 않거나, 복호화가 불가능한 경우 401을, 복호화에 성공했으나 자격 증명에 실패한 경우 403을 상태 코드로 응답한다.

Cache-Control: no-cache

Cache-Control

X- 헤더

'배경지식' 카테고리의 다른 글

ProxySQL  (1) 2019.02.12
직렬화와 JSON  (0) 2019.02.12
ORM  (0) 2019.02.12
HTTP 메소드  (0) 2019.02.12
StatsD  (0) 2019.02.11

+ Recent posts