HTTP: HTTP Network Basic (6) HTTP 헤더

Lumpen·2024년 5월 19일
0

HTTP

목록 보기
2/8

웹 사이트를 이용할 때 평소에는 볼 수 없지만
HTTP 요청과 응답에는 반드시 헤더가 포함되어 있다

HTTP 메시지 헤더

HTTP 프로토콜의 요청과 응답에는 반드시 메시지 헤더가 포함되어 있다
메시지 헤더에는 클라이언트나 서버가 요청, 응답을 처리하기 위한 정보가 들어 있다
사용자가 직접 볼 필요는 없다

요청 메시지

메소드, URI, HTTP 버전, HTTP 헤더 필드 등으로 구성되어 있다

응답 메시지

HTTP 메시지와 버전, 상태코드, HTTP 헤더 필드 등으로 구성되어 있다

이러한 요소 중 가장 다양한 정보를 가지고 있는 것이 HTTP 헤더 필드다
헤더 필드는 요청과 응답 모두 존재하는 HTTP 정보를 가지고 있다

HTTP 헤더 필드

정보 전달

헤더 필드는 HTTP 를 구성하는 요소로서 중요한 정보를 전달한다
메시지 바디의 크기나 언어, 인증 정보 등을 전달한다

구조

HTTP 헤더 필드는 필드 명과 필드 값으로 구성되어 있다
필드 명 : 필드 값
예시로 메시지 바디의 오브젝트 타입을 가리키는 콘텐츠 타입이 있다
Content-Type:text/html
하나의 헤더 필드가 여러 개의 필드 값을 가질 수 있다

헤더 필드가 중복된 경우 브라우저마다 다르게 동작한다

종류

HTTP 헤더 필드는 4 종류가 있다

일반적 헤더 필드 (General)

요청과 응답 모두 사용하는 헤더

요청 헤더 필드

요청 메시지의 헤더로 요청 메시지의 부가 정보와 클라이언트 정보, 응답 컨텐츠 우선순위 등의 정보를 가지고 있다

응답 헤더 필드

응답 메시지 정보와 서버 정보, 클라이언트 추가 정보 요구 등을 가지고 있다

엔티티 헤더 필드

요청과 응답 메시지에 포함된 엔티티의 헤더로
콘텐츠 갱신 시간 등의 엔티티 정보를 가지고 있다

HTTP/1.1 에는 47 종류의 헤더 필드가 정의되어 있다
하지만 정의된 종류만 존재하지는 않고 쿠키 등이 있다
또한 RFC 에 정의되어 폭 넓게 사용되고 있는 것도 있다
HTTP 에서 정의되지 않은 것들은 비표준 헤더 필드라고 부른다

End-to-end 와 Hop-by-hop 헤더

HTTP 헤더 필드는 캐시와 비 캐시 프록시의 동작을 정의하기 위해
두 가지 카테고리로 분류되어 있다

End-to-end 헤더

요청과 응답 최종 수신자에게 전송된다
캐시에서 구축된 응답 중 보존되어야 하고
다시 전송되어야 한다

Hop-by-hop 헤더

한 번 전송에 대해서만 유효하고 캐시와 프록시에 의해 전송되지 않는 것도 있다
HTTP/1.1 과 그 이후에 사용되는 Hop-by-hop 헤더는 Connection 헤더 필드에 열거해야 한다

아래의 8개 헤더 필드만이 Hop-by-hop 헤더로
이외에는 모두 End-to-end 헤더에 해당한다

  • Connection
  • Keep-Alive
  • Proxy-Authenticate
  • Proxy-Authorization
  • Trailer
  • TE
  • Transfer-Encoding
  • Upgrade

HTTP/1.1 일반 헤더 필드

요청과 응답 모두에서 사용되는 헤더

Cache-Control

디렉티브로 불리는 명령을 사용하여 캐싱 동작을 지정한다
지정한 디렉티브에는 파라미터가 있을 수 있다
여러개의 디렉티브를 지정할 경우에는 콤마로 구분한다
요청과 응답 시 사용 가능

Cache-Control: private, max-age=0

캐시가 가능 여부를 나타내는 디렉티브

  • public: 다른 유저에게도 돌려줄 수 있는 캐시를 해도 좋다는 것을 명시적으로 나타냄

  • private: 특정 유저를 위해서만 리소스 캐싱이 가능, 다른 유저는 캐시를 반환하지 않는다

  • no-cache: 캐싱을 하지 않도록 지정, 필드 값을 지정하여 해당 필드만 캐시하지 않도록 지정 가능

캐시 보존을 제어하는 디렉티브

  • no-store: 요청과 응답에 기밀 정보가 포함되어 있음을 나타냄과 동시에 로컬 스토리지에 보존할 수 없도록 지정

캐시 기한 및 검증을 지정하는 디렉티브

  • max-age: 캐시 서버가 유효성을 확인하지 않는 최대 기한을 나타낸다
    Expries 헤더 필드와 같이 사용 시 Expries 헤더 필드를 무시한다 (HTTP/1.1)

  • s-maxage: max-age 와 동일한 기능이지만 공유 캐시 서버에만 적용된다

  • min-fresh: 리소스가 최소한 유지되어야 할 기한을 지정

  • max-stale: 캐시된 리소스 유효 기한이 끝났더라도 받아들일 수 있는 시간을 지정한다

  • only-if-cached: 목적한 리소스가 로컬 캐시에 있는 경우만 응답을 반환하도록 한다

  • must-revalidate: 응답 캐시가 현재 유효한지 여부를 오리진 서버에 조회하도록 요청
    max-stale 을 무시하고 진행된다

  • proxy-rebalidate: 모든 캐시 서버에 대해서 이후의 요청으로 해당 응답 반환 시 반드시 유효성 재확인을 한다

  • no-transform: 요청과 응답의 캐시가 엔티티 바디의 미디어 타입을 변경하지 않도록 지정한다
    -> 캐시 서버 등에 의해 이미지 압축되는 것을 방지함

Cache-Control 확장

  • cache-extension 토큰:
    Cache-Control 헤더 필드는 cache-extension 토큰을 사용하여 디렉토리를 확장할 수 있다

Connection

Connection 헤더 필드는 두 가지 역할을 한다

  • 프록시에 더 이상 전송하지 않는 헤더 필드 지정
  • 지속적 접속 관리

전송하지 않는 헤더 필드 지정

Connection: 헤더 필드 명

접속 관리

Connection: Close

HTTP/1.1 에서는 지속 접속이 디폴트이기 때문에 끊고 싶은 경우에 Close

1.1 이전 버전에서는 Keep-Alive 로 지정하여 지속 접속을 할 수 있다

Date

Date 헤더 필드는 HTTP 메시지 생성 날짜를 나타낸다

Pragma

1.1 이전 버전에서 1.0 버전과의 후방 호환성만을 위해 정의된 헤더 필드
일반 헤더 필드이지만 클라이언트 요청에서만 사용된다

Traile

메시지 바디 뒤에 기술되어 있는 헤더 필드를 미리 전달할 수 있다
HTTP/1.1 에 구현되어 있는 청크 전송 인코딩을 사용하고 있는 경우에만 사용 가능하다

Transfer-Encoding

메시지 바디의 전송 코딩 형식을 지정하는 경우 사용된다

Transfer-Encoding: chunked

HTTP/1.1 에서 전송 코딩 형식으로 청크만 정의되어 있다

Upgrade

HTTP 및 다른 프로토콜의 새로운 버전이 통신에 이용되는 경우에 사용된다

Via

클라이언트와 서버 간 요청, 응답 메시지의 경로를 알기 위해 사용된다

Warnning

HTTP/1.0 에서는 Retry-After 로 쓰인다
요청에 대한 추가 정보를 전달한다
기본적으로는 캐시 문제의 경고를 유저에게 전달한다

요청 헤더 필드

클라이언트에서 서버로 송신되는 요청 메시지의 헤더로
요청 부가 정보와 클라이언트 정보, 응답 콘텐츠 우선 순위 등을 추가한다

Accept

유저 에이전트에 처리할 수 있는 미디어 타입과 우선순위를 전달한다
타입/서브타입 을 지정하여 한 번에 여러 번 설정할 수 있다

미디어 타입 종류

텍스트, 이미지, 동영상, 애플리케이션 용 바이너리 파일

Accept-Charset

에이전트에서 처리할 수 있는 문자셋으로 문자셋의 상대적인 우선 순위를 전달하기 위해 사용된다

Accept-Encoding

유저 에이전트가 처리할 수 있는 콘텐츠 코딩과 우선 순위를 전달한다

콘텐츠 코딩 종류

gzip, compress, deflate, identify

와일드카드(*) 를 사용하여 모든 인코딩 포맷을 지정할 수 있다

Accept-Language

유저 에이전트가 처리할 수 있는 자연어 세트와 우선 순위를 지정한다
자연어 세트는 한 번에 여러 개를 지정할 수 있다

Authorization

유저 에이전트의 인증 정보(크리덴셜 값)를 전달하기 위해 사용된다
서버에 인증을 받으려 하는 유저 에이전트는 상태 코드 401 응답 뒤 리퀘스트에
Authorization 헤더 필드를 포함한다
공유 캐시가 Authorization 헤더 필드 포함하는 요청을 받은 경우에는 조금 다르게 동작한다

Expect

클라리언트가 서버에 특정 동작 요구를 전달한다
HTTP/1.1 사양에는 100-continue 만 정의되어 있다

From

유저 에이전트를 사용하고 있는 유저의 메일 주소를 전달한다

Host

요청 리소스의 인터넷 호스트와 포트 번호를 전달한
HTTP/1.1 에서 유일한 필수 헤더 필드

조건부 요청 (if)

  • if-Match: 서버는 지정된 조건에 맞는 경우에만 요청을 받는다
  • if-Modified-Since: 특정일 이후의 갱신된 리소스라면 요청을 받는다
  • if-None-Match: 필드 값에 지정된 엔티티 태그(ETag) 값이 리소스의 Etag 값과 일치하지 않으면 요청을 받는다
  • if-Range: 필드 값과 ETag 값 혹은 갱신 날짜가 일치하면 요청을 받는다 - Range 를 잘 활용하면 요청을 줄일 수 있다
  • if-Unmodified-Since: if-Modified-Since 와 반대로 특정일 이후 갱신되지 않은 것만 받는다

Max-Forwards

요청 시 전달될 서버의 최대 수를 10진수 정수로 지정한다
오리진 서버에 닿기 전에 끝나더라도 경우하는 프록시 서버 등에서 바로 응답을 보내게 한다
오리진 서버까지 가는 도중에 문제가 생기는 경우 응답 받을 수 있는 서버를 찾는 용도로 주로 사용된다

Proxy-Authorization

프록시 서버에서의 인증 요구를 받을 때에 인증에 필요한 클라이언트 정보를 전달한다
클라이언트와 프록시 사이의 인증을 한다

Range

리소스의 일부분만 취득하는 Range 요청을 할 때 지정 범위를 전달한다
받은 서버가 요청을 처리할 수 있다면 206 Partial Content 응답을 반환한다
Range 요청을 처리할 수 없는 경우에는 200 OK 응답으로 리소스 전체를 반환한다

Referer

요청이 발생한 본래 리소스의 URI 를 전달한다
기본적으로 Referer 헤더 필드는 보내져야 하지만
브라우저 주소창에 직접 URI 를 입력한 경우나 보안상 바람직하지 않다고 판단된 경우에는
보내지 않는다

TE

요청으로 받을 수 있는 전송 코딩의 형식과 우선순위를 지정한다

User-Agent

요청을 생성한 브라우저와 유저 에이전트의 이름 등을 전달하기 위한 필드
로봇 엔진의 요청의 경우에는 로봇 엔진의 책임자 메일 주소가 부가된 것도 있다
프록시 경유로 요청을 할 경우에는 프록시 서버의 이름 등이 부가된 것도 있다

응답 헤더 필드

응답 헤더 필드는 응답 메시지에 적용된 헤더로
응답의 부가 정보나 서버 정보, 클라이언트에 정보 요구 등을 나타낸다

Aceept-Ranges

서버가 Range 요청을 접수할 수 있는지 여부를 전달
수신 가능하면 bytes 아니면 none

Age

서버에서 응답이 생성된 이후로부터 지난 시간을 전달한다
캐시 서버라면 캐시를 검증한 시간을 전달하게 된다

ETag

엔티티 태그라고 불리며 리소스를 특정하기 위한 문자열을 전한다
리소스마다 ETag 값이 할당된다
리소스가 갱신되면 ETag 값도 갱신된다

강한 ETag 와 약한 ETag

  • 강한 ETag: 엔티티가 아주 조금만 달라도 값이 변화한다
  • 약한 ETag: 의미가 다른 리소스에만 ETag 값이 변한다 (맨 앞부분에 "W/" 가 붙는다)

Location

응답 수신자에 대해서 Request-URI 를 기술한다 이외의 리소스 엑세스를 유도하는 경우 사용된다
기본적으로 300번대 Redirection 리스폰스에 대해 리다이렉트 URI 를 기술한다

Proxy-Authenticate

프록시 서버에서의 인증 요구를 클라이언트에 전달한다
클라이언트와 서버의 HTTP 엑세스 인증과 비슷하다

Retry-After

요청을 일정 시간 이후에 다시 하라는 것으로 시간을 값으로 갖는다
주로 300번 대, 503 번 상태 코드와 함께 사용된다

Server

서버에 설치되어 있는 HTTP 서버의 소프트웨어를 전달한다

Vary

캐시를 컨트롤 하기 위해 사용한다
오리진 서버가 프록시 서버에 로컬 캐시를 사용하는 방법에 대한 지시를 전달한다

WWW-Authenticate

HTTP 엑세스 인증에 사용되는 헤더 필드로
401 응답에는 반드시 포함된다
Rqeust-URI 에 지정했던 리소스에 적용할 수 있는
인증 스키마와 파라미터를 나타내는 challenge 를 전달한다

엔티티 헤더 필드

엔티티 페더 필드는 요청과 응답 메시지에 포함된 엔티티에 사용되는 헤더로
콘텐츠 갱신 시간 등과 같은 엔티티 정보를 포함한다

Allow

Reqest-URI 에 지정된 리소소스가 제공하는 메소드의 일람을 전달한다
서버가 받을 수 없는 메소드를 수신한 경우에는
상태코드 405 응답과 함께 수신 가능한 메소드의 일람을 서술한
Allow 헤더 필드를 반환한다

Content-Encoding

서버가 엔티티 바디에 대해서 실시한 콘텐츠 코딩 형식을 전달한다
콘텐츠 코딩은 엔티티의 정보가 누락되지 않도록 압축할 것을 지시한다
주로 다음 네 가지 콘텐츠 코딩 형식이 사용된다
Gzip, Compress, Dellate, Identify

Content-Language

엔티티 바디에 사용된 자연어를 전달한다

Content-Length

엔티티 바디의 크기를 전달한다
엔티티 바디에 전송 코딩이 실시된 경우에는
Content-Length 를 사용해서는 안된다

Content-Location

메시지 바디에 대응하는 URI 를 전달한다
Location 헤더 필드와 달리 메시지 바디로 변환된 리소스의 URI 를 나타낸다

Content-MD5

메시지 바디 -> MD5 알고리즘 -> Base64 인코딩
Content-MD5 헤더 필드는 메시지 바디가 변경되지 않고 도착했는지
확인하기 위해 MD5 알고리즘에 의해 생성된 값을 전달한다
우발적으로 콘텐츠가 변경된 사실은 알 수 있지만
악의를 가진 변조는 검출할 수 없다

Content-Range

범위를 지정하여 요청하는 Range 리퀘스트에 대해서 응답할 때 사용된다
응답으로 보내는 엔티티가 어느 부분에 해당하는가를 전달한다

Content-Type

엔티티 바디에 포함되는 오브젝트의 미디어 타입을 전달한다

Expries

리소스의 유효 기한을 전달한다

Last-Modified

리소스가 마지막으로 갱신된 날짜를 전달한다
기본적으로는 Request-URI 가 지정된 리소스가 갱신된 날짜가 되지만
CGI 등 스크립트로 동적인 데이터를 다룰 때는
그 데이터의 최종 갱신 날짜가 되는 경우도 있다

쿠키를 위한 헤더 필드

서버와 클라이언트간 상태를 관리하는 쿠키는 HTTP/1.1 사양에 포함된 것은 아니지만
웹에서 널리 사용되고 있다
쿠키는 유저 식별과 상태 관리에 사용되고 있다

  • Set-Cookie: 상태 관리 게시를 위한 쿠키 정보 (응답)
  • Cookie: 서버에서 수신한 쿠키 정보 (응답)

서버가 클라이언트에 대해 상태 관리를 시작할 때 정보를 전달한다

아래와 같은 속석을 가진다

Expries 속성

쿠키를 송출할 수 있는 유효 기한을 지정한 것으로
생략 시 브라우저 세션이 유지되는 동안 유효하게 된다
한 번 서버에 송출한 클라이언트의 쿠키는 서버에서 명시적으로 삭제하는 방법이 없다
유효 기한이 지난 쿠키를 덮어쓰는 것으로 쿠키를 삭제하는 것이다

Path 속성

쿠키를 송출하는 범위를 특정 티렉토리에 한정할 수 있다
보안 효과는 기대할 수 없다

Domain 속성

domain 속성에 의해 지정된 도메인 명은 후방 일치가된다
example.com 으로 지정했다면 www.example.com 과 www2.example.com 모두에게 쿠키가 송출된다
명시적으로 여러 도메인에 대해 쿠키를 송출하는 경우를 제외하면
domain 속성은 지정하지 않는 쪽이 안전하다

Secure 속성

웹 페이지가 HTTPS 에서 열렸을 때에만 쿠키 송출을 하도록 제한한다

HttpOnly 속성

자바스크립트를 경유해서 쿠키를 취득하지 못하도록 하는 확장 기능으로
XSS 로부터 쿠키의 도청을 막는 것을 목적으로 한다

클라이언트가 HTTP 의 상태 관리 지원을 원할 때
서버로부터 수신한 쿠키를 이후의 요청에 포함해서 전달한다
쿠키를 여러 개 보내는 것도 가능하다

이외의 헤더 필드

HTTP 헤더 필드는 독자적으로 확장할 수 있다

X-Frame-Option

다른 웹사이트의 프레임에서 표시를 제어하는 HTTP 응답 헤더로
클릭 재킹이라는 공격을 막는 것을 목적으로 하고 있다

X-XSS-Protection

XSS 보호 기능을 제어하는 HTTP 응답 헤더

DNT

Do Not Track 이라는 뜻으로 개인 정보 수집을 거부하는 의사를 나타내는 요청 헤더

P3P

웹 사이트 상 프라이버시 정책에 P3P 를 사용하는 것으로
프로그램을 읽을 수 있는 형태로 나태느기 위한 HTTP 응답 헤더

  • X- 접두사
HTTP 를 시작으로 많은 프로토콜에서 비표준 파라미터에 
"X-" 접두사를 붙이는 것으로 표준 파라미터와 구분했다
장점은 없고 단점이 많아서 앞으로는 그만두기로 제안되었다
이미 구현된 것에는 소급 적용되지 않는다
profile
떠돌이 생활을 하는. 실업자, 부랑 생활을 하는

0개의 댓글