CS/네트워크

HTTP 헤더 - 일반 헤더

Junuuu 2022. 1. 2. 14:32

헤더의 종류가 많아서 일반적으로 자주 사용하는 헤더와 캐시와 조건부 요청과 관련된 헤더로 구별하여 작성하겠습니다.

 

오늘은 일반 헤더에 대해 작성하겠습니다.

 

HTTP 헤더란?

HTTP 전송에 필요한 모든 부가정보를 헤더에 담습니다.

메시지 바디의 내용, 메시지 바디의 크기, 압축, 인증, 요청 클라이언트, 서버 정보, 캐시 관리 정보 등 매우 다양하게 이루어집니다.

 

HTTP 헤더의 구조

header-field or field-name ":" OWS field-value OWS (OWS는 띄어쓰기를 허용한다는 의미입니다.)

 

HTTP 헤더 예시

Host: www.google.com

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

Content-Length: 3423

 


표현 헤더

표현이란 요청이나 응답에서 전달할 실제 데이터를 의미합니다.

 

Content-Type :표현 데이터의 형식

미디어의 타입, 문자 인코딩에 관한 정보가 들어갑니다.

 

예시

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

Content-Type: application/json

Content-Type: image/png

 

Content-Encoding : 표현 데이터의 압축 방식

표현 데이터의 압축을 위해 사용됩니다.

데이터를 전달하는 곳에서 압축 후 인코딩 헤더를 추가합니다.

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

 

예시)

Content-Encoding: gzip

Content-Encoding: deflate

Content-Encoding: identity(압축을 하지 않는다는 의미)

 

Content-Language : 표현 데이터의 자연 연어

표현 데이터의 자연 언어를 나타냅니다.

 

예시)

Content-Language: ko

Content-Language: en

Content-Language: en-US

 

Content-Length: 표현 데이터의 길이

표현 데이터의 길이를 나타냅니다.

 

예시)

Content-Length: 5


협상 헤더(Content Negotiation)

클라이언트가 선호하는 표현 요청에 대한 정보가 들어갑니다.

협상 헤더는 요청시에만 사용됩니다.

 

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

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

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

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

 

하지만 클라이언트가 선호하는것과 서버가 가지고 있는 것이 다를 수 있기 때문에 Quality Values를 사용하여 우선순위를 사용합니다.

 

협상과 우선순위1

Quality Values(q)를 사용하여 우선순위를 정합니다.

0~1 사이의 수를 가지며 클수록 높은 우선순위를 가집니다.

 

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

만약 클라이언트가 위와 같은 Accept-Language 협상 헤더를 서버에게 요청하였습니다.

서버가 한국어를 지원한다면 Content-Language: ko로 오겠지만 한국어를 지원하지 않고 서버에 1. 독일어와 2. 영어를 지원한다고 가정하겠습니다.

그렇게 되면 위의 우선순위에 따라 독일어 대신에 영어를 지원하게 됩니다.

 

협상과 우선순위 2

구체적인 것이 우선순위를 가집니다.

1. text/plain;format=flowed

2. text/plain

3. text/*

4. */*

 

이때 (*)은 와일드카드로 어떤 값이 와도 상관없을 때 사용합니다.


일반 정보 헤더

From : 유저 에이전트의 이메일 정보

 

Referer : 현재 요청된 페이지의 이전 웹 페이지 주소

A -> B로 이동하는 경우 B를 요청할 때 Referer: A를 포함하여 요청합니다.

유입 경로 분석을 할 때 Referer 헤더를 많이 사용합니다.

 

user-agent: 클라이언트의 애플리케이션 정보(웹 브라우저 정보)

이 헤더를 통해 어떤 종류의 브라우저에서 장애가 발생하는지 파악 가능합니다.

 

Server: 요청을 처리하는 ORIGIN 서버의 소프트웨어 정보를 제공

 

Data : 메시지가 발생한 날짜와 시간을 제공


특별 정보 헤더

Host: 클라이언트 요청에서 사용하는 필수 값으로 요청한 호스트 정보를 제공합니다.

서버가 다양한 도메인을 가질 수 있기 때문에 호스트 정보를 제공하지 않으면 서버가 어떠한 도메인으로 접근해야 할지 문제가 발생할 수 있습니다.

 

Location: 3xx 응답의 결과에 Location 헤더가 있으면, Location 위치로 자동 이동합니다.

 

Allow : 허용 가능한 HTTP 메서드

예시) Allow: GET, HEAD, PUT

 

Retry-After : 유저 에이전트가 다음 요청을 하기까지 기다려야 하는 시간


인증 헤더

Authorization : 클라이언트 인증 정보를 서버에 전달

 

WWW-Authorization: 리소스 접근 시 필요한 인증 방법 정의

필요한 인증 방법에 대해 알려줍니다.

403 Unauthorized 응답과 함께 사용됩니다.


쿠기 헤더

쿠키란?

HTTP는 무상태 프로토콜이기 때문에 서로의 상태를 유지하지 않습니다.

따라서 클라이언트가 다시 요청하면 서버는 이전 요청을 기억하지 못합니다.

쿠키를 사용하지 않게 된다면 서버는 클라이언트가 로그인한 사실을 알 수 없습니다.

 

쿠기라는 개념이 도입되어 웹 브라우저는 서버가 보낸 응답 메시지 Set-Cookie 헤더에 포함된 정보를 쿠키 저장소에 저장합니다.

이후에 클라이언트는 요청 메시지에 Cookie 헤더에 쿠키 저장소에 저장된 정보를 활용하여 서버에게 요청합니다.

 

보통 유저의 정보 대신에 seesionId를 통하여 로그인 관리를 합니다.

보안에 민감한 정보를 저장하면 안 됩니다.

 

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

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

 

 

쿠키 - 생명주기는

Expires, max-age로 관리

예시)

expires 예시

Set-Cookie: max-age =3600(초)

세션 쿠키: 만료 날짜를 생략하면 브라우저 종료 시까지만 유지

영속 쿠키: 만료 날짜를 입력하면 해당 날짜까지 유지

 

 

 

쿠키 - 도메인

아무 사이트에서나 쿠키가 작동하지 않도록 도메인을 지정합니다.

 

예시) domain = example.org

 

example.org에서 쿠키를 생성하고 도메인을 지정한다면 exmaple.org뿐만아니라 dev.example.org도 쿠키를 접근할 수 있습니다.

 

example.org 에서 쿠키를 생성하고 만약 도메인 지정을 생략한다면 example.org에서만 쿠키 접근이 가능하고 dev.example.org에서는 쿠키를 접근할 수 없습니다.

 

 

 

쿠키 - 경로

이 경로를 포함한 하위 경로 페이지만 쿠키에 접근할 수 있습니다.

일반적으로 path=/ 루트로 지정합니다.

 

예시)

path=/home 이라면

/home - 쿠키 접근 가능

/home/level1 - 쿠키 접근 가능

/home/level1/leve2 - 쿠키 접근 가능

/hello - 쿠키 접근 불가능

 

 

 

쿠키 - 보안

 

Secure

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

 

HttpOnly

자바스크립트에서는 접근할 수 없고 HTTP 전송에만 사용하도록 합니다

 

SameSite

요청 도메인과 쿠키에 설정된 도메인이 같은 경우만 쿠키 전송이 가능하도록 합니다.


 

HTTP 전송방식에 대한 HTTP 헤더의 활용

단순 전송

GET 요청이 들어왔을 때 표현 데이터를 온전히 전송하는 것(한 번에 요청하고 한번에 받는 것)

Content-Length 헤더에 표현 데이터의 길이를 넣습니다.

 

압축 전송

서버에서 표현 데이터를 압축해서 전송하는 것

Content-Encoding 헤더에 압축 방식을 추가해야 합니다.

 

분할 전송

표현 데이터를 분할해서 전송합니다.

Transfer-Encoding헤더를 사용하여 분할하여 데이터를 전송합니다.

이때 Content-Length는 존재할 수 없습니다.

 

범위 전송

클라이언트가 서버에게 데이터를 받다가 끊겼을 때 데이터를 처음부터 다시 전송하면 아까우니 

Range를 추가해서 서버에 요청 메시지를 보내면 서버가 클라이언트에게 그 범위의 데이터를 응답 메시지에 보냅니다.

이때 서버는 Content-Range라는 헤더를 사용합니다.

 

 

출처

https://www.inflearn.com/course/http-%EC%9B%B9-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC/

 

모든 개발자를 위한 HTTP 웹 기본 지식 - 인프런 | 강의

실무에 꼭 필요한 HTTP 핵심 기능과 올바른 HTTP API 설계 방법을 학습합니다., 웹 기술을 사용하는 개발자라면 누구나 OK!꼭 필요한 HTTP의 핵심을 알려드립니다. 📣 확인해주세요!본 강의는 자바 스

www.inflearn.com