나의 독학은

6장 - HTTP 헤더 본문

학습/그림으로 배우는 Http & Network Basic

6장 - HTTP 헤더

안종혁 2023. 9. 9. 19:40

6.1 HTTP 메시지

HTTP 메시지 구조 (리퀘스트 메시지, 리스폰스 메시지)

좌) HTTP 메시지인 리퀘스트, 리스폰스 메시지  우) HTTP 헤더 필드

6.2 HTTP 헤더 필드

✅목적

- 클라이언트와 서버간의 통신을 위해

- 중요한 정보 전달을 위해

- 메시지 바디의 크기나 사용 언어, 인증 정보를 서버에 제공하기 위해

 

✅구조

- 헤더 필드 명 : 필드 값

ex) Content-Type : text/html

 

✅ HTTP 헤더 필드는 4종류로 나뉜다

- 일반 헤더 필드

- 리퀘스트 헤더 필드

- 리스폰스 헤더 필드 

- 엔티티 헤더 필드

 

✅ HTTP1.1 이외의 헤더 필드

Set-Cookie, Content-Disposition와 같이 RFC에 정의되어 폭 넓게 사용되기도 한다.

 *RFC : HTTP, TCP/IP, DNS와 같이 인터넷에 쓰이는 기술들을 다 적어 놓은 문서

 

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

End-to-End 헤더 : 메시지의 최종 수신자와 송신자 간의 통신을 관리하고 유지하는 데 사용

Hop-by-Hop 헤더 : 메시지의 경로 동안 중간 단계에서 처리하는 데 사용되는 정보를 포함

6.3 일반 헤더 필드

- 리퀘스트 메시지와 리스폰스 메시지 양쪽에 사용

 

✅ Cache-control 헤더 : 디렉티브로 불리는 명령을 사용해 캐싱을 관리

디렉티브 종류 설명 예시
public 아무에게나 캐시를 해도 좋다 Cache-control: 디렉티브
private 특정 유저만을 대상으로 캐시한다.
no-cache 캐시된 리소스를 받지 않고, 서버에서 리소스를 받는다.
no-store 메시지에 기밀 정보가 있으니 캐시로 보존하지 않는다
max-age 캐시 서버가 리소스를 저정하는 시간을 정함

- 이 외에도 다양한 디렉티브가 있다.

 

✅ Connection 헤더

- 프록시에 더 이상 전송하지 않는 헤더 필드를 지정

- 지속적 접속이 디폴트값이다, 접속을 끊고 싶다면 서버에서 Connection:Close를 작성한다.

 

✅ 그 외 헤더

헤더 필드 설명 예시
Date HTTP 메시지를 생성한 날짜 Date: Tue, 03 Jul 2012 04:40:59 GMT
Trailer 메시지 바디 뒤에 기술된 헤더 필드를 미리 전달
청크 전송 인코딩을 사용할 때만 사용
Trailer: Expires // 헤더필드
...
...메시지 바디...
Expires: Tue, 28 // 메시지 바디
Transfer-Encoding 메시지 바디의 전송 형식을 지정
HTTP/1.1에서는 필드 값으로 chunked밖에 없다.
Transfer-Encoding: chunked
Upgrade HTTP이외에 다양한 프로토콜과의 통신을 용이 Upgrade: TLS/1.0
Connection: Upgrade
Via 메시지의 경로를 알기 위해 사용 Via: 1.0 gw.hack.jp
Warning 캐시에 관한 경고를 전달 Warning:
[경고코드][경고한 호스트: 포트번호]"[경고문]"

6.4 리퀘스트 헤더 필드

리퀘스트 헤더 필드 설명 예시
Accept 미디어 타입 우선 순위 지정
ex)텍스트, 이미지, 동영상 등
우선 순위 지정 ":"
품질 지수 "q=" , 품질 계수 "0~1"
Accept: text/html,
             application/xhtml+xml;q=0.9
Accept-Charset 문자셋 우선 순위 지정
여러개 지정 가능
Accept-Charset: iso-8859-5, unicode
Accept-Encoding 콘텐츠 우선 순위 지정
ex) gzip, compress, identity 
Accept-Encoding: gzip, deflate
Accept-Language 언어 지정 Accept-Language: ko-kr, en
Authorization 인증 정보 전달 Authorization: Basic dWVub3Ni==
Expect 서버에 특정 동작을 요구
서버가 응답 못하면 417 상태코드를 반환
Expect: 100-continue
From 사용자의 메일 주소를 전달 From: info@hackr.jp
Host 인터넷 호스트와 포트 번호를 전달
HTTP/1.1의 유일한 필수 헤더
Host: www.hackr.jp
If-Match 클라이언트는 엔티티 태그(ETag) 값을 전달

서버는 If-Match의 ETag 값과 리소스의 ETag값이 일치하면 리퀘스트 받음
불 일치시 412 상태코드 반환

"*"을 전달하면 ETag값에 상관 없이
If-Match: "123456"
If-Modified-Since 필드 값의 날짜 이후 갱신된 리소스면 받아들임 If-Modified-Since: Thu, 15 Apr 2004
 If-None-Match If-Match와의 반대 동작 If-None-Match: *
If-Range 필드 값과 지정한 리소스의 ETag값이 일치하면 Range 리퀘스트로 처리
불 일치하면 리소스 전체를 반환
If-Range: "123456"
If-Unmodified-Since If-Modified-Since와 반대동작 -
Max-Forwards 리퀘스트 전송이 실패 시 원인을 알기 위함 Max-Forwards: 10
Proxy-Authorization 프록시 서버가 인증 요구할 때 Proxy-Authorization: Basic dGlwOjk5
Range 일정 범위의 리소스만을 얻을 때 Range: bytes=5001-10000
Referer 요청이 발생한 URI를 전달 Referer: http://www.hak.jp/index.html
User-Agent 요청을 요구한 브라우저와 이름을 전달 User-Agent: Moziila/5.0 Chrome/18.0

6.5 리스폰스 헤더 필드

리스폰스 헤더 필드 설명 예시
Accept-Ranges Range 리퀘스트 헤더 필드에 대한 응답이다.
가능은 bytes, 불가능은 none
Accept-Ranges: bytes
Age 오리진 서버에서 리스폰스가 생성된 시간을 초 단위로 기록
프록시가 리스폰스를 생성했다면 Age헤더 필드는 필수
Age: 600
ETag 서버는 리소스 마다 ETag 값을 할당함

ETag는 강한 ETag, 약한 ETag로 나뉨
강한 ETag 값은 리소스가 조금만 다르더라도 값을 새로 할당
약한 ETag값은 리소스가 같다는 것을 W/ 로 나타냄. 
강한 ETag
ETag: "82e22293907"

약한 ETag
ETag: W/"usagi-1234"
Location 요청한 URI이외의 리소스에 액세스를 유도할 때 사용 Location: http://www.design.com/
Proxy-Authenticate 프록시 서버에서의 인증 요구를 전달 Proxy-Authenticate:
       Basic realm="Auth"
Retry-After 클라이언트가 언제 리퀘스트를 다시 시행할 지 시간을 전달 Retry-After: 120
Server 서버에 설치된 HTTP서버의 명칭, 버전, 옵션을 전달 Server: Apache/2.2.17(Unix)
Vary 프록시 서버에 로컬 캐시를 사용하는 방법에 대해 지시.
같은 Vary에 지정된 헤더 필드를 가진 요청에 대해서만 캐시를 반환
Vary: Accept-Language
WWW-Authenticate HTTP 액세스 인증에 사용 WWW-Authenticate:
    Basic realm="Usa Auth"

6.6 엔티티 헤더 필드

엔티티 헤더 필드 설명 예시
Allow Request-URI에 지정된 리소스가 제공하는 메소드를 알려줌 Allow: GET, HEAD
Content-Encoding 엔티티 바디에 대해 실시한 콘텐츠 코딩 형식을 알려줌 Content-Encoding: gzip
Content-Language 엔티티 바디에 사용된 언어를 알려줌 Content-Language: en
Content-Length 엔티티 바디의 크기를 bytes로 전달
엔티티 바디에 전송 코딩이 실시된 경우에는 사용하면 안됨
Content-Length: 15000
Content-Location 메시지 바디에 대응하는 URI를 전달 Content-Location:
    http://www.hack.jp/index-ja.html
Content-MD5 메시지 바디가 변경됐는지 여부를 MD5 알고리즘으로 값을 생성하여 전달.
단, 악의를 가진 변조는 검출 불가능
Content-MD5: OGFkZDUwNGV==
Content-Range Range리퀘스트에 대한 응답 Content-Range: bytes 5001-10000/10000
Content-Type 엔티티 바디에 포함된 오브젝트의 미디어 타입을 전달 Content-Type: text/html; charset=UTF-8
Expires 리소스의 유효 기한 날짜를 캐시 서버에 전달 Expires: Wed, 04 Jul 2012 08:26:05 GMT
Last-Modified 리소스가 마지막으로 갱신된 날짜 정보를 전달 Last-Modified: Wed, 23 May 2012

6.7 쿠키를 위한 헤더 필드

Set-Cookie 헤더 필드

Set-Cookie 필드 속성 설명
NAME=VALUE 쿠키에 부여된 이름과 값(필수)
Expires=DATE 쿠키 유효 기한
기본값 : 브라우저를 닫을 때까지
Path=PATH 쿠기 적용 대상이 되는 서버 상의 디렉토리로 지정 하지 않는 것이 안전
기본값 : 도큐먼트와 같은 디렉토리
Domain=도메인 명 쿠키 적용 대상이 되는 도메인
기본값 : 쿠키를 생성한 서버의 도메인
Secure HTTPS로 통신할 때만 쿠키를 송신
HttpOnly 쿠키를 JavaScript에서 액세스 못하도록 제한.
XSS로 보호

Cookie 헤더 필드

- 클라이언트가 HTTP의 상태 관리 지원을 원할 때 전달

6.8 그 외의 헤더 필드

✅ X-frame-Option

- 클릭 재킹이라는 공격을 막는 것을 목적으로 함

- 값은 Deny(거부) 와 SAMEORIGIN(프로토콜, 호스트, 포트번호가 다 일치) 가 있다.

- 모든 웹 서버에서 설정하는 것이 바람직

 

✅ X-XSS-Protection

- 브라우저의 XSS 보호기능을 제어하는 헤더

- 값은 0 (XSS 필터를 무효) 과 1 (XSS 필터를 유효)이 있다.

 

✅ DNT

- 개인 정보 수집을 거부하는 의사

- 값은 0 (트래킹 동의) 과 1 (트래킹 거부)가 있다.

 

 

그림으로 배우는 Http & Network Basic

출처 : 그림으로 배우는 Http & Network Basic