6장 HTTP 헤더-3

그림으로 배우는 HTTP & Network
(우에노 센 저 / 이병억 역 )
을 읽고 정리한 내용입니다.


Connection

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

1
Connection: 더 이상 전송하지 않는 헤더 필드명

클라이언트의 리퀘스트 혹은 서버의 리스폰스에서 Connection 헤더 필드를 사용하며,
프록시 서버에 더 이상 전송하지 않는 헤더 필드(hop-by-hop 헤더)를 지정할 수 있다.

  • 클라이언트 -> 프록시 서버
1
2
3
GET/HTTP/1.1
Upgrade: HTTP/1.1
Connection: Upgrade
  • 프록시 서버 -> 오리진 서버
1
GET/HTTP/1.1

지속적 접속 관리

1
Connection: Close

HTTP/1.1에서는 지속적 접속이 디폴트
-> 리퀘스트를 송신했던 클라이언트는 접속이 계속 유지되면서 추가 리퀘스트를 송신하도록 한다.
서버 측에서 명시적으로 접속을 끊고 싶을 때, Connection 헤더 필드Close라고 지정한다.

  • 클라이언트 -> 서버
1
2
GET/HTTP/1.1
Connection: Keep-Alive
  • 서버 -> 클라이언트
1
2
3
4
5
HTTP/1.1 200 OK
#...
Keep-Alive: timeout=10, max=500
Connection: Keep-Alive
#...

HTTP/1.1 이전 버전의 HTTP에서는 지속적인 접속이 디폴트가 아니었다.
-> 오래된 버전의 HTTP에서 지속적 접속을 하고 싶은 경우,
Connection 헤더 필드에 Keep-Alive 헤더 필드와 Connection 헤더 필드를 붙여서 리스폰스한다.

1
Connection: Keep-Alive

Date

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

1
Date: Tue, 10 Mar 2020 11:00:59 GMT

Pragma

1
Pragma: no-cache
  • HTTP/1.1보다 오래된 버전의 흔적으로, HTTP/1.0과의 후방 호환성만을 위해서 정의되어 있는 헤더 필드
  • 일반 헤더 필드이지만, 클라이언트의 리퀘스트에서만 사용된다.
    (서버의 리스폰스에서는 사용하지 않는다.)
    클라이언트에서 중간 서버로 캐시가 필요 없다고 보내고 싶을 때 사용한다.

  • 중간 서버의 HTTP 버전을 모두 파악한 후에 리퀘스트를 보내는 일은 현실적으로 없다.
    때문에 아래와 같이 양쪽을 보내는 경우도 있다.

1
2
Cache-Control: no-cache
Pragma: no-cache

Trailer

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

  • 클라이언트 -> 중간 서버
1
2
3
4
5
6
7
8
9
10
11
12
HTTP/1.1 200 OK
Date: Tue, 03, Jul 2012 04:40:56 GMT
Content-Type: text/html
#...
Transfer-Encoding: chunked
# Trailer 헤더 필드에 Expires를 지정한다.
Trailer: Expires

#(메시지 바디)
# 메시지 바디의 뒤(청크의 길이가 0의 뒤)에 Expires 헤더 필드를 나타내고 있다.
0
Expires: Tue, 28 Sep 2004 23:59:59 GMT

Transfer-Encoding

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

1
2
# 청크 전송 코딩이 유효한 상태
Transfer-Encoding: chunked

Upgrade

HTTP 및 다른 프로토콜의 새로운 버전이 통신에 이용되는 경우 사용
지정하는 대상이 전혀 다른 통신 프로토콜이라고 하더라도 문제 없다.

  • 클라이언트 -> 서버
1
2
3
GET/inde.htm HTTP/1.1
Upgrade: TLS/1.0
Connection: Upgrade
  • 서버 -> 클라이언트
1
2
3
HTTP/1.1 101 Switching Protocols
Upgrade: TLS/1.0, HTTP/1.1
Connection: Upgrade

Upgrade 헤더 필드에 TLS/1.0이 지정되어 있다.
양쪽 모두 Connection 헤더 필드가 지정되어 있다.
Upgrade 헤더 필드에 의해서 업그레이드 되는 대상은 클라이언트와 인접한 서버 뿐이므로
Connection: Upgrade도 지정해주어야 한다.

Upgrade 헤더 필드가 달린 리퀘스트에 대해서 서버측에서는
상태 코드 101 Switching Protocols라는 리스폰스로 응답 가능하다.


Via

클라이언트와 서버 간의 리퀘스트 혹은 리스폰스 메시지의 경로를 알기 위해 사용
프록시나 게이트웨이는 자신의 서버 정보를 Via 헤더 필드에 추가한 뒤에 메시지를 전송한다.

Via 헤더 필드는 전송된 메시지의 추적과 리퀘스트 루프의 회피 등에 사용되기 때문에
프록시를 경유하는 경우에는 반드시 추가해야 한다.

  • 클라이언트 -> 프록시 서버 A
1
GET/HTTP/1.1
  • 프록시 서버 A -> 프록시 서버 B
1
2
GET/HTTP/1.1
Via: 1.0 gw.hackr.jp(Squid/3.1)
  • 프록시 서버 B -> 오리진 서버
1
2
3
GET/HTTP/1.1
Via: 1.0 gw.hackr.jp(Squid/3.1),
1.1 a1.exmaple.com(Squid/2.7)

Warning

HTTP/1.0 리스폰스 헤더(Retry-After)가 HTTP/1.1에서 변경된 것
리스폰스에 관한 추가 정보(캐시에 관한 문제의 경고)를 유저에게 전달한다.

1
2
3
# Warning: [경고 코드][경고한 호스트:포트 번호]"[경고문]" ([날짜])
Warning: 113 gw hackr.jp:8080 "Heuristic expiration"Tue, 03 Jul =>
2012 05:09::44 GMT