とほほのHTTP入門
- HTTPとは
- HTTPのバージョン
- HTTPのサンプル
- メッセージ構文
- メソッド
- ステータス番号
- ヘッダ
- Accept (要求)
- Accept-Charset (要求)
- Accept-Encoding (要求)
- Accept-Language (要求)
- Accept-Ranges (応答)
- Age (応答)
- Allow (要求/応答)
- Authorization (要求)
- Cache-Control (要求/応答)
- Connection (要求/応答)
- Content-Encoding (要求/応答)
- Content-Language (要求/応答)
- Content-Length (要求/応答)
- Content-Location (要求/応答)
- Content-MD5 (要求/応答)
- Content-Range (要求/応答)
- Content-Security-Policy (応答)
- Content-Type (要求/応答)
- Date (要求/応答)
- ETag (応答)
- Expect (要求)
- Expires (要求/応答)
- From (要求)
- Host (要求)
- If-Match (要求)
- If-Modified-Since (要求)
- If-None-Match (要求)
- If-Range (要求)
- If-Unmodified-Since (要求)
- Last-Modified (要求/応答)
- Location (応答)
- Max-Forwards (要求)
- Pragma (要求/応答)
- Proxy-Authenticate (応答)
- Proxy-Authorization (要求)
- Range (要求)
- Referer (要求)
- Referrer-Policy (応答)
- Retry-After (応答)
- Server (応答)
- Strict-Transport-Security (応答)
- TE (要求)
- Trailer (要求/応答)
- Transfer-Encoding (要求/応答)
- Upgrade (要求/応答)
- User-Agent (要求)
- Vary (応答)
- Via (要求/応答)
- Warning (要求/応答)
- WWW-Authenticate (応答)
- X-Content-Type-Options (応答)
- X-Frame-Options (応答)
- その他拡張ヘッダ (要求/応答)
- 仮想ホスト
- 持続的接続
- チャンク
- BASIC認証
- リンク
HTTPとは
- Hypertext Transfer Protocol の略です。
- Webページを送受信するためのプロトコルです。
- 長い間 HTTP/1.1 が使用されていましたが、HTTP/2 や HTTP/3 の使用も急速に広まっています。
- Chrome の開発者ツール(DevTools)の [Network] パネルを右クリックして [Protocol] にチェックをつけることで、通信がどのバージョンで通信しているかを確認することができます。
HTTPのバージョン
HTTP/0.9
1991年に執筆された仕様 (↗) で HTTP/0.9 と呼ばれています。メソッドは GET しかなく、レスポンスコードや HTTP ヘッダも定義されていませんでした。
GET /index.html(CRLF)
HTTP/1.0
1992年にドラフト (↗) が執筆され、1996年5月に RFC 1945 (↗) として公開されました。
- URI の後ろにバージョン番号が追加されました。
- メソッドは GET, HEAD, POST, PUT, DELETE, LINK, UNLINK をサポートします。
- 200 OK や 404 Not Found などの HTTPステータスが定義されました。
Content-Type
やUser-Agent
などの HTTPヘッダが定義されました。
GET /index.html HTTP/1.0(CRLF)
HTTP/1.1
1997年1月に RFC 2068 (↗) が策定され、1999年6月の RFC 2616 (↗)、2022年6月の RFC 9122 (↗) の改訂版があります。
- Host ヘッダが必須となり、同じIPアドレスのサーバが Host で指定されたホスト名によって処理を振り分ける名前ベースのバーチャルホストがサポートされました。
- ひとつの接続で複数の要求をシーケンシャルに要求することができるようになりました。
- チャンク機能がサポートされ、巨大なデータを分割して応答できるようになりました。
GET /index.html HTTP/1.1(CRLF) Host: www.example.com
HTTP/1.1 の頃の詳細は下記のページで紹介しています。
HTTP/2
2015年5月に RFC 7540 (↗)、2022年6月に RFC 9113 (↗) として公開されました。
- Google が開発した HTTP 互換プロトコル SPDY 3.1 をベースとしています。
- 通信はテキストベースではなくバイナリでやり取りします。
- HTTPのヘッダ情報もバイナリに圧縮して送受信します。
- ひとつの接続で複数の要求を並行で処理することができるようになりました。
- サーバープッシュ機能でクライアントが要求するであろうデータ(画像やCSSなど)をサーバーが先行送信できるようになりました。
- 現時点 (2024年12月) の HTTP/2 使用率は 34.5% だそうです。(↗)
サーバー・クライアント双方が HTTP/2 をサポートしていることを確認する手順は3種類あります。
- TLS の拡張仕様である ALPN(Application-Layer Protocol Negotiation) という機能を使用してネゴシエーションする。HTTPS が必須。
- HTTP を使用する場合は、HTTP/1.1 で通信を開始し、下記のネゴシエーションを行う。
- HTTP/2 をサポートするクライアントは HTTP/1.1 リクエストに
Upgrade: h2c
ヘッダをつけて要求する。 - HTTP/2 をサポートするサーバーは
101 Switching Protocols
ステータスを返し、双方が HTTP/2 通信にアップグレードする。
- HTTP/2 をサポートするクライアントは HTTP/1.1 リクエストに
- あらかじめ、双方が HTTP/2 をサポートしていることを知っておき、最初から HTTP/2 で通信する。
HTTP/3
2022年6月に RFC 9114 (↗) として公開されました。
- Google が開発していた TCP に代わるトランスポート層プロトコル QUIC を使用します。
- QUIC は TCP の代わりに UDP 上に独自のトランスポート層を持ち、TLS 1.3 に相当するセキュリティ機能も取り込んでいます。
- ポート番号は UDP 443番を使用します。
- HTTPS 通信、証明書は必須となります。
- 仕様の古い TCP の代わりに独自の高速プロトコルを使用することで転送効率や速度を向上させています。
- IE を除く大半のブラウザでサポート済です。
- 現時点 (2024年12月) の HTTP/3 使用率は 33.2% だそうです。(↗)
HTTPのサンプル
ブラウザで Webページを開く際、ブラウザはサーバに下記のような要求メッセージを送信します。
GET / HTTP/1.1 Accept: image/gif, image/jpeg, */* Accept-Language: ja Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.1;) Host: www.xxx.zzz Connection: Keep-Alive
これに対してサーバは下記のような応答メッセージを返します。
HTTP/1.1 200 OK Date: Sun, 11 Jan 2004 16:06:23 GMT Server: Apache/1.3.22 (Unix) (Red-Hat/Linux) Last-Modified: Sun, 07 Dec 2003 12:34:18 GMT ETag: "1dba6-131b-3fd31e4a" Accept-Ranges: bytes Content-Length: 4891 Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Content-Type: text/html <!DOCTYPE html> <html> : </html>
メッセージ構文
要求メッセージは、次の構文から構成されます。
GET / HTTP/1.1 リクエスト行
Accept: image/gif, image/jpeg, */* ヘッダ
Accept-Language: ja
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.1;)
Host: www.xxx.zzz
Connection: Keep-Alive
空行
メッセージボディ(POSTメソッドなどで使用)
応答メッセージは、次の構文から構成されます。
HTTP/1.1 200 OK レスポンス行
Date: Sun, 11 Jan 2004 16:06:23 GMT ヘッダ
Server: Apache/1.3.22 (Unix) (Red-Hat/Linux)
Last-Modified: Sun, 07 Dec 2003 12:34:18 GMT
ETag: "1dba6-131b-3fd31e4a"
Accept-Ranges: bytes
Content-Length: 4891
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/html
空行
<!DOCTYPE html> メッセージボディ
<html>
:
</html>
改行コードは Windows 形式の CR LF("\r\n")です。1行目に リクエスト行 または レスポンス行 があり、次に ヘッダ が数行あり、次に空行が1行あり、次にメッセージボディが複数行あります。
リクエスト行
リクエスト行は下記の書式で表します。
メソッド パス名 HTTP/バージョン
パス名は通常、/aaa/bbb/ccc.html のような、スラッシュで始まるパス名や、http:// などで始まる URL が指定されます。バージョンは現在は 1.1 が主流です。
レスポンス行
レスポンス行は下記の書式で表します。
HTTP/バージョン ステータス番号 補足メッセージ
補足メッセージには、OK や Not Found など、ステータス番号の意味や詳細を補足するメッセージが返されます。
メソッド
HTTP/1.0、HTTP/1.1 でサポートされているメソッドを下記に示します。
GET
クライアントはサーバーに対してコンテンツの取得を要求します。最も一般的に使用されるメソッドです。検索キーなどのフィルタ情報は通常パス名に付加して送信します。GET メソッドを使用する場合、コンテンツ(本文)を送信するとエラーになるシステムもあります。
GET /search?keyword=FOO HTTP/1.1 Host: www.example.com
POST
クライアントはサーバーに対してパラメーターを送信します。フォームデータを送信する場合は Content-Type に application/x-www-form-urlencoded を指定します。
POST /search HTTP/1.1 Host: www.example.com Content-Type: application/x-www-form-urlencoded keyword=FOO&page=3
API で JSON パラメータを送信する際は Content-Type に application/json を指定します。
POST /search HTTP/1.1 Host: www.example.com Content-Type: application/json {"keyword":"FOO","page":3}
REST-API では、リソースの作成は POST、リソースの全変更は PUT、リソースの一部変更は PATCH、リソースの削除は DELETE を使用しますが、PUT や PATCH の代わりに POST を使用する例も多いようです。
PUT
クライアントはサーバーに対してリソース全体書き換えを要求します。一部の変更を求める場合は PATCH、全体の変更を求める場合は PUT を使用するのが一般的です。
PATCH
クライアントはサーバーに対してリソースの一部の書き換えを要求します。一部の変更を求める場合は PATCH、全体の変更を求める場合は PUT を使用するのが一般的です。HTTP/1.1 からサポートされます。
DELETE
クライアントはサーバーに対してリソースの削除を要求します。
HEAD
クライアントはサーバーに対して GET と同じレスポンスを、ヘッダ情報のみ返却することを求めます。コンテンツサイズやコンテンツタイプを調べたい時などに要求されます。
CONNECT
クライアントはプロキシサーバー経由で HTTPS 通信を行う際、プロキシサーバーにトンネリングを張ることを要求します。HTTP/1.1 からサポートされます。
CONNECT www.example.com:443 HTTP/1.1
OPTIONS
クライアントはサーバーがサポートしているメソッドの一覧の返却を要求します。サーバーは Allow ヘッダで一覧を返却します。HTTP/1.1 からサポートされます。
OPTIONS /index.html HTTP/1.1
HTTP/1.1 200 OK Allow: HEAD,GET,POST,OPTIONS,TRACE
TRACE
HTTP要求がどのプロキシサーバを経由して送信されるかなど、HTTP の動作をトレースする際に用います。このメッセージを受け取った最後のサーバは、要求メッセージに含まれるエンティティ(通常はヘッダ+メッセージボディ)をそのまま返します。HTTP/1.1 からサポートされます。
TRACE / HTTP/1.1 Host: www.example.com
LINK
指定した URL とリソースにリンク関係を結びます。HTTP/1.1 では廃止されました。
UNLINK
指定した URL とリソースの間のリンク関係を解除します。HTTP/1.1 では廃止されました。
ステータス番号
応答メッセージにはステータス番号が含まれます。
情報系(100)
- 100 Continue
- 処理を継続しています。続きのリクエストを送信してください。
- 101 Switching Protocols
- Upgrade ヘッダで指定したプロトコルに変更して再要求してください。
成功系(200)
- 200 OK
- 成功しました。
- 201 Created
- Location ヘッダで指定した場所に新しいコンテンツが作成されました。
- 202 Accepted
- 要求は受理されました。ただし処理は完了していません。
- 203 Non-Authoritative Information
- 応答ヘッダはオリジナルサーバーが返したものとは異なりますが、処理は成功です。
- 204 No Content
- コンテンツはありませんが、処理は成功しました。
- 205 Reset Content
- 要求を受理したので、現在のコンテンツ(画面)を破棄してください。。
- 206 Partial Content
- コンテンツを一部のみ返却します。
転送系(300)
- 300 Multiple Choices
- コンテンツ入手方法について複数の選択肢があります。
- 301 Moved Permanently
- Location ヘッダで指定された別の場所に移動しました。
- 302 Found
- Location ヘッダで指定された別の場所に見つかりました。そちらを見てください。
- 303 See Other
- Location ヘッダで指定された他の場所を見てください。
- 304 Not Modified
- 更新されていません。If-Modified-Since ヘッダを用いた場合に返却されます。
- 305 Use Proxy
- Location ヘッダで指定したプロキシを使用してください。
- 306 (Unused)
- 未使用。
- 307 Temporary Redirect
- 別の場所に一時的に移動しています。
クライアントエラー系(400)
- 400 Bad Request
- 要求が不正です。
- 401 Unauthorized
- 認証されていません。
- 402 Payment Required
- 支払いが必要です。
- 403 Forbidden
- アクセスが認められていません。
- 404 Not Found
- 見つかりません。
- 405 Method Not Allowed
- 指定したメソッドはサポートされていません。
- 406 Not Acceptable
- 許可されていません。
- 407 Proxy Authentication Required
- プロキシ認証が必要です。
- 408 Request Timeout
- リクエストがタイムアウトしました。
- 409 Conflict
- リクエストがコンフリクト(衝突・矛盾)しました。
- 410 Gone
- 要求されたコンテンツは無くなってしまいました。
- 411 Length Required
- Content-Length ヘッダを付加して要求してください。
- 412 Precondition Failed
- If-... ヘッダで指定された条件に合致しませんでした。
- 413 Request Entity Too Large
- 要求されたエンティティが大きすぎます。
- 414 Request-URI Too Long
- 要求された URI が長すぎます。
- 415 Unsupported Media Type
- サポートされていないメディアタイプです。
- 416 Requested Range Not Satisfiable
- 要求されたレンジが不正です。
- 417 Expectation Failed
- Expect ヘッダで指定された拡張要求は失敗しました。
サーバーエラー系(500)
- 500 Internal Server Error
- サーバーで予期しないエラーが発生しました。
- 501 Not Implemented
- 実装されていません。
- 502 Bad Gateway
- ゲートウェイが不正です。
- 503 Service Unavailable
- サービスは利用可能ではありません。
- 504 Gateway Timeout
- ゲートウェイがタイムアウトしました。
- 505 HTTP Version Not Supported
- このHTTPバージョンはサポートされていません。
ヘッダ
カテゴリ | 要求 | 応答 | ヘッダ |
---|---|---|---|
一般ヘッダ | ○ | ○ | Cache-Control, Connection, Date, Pragma, Trailer, Transfer-Encoding, Upgrade, Via, Warning |
要求ヘッダ | ○ | × | Accept, Accept-Charset, Accept-Encoding, Accept-Language, Authorization, Expect, From, Host, If-Match, If-Modified-Since, If-None-Match, If-Range, If-Unmodified-Since, Max-Forwards, Proxy-Authorization, Range, Referer, TE, User-Agent |
応答ヘッダ | × | ○ | Accept-Ranges, Age, ETag, Location, Proxy-Authenticate, Retry-After, Server, Vary, WWW-Authenticate |
要素ヘッダ | ○ | ○ | Allow, Content-Encoding, Content-Language, Content-Length, Content-Location, Content-MD5, Content-Range, Content-Type, Expires, Last-Modified, extension-header |
Accept (要求)
ブラウザが受信可能なデータ形式(MIMEタイプ)をサーバに伝えます。アスタリスク(*)は「すべて」を意味します。下記は、ブラウザが GIF や JPEG、その他どんな形式のデータでも受信可能であることを示します。(→ Content-Type)
Accept: image/gif, image/jpeg, */*
Accept-Charset (要求)
ブラウザが受信可能な文字セットをサーバに伝えます。下記は、ブラウザが iso-8859-5 と Shift_JIS のみを受信可能であることを示します。(→ Content-Type)
Accept-Charset: iso-8859-5, Shift_JIS
Accept-Encoding (要求)
ブラウザが受信可能なエンコード方式をサーバに伝えます。例えば、ブラウザが gzip 形式をサポートしていることをサーバに伝え、サーバはメッセージボディを自動的に gzip 圧縮してブラウザに送り、ブラウザ側がこれを自動的に解凍して画面に表示します。こうした機構により、通信負荷を低減することが可能です。(→ Content-Encoding)
Accept-Encoding: gzip, deflate
Accept-Language (要求)
ブラウザが受信可能な言語をサーバに伝えます。下記は、ブラウザが日本語のみを受信可能であることを意味します。(→ Content-Language)
Accept-Language: ja
Accept-Ranges (応答)
Range 要求において使用可能な単位をクライアントに伝えます。現在定義されているのは bytes のみです。(→ Range、Content-Range)
Accept-Ranges: bytes
Age (応答)
エンティティが生成されてからの予測経過時間(秒)を示します。下記の例では、このエンティティがおそらく、プロキシサーバで 30秒間程度保持されたもの、つまり、30秒程度古いデータであることを示します。
Age: 30
Allow (要求/応答)
要求URL で示すリソースに対して使用可能なメソッドの一覧を示します。下記の例では、このリソースに対して GET、HEAD、PUT メソッドを使用可能であることを示します。
Allow: GET, HEAD, PUT
Authorization (要求)
認証が必要なリソースに対して認証情報を伝えます。例えば、BASIC認証の場合は、Basic の文字と、ユーザ名とパスワードをコロン(:)で連結したものを BASE64 形式にエンコードしたものを転送します。(→ WWW-Authenticate)
Authorization: Basic dGFuYWthOmhpbWl0c3U=
Cache-Control (要求/応答)
キャッシュに関する指示を表します。下記の例では、プロキシサーバやクライアントがこのリソースをキャッシュしてはならないことを示しています。HTTP/1.0 では Pragma: no-cache が使用されます。(→ Pragma)
Cache-Control: no-cache
Connection (要求/応答)
HTTP/1.1 でサポートされた持続接続機能をブラウザがサポートしている場合、その旨を相手に伝えます。持続接続を用いることにより、1回の接続で複数のリクエスト/レスポンスを発行することが可能になります。
Connection: Keep-Alive
持続接続を完了する場合、サーバは close を返却します。
Connection: close
その他にも、サーバ・プロキシ間、プロキシ・クライアント間のような直接接続にのみ有効なヘッダの一覧を示すために用いられます。プロキシサーバはこのヘッダで指定されたヘッダ情報を削除して、転送しなくてはなりません。
Connection: Upgrade
Content-Encoding (要求/応答)
コンテンツのエンコード方式を示します。下記は、コンテンツが gzip 形式で圧縮されていることを示します。(→ Accept-Encoding)
Content-Encoding: gzip
Content-Language (要求/応答)
コンテンツの言語を en(英語)、ja(日本語)などで示します。
Content-Language: ja
Content-Length (要求/応答)
コンテンツ(=メッセージボディ)の長さをバイト単位で示します。ヘッダとメッセージボディの間の改行のバイト数は除きます。
Content-Length: 4891
Content-Location (要求/応答)
コンテンツが別の URL でもアクセス可能なとき、そのエンティティの URL を絶対URL または相対URL で示します。(→ Location)
Location: http://xxx.yyy.zzz/index.htm
Content-MD5 (要求/応答)
コンテンツが通信途中で改変されていないかをチェックするために、コンテンツに関するチェックデータ(128ビットのMD5ダイジェストをBASE64エンコードしたもの)を示します。
Content-MD5: GitH4qFa4GasgWxJs8ha5Q==
Content-Range (要求/応答)
相手に送信するコンテンツの範囲を示します。下記の例では、コンテンツ全体は 12345バイトあり、その中の 0バイト目から 999バイト目の部分を送信していることを示します。(→ Range、Accept-Ranges)
Content-Range: bytes 0-999/12345
Content-Security-Policy (応答)
略して CSP と呼ばれます。セキュリティに関わる様々な設定を行います。詳細は MDN を参照してください。
Content-Security-Policy: frame-ancestors https://example.com
Content-Type (要求/応答)
コンテンツの種別を MIMEタイプで示します。下記は、コンテンツの内容がテキスト(HTML)形式であることを示します。
Content-Type: text/html
加えて、文字コード(Shift_JIS、euc-jp、ISO-2022-JP、UTF-8 など)を示すこともできます。
Content-Type: text/html; charset=Shift_JIS
Date (要求/応答)
応答を返す時刻を示します。曜日(Sun,)は省略可能です。日付は 1 でも 01 でも構いません。年は 2桁でも 4桁でも構いませんが 4桁が推奨されています。秒(:23)は省略可能です。時間帯は GMT(グリニッジ標準時)を用いることが多いようです。
Date: Sun, 04 Jan 2004 16:06:23 GMT
ETag (応答)
エンティティとそのバージョンを一意に識別する識別子を示します。識別子は、ファイル識別子やサイズ、更新時刻などの情報から計算されます。(→ If-Match、If-None-Match、If-Range)
ETag: "1dba6-131b-3fd31e4a"
Expect (要求)
いろいろな目的で使用されます。
Expect: 100-continue
Expires (要求/応答)
エンティティの有効期限を示します。有効期限を過ぎたエンティティはキャッシュから削除されます。
Expires: Thu, 01 Dec 1994 16:00:00 GMT
From (要求)
この要求を行った人のメールアドレスを指定します。検索エンジンがロボットで探索する場合に、探索に関する問い合わせ先のメールアドレスを通知する際などに利用されます。
From: aaa@xxx.yyy.zzz
Host (要求)
HTTP/1.1 で唯一の必須ヘッダです。ブラウザからサーバに対して、サーバ名を送信します。サーバが名前ベースの仮想ホストをサポートしている場合、この名前を手がかりにどのサーバとして振舞うか決定されます。例えば、http://aaa.sample.dom/ と http://bbb.sample.dom/ は実は同じサーバ(IPアドレス:61.206.47.206)ですが、Host ヘッダでホスト名を指定することにより、仮想的に 2つのサーバとして振舞うことが可能になります。
Host: aaa.sample.dom
If-Match (要求)
指定した ETag にマッチする場合にのみ、メソッドを実行することをサーバに依頼します。(→ ETag、If-None-Match)
If-Match: "1dba6-131b-3fd31e4a"
If-Modified-Since (要求)
クライアント側がすでにキャッシュを持っている場合、キャッシュの日付をサーバに通知し、「この日付よりも新しいものがあれば転送してくれ」と要求します。もし、更新されていなければサーバは 304(not modified)ステータスを返し、ブラウザはキャッシュしていたデータを表示します。(→ If-Unmodified-Since)
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
If-None-Match (要求)
指定した ETag にマッチしない場合にのみ、メソッドを実行することをサーバに依頼します。(→ ETag、If-Match)
If-None-Match: "1dba6-131b-3fd31e4a"
If-Range (要求)
クライアントが、エンティティの一部をすでに保持している場合に、「もし、この ETag で指定したエンティティの一部が最新のものであるならば、残りのすべてを、さもなくば全体を送信してくれ」の意味で要求します。Range ヘッダと組み合わせて使用します。(→ ETag、Range)
Range: bytes=0-1023 If-Range: "1dba6-131b-3fd31e4a"
If-Unmodified-Since (要求)
エンティティが、指定した日付よりもあとに更新されていなければ、要求を処理します。更新されている場合、サーバは 412(Precondition Failed)ステータスを返します。(→ If-Modified-Since)
If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT
Last-Modified (要求/応答)
エンティティが最後に更新された時刻を示します。(→ If-Modified-Since)
Last-Modified: Sun, 07 Dec 2003 12:34:18 GMT
Location (応答)
エンティティの場所が移動した場合など、ブラウザが要求した URL とは別の URL にジャンプさせたい場合に使用します。URL には http:// や https:// で始まる絶対URL を指定します。(→ Content-Location)
Location: http://www.yyy.zzz/aaa.html
Max-Forwards (要求)
OPTIONS や TRACE メソッドにおいて、プロキシサーバの最大ホップ数を指定します。プロキシサーバはこの値をひとつ減算して、次のプロキシサーバに転送します。この値が 0 になると、プロキシサーバは最後の受信者として応答を返します。
Max-Forwards: 16
Pragma (要求/応答)
様々な目的で使用されます。例えば、下記はキャッシュを禁止する旨をプロキシサーバやクライアントに通知します。(→ Cache-Control)
Pragma: no-cache
Proxy-Authenticate (応答)
プロキシサーバとクライアントの間で認証が必要であることを示します。(→ Proxy-Authorization、WWW-Authenticate)
Proxy-Authenticate: Basic realm="XXXXXX"
Proxy-Authorization (要求)
プロキシサーバとクライアント間の認証情報を渡します。(→ Proxy-Authenticate、Authorization)
Proxy-Authorization: Basic dGFuYWthOmhpbWl0c3U=
Range (要求)
クライアントからサーバに対して、エンティティの一部のみを要求します。下記の例では、ページの最初の 1000バイト(0バイト目から 999バイト目)のみを要求しています。(→ Accept-Ranges、Content-Range、If-Range)
Range: bytes=0-999
Referer (要求)
この要求の元となったページの URL(通常はリンク元のURL)を通知します。
Referer: http://xxx.yyy.zzz/index.html
Referrer-Policy (応答)
クライアントに Referer 情報をどの程度送信して欲しいかを指定します。デフォルト動作はブラウザにより異なります。Chrome は 2020年に origin-when-cross-origin
をデフォルトに変更しました。
- no-refer : 常に含めない
- no-referrer-when-downgrade : HTTPSからHTTPやfile://にダウングレードする時は含めない
- origin : オリジン情報(プロトコル+ホスト+ポート)のみを送信する
- origin-when-cross-origin : HTTPSからダウングレードしたり他オリジンに移動する時はオリジン情報のみ
- same-origin : 同一オリジンの時は送信する。他オリジンに移動する時は送信しない
- strict-origin : オリジン情報のみを送信する。ただしHTTPSからダウングレードした時には送信しない
- strict-origin-when-cross-origin : 同一オリジンの時は送信。他オリジンでダウングレードしない時はオリジン情報のみ。ダウングレードする時は送信しない。
- unsafe-url : 常に送信する
Referrer-Policy: no-referrer Referrer-Policy: no-referrer-when-downgrade Referrer-Policy: origin Referrer-Policy: origin-when-cross-origin Referrer-Policy: same-origin Referrer-Policy: strict-origin Referrer-Policy: strict-origin-when-cross-origin Referrer-Policy: unsafe-url
Retry-After (応答)
数秒後に再度要求してくれという意味で、503(Service Unavailable)や 3xx(Redirection)ステータスとともに返されます。下記は、後120秒後に再要求してくれの意味を持ちます。Date: 形式の絶対時刻が返されることもあります。
Retry-After: 120
Server (応答)
サーバからブラウザに対してサーバ情報を返します。フォーマットは特に規定はありません。
Server: Apache/1.3.22 (Unix) (Red-Hat/Linux)
Strict-Transport-Security (応答)
HTTP Strict-Transport-Security の略で HSTS と呼ばれます。クライアントからの通信を HTTPS に限定します。HTTP を HTTPS にリダイレクトする場合、一瞬でも HTTP アクセスが発生するため応答を偽造されると悪意のサイトにリダイレクトされてしまうことがあります。一度このヘッダを返却しておくと、以後、クライアントは URL に http://
が指定されても https://
でアクセスするようになります。
- max-age=seconds : この設定をブラウザに記憶させておく秒数。1年程度。
- includeSubDomains : すべてのサブドメインにも適用する。
- preload : Googleが提供する HSTS事前読み込みサービス を利用する
Strict-Transport-Security: max-age=31536000; includeSubDomains
TE (要求)
ブラウザが処理可能な拡張転送コーディング方式(chunked など)や、チャンク転送の際の trailer フィールドを解釈可能かどうかをサーバに伝えます。
TE: trailers
Trailer (要求/応答)
ヘッダ情報をコンテンツの先頭ではなく、チャンク形式で分割送信されたコンテンツの後ろに付加する場合、そこに付加されたヘッダの一覧を示します。これは、CGI がデータ送信した後に Content-Length ヘッダを付加したい場合などに役立ちます。
Trailer: Content-Length
Transfer-Encoding (要求/応答)
転送に使用されるエンコード形式を示します。
Transfer-Encoding: chunked
Upgrade (要求/応答)
別のプロトコルを用いることを推奨する旨を相手に伝えます。クライアント・プロキシ間のような直接接続にのみ有効です。
Upgrade: HTTP/2.0, SHTTP/1.3
User-Agent (要求)
ブラウザ(=ユーザエージェント)の情報をサーバに伝えます。フォーマットは特に規定はありません。ブラウザの種別やバージョン、プラットフォームなどの情報が含まれます。下記は、Mozilla/4.0(=Netscape Navigator 4.0)と互換性のある Microsoft の IE 6.0 で、OS は Windows NT 5.1(=Windows XP)であることを示しています。(→ Server)
User-Agent: Mozilla/4.0 (Compatible; MSIE 6.0; Windows NT 5.1;)
Vary (応答)
Accept、Accept-Charset、Accept-Language など、サーバ主導型ネゴシエーションで使用されたヘッダ情報を示します。これは、キャッシュの有効性を判断する際に役立ちます。例えば、下記の例には Accept-Language が含まれています。これは、ブラウザが Accept-Language: ja を送信したためにサーバーが日本語のコンテンツを返却している可能性があり、Accept-Language: en で要求すると別の別のコンテンツが返却される可能性があることを示します。
Vary: Accept-Charset, Accept-Language
Via (要求/応答)
メッセージの転送経路を示します。下記の例では、メッセージが aaa → bbb → ccc というプロキシを経路して転送されたことを示します。1.1 はプロトコルバージョンです。
Via: 1.1 aaa, 1.1 bbb, 1.1 ccc
Warning (要求/応答)
ステータス行に付加されるワーニングコードとメッセージを伝えます。
Warning: 110 xxxsv "Response is stale"
WWW-Authenticate (応答)
認証が必要であることを示します。下記の例では、このリソースが BASIC認証という、HTTP で最も基本的な方式で保護されていることを示します。XXXXXX の部分にはこの認証に関する説明文が入ります。(→ Authorization)
WWW-Authenticate: Basic realm="XXXXXX"
X-Content-Type-Options (応答)
Content-Type ヘッダに関する指定を行います。英語の sniff は「嗅ぎわける」という意味を持ちますが、nosniff を指定すると、コンテンツの中身を嗅ぎわけてファイル種別を自動判断せず、Content-Type
ヘッダの値をそのまま受け入れなさいという意味になります。IE などのブラウザで Content-Type
ヘッダの値を無視してコンテンツの中身を自動判別する機能が実装され、これを悪用してスクリプトと判断させるコンテンツを埋め込む攻撃が出てきたことからその対策として実装されました。
X-Content-Type-Options: nosniff
X-Frame-Options (応答)
このページが <iframe>
, <frame>
, <embed>
, <object>
要素の中でどのようにふるまうかを指定します。SAMEORIGIN を指定すると同じオリジン(プロトコル+ホスト+ポート番号)の場合は表示を許可し、異なるオリジンの場合は表示を拒絶します。DENY を指定するとオリジンに関わらず表示を拒絶します。このヘッダは非推奨となっています。代わりに Content-Security-Policy ヘッダに frame-ancestors
を指定してください。
X-Frame-Options: SAMEORIGIN
その他拡張ヘッダ (要求/応答)
上記の他にも、サーバの実装により様々なヘッダが実装されています。
仮想ホスト
HTTP/1.1 では仮想ホストがサポートされました。HTTP/1.1 のクライアントは Host ヘッダでホスト名を送信しなくてはなりません。サーバーは、仮想ホストに対応したコンテンツを応答します。これにより、1台のサーバーで複数のWebサイトをサポートすることが可能になりました。
GET / HTTP/1.1 Host: www.tohoho-web.com
持続的接続
HTTP/1.1 では持続的接続が標準となりました。クライアントは下記のように 1回の TCP接続で複数のコンテンツを要求することにより、通信パフォーマンスを向上させることができます。持続接続を継続する場合には通常 Connection ヘッダで Keep-Alive を、最後の要求には close を指定します。
GET /aaa.html HTTP/1.1 Host: www.tohoho-web.com Connection: Keep-Alive GET /bbb.html HTTP/1.1 Host: www.tohoho-web.com Connection: close
これに対し、サーバーは Content-Length やチャンク(後述)などで複数のコンテンツの境界が明示されたコンテンツを返却します。timeout には次の要求が来ない場合にタイムアウトを発生させる時間(秒数)、max にはこの持続接続で要求可能な要求の残り回数が指定されます。
HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1234 Keep-Alive: timeout=5, max=100 Connection: Keep-Alive (aaa.html のコンテンツ) HTTP/1.1 200 OK Content-Type: text/html Content-Length: 1234 Keep-Alive: timeout=5, max=99 Connection: close (bbb.html のコンテンツ)
チャンク
CGI の結果返却でコンテンツ生成時にはまだコンテンツの長さが分からない場合など、サーバーはチャンク形式のデータを返却することができます。チャンク形式のデータでは、継続するデータのバイト数が 16進数で示されます。0 はデータの終わりを意味します。
HTTP/1.1 200 OK Content-Type: text/html Transfer-Encoding: chunked 1234 (16進数で1234バイトのデータ) 9ab (16進数で9abバイトのデータ) 0 (コンテンツの終了)
BASIC認証
HTTP のベーシック認証を用いた場合、サーバーは、クライアントからの要求に対して WWW-Authenticate ヘッダを返します。
HTTP/1.1 200 OK WWW-Authenticate: Basic realm="HIMITSU No PAGE"
クライアントは、WWW-Authenticate ヘッダを受け取るとログイン名とパスワードの入力を促すダイアログを表示し、ユーザーが入力したログイン名とパスワードをエンコードして再度コンテンツの取得を試みます。
HTTP/1.1 200 OK Host: www.tohoho-web.com Authorization: Basic abcdEFGhiJklM==
リンク
現在の仕様書
- HTTP Semantics (RFC 9110) (2022年6月)
- HTTP Caching (RFC 9111) (2022年6月)
- HTTP/1.1 (RFC 9112) (2022年6月)
- HTTP/2 (RFC 9113) (2022年6月)
- HTTP/3 (RFC 9114) (2022年6月)
- Building Protocols with HTTP (RFC 9205) (2022年6月)
破棄された仕様書
- The Original HTTP as defined in 1991 (1991年)
- Basic HTTP as defined in 1992 (1992年)
- Hypertext Transfer Protocol -- HTTP/1.0 (RFC 1945) (1996年5月)
- Hypertext Transfer Protocol -- HTTP/1.1 (RFC 2068) (1997年1月)
- Use and Interpretation of HTTP Version Numbers (RFC 2145) (1997年5月)
- Hypertext Transfer Protocol -- HTTP/1.1 (RFC 2616) (1999年6月)
- HTTP Over TLS (RFC 2818) (2000年5月)
- Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing (RFC 7230) (2014年6月)
- Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content (RFC 7231) (2014年6月)
- Hypertext Transfer Protocol (HTTP/1.1): Conditional Requests (RFC 7232) (2014年6月)
- Hypertext Transfer Protocol (HTTP/1.1): Range Requests (RFC 7233) (2014年6月)
- Hypertext Transfer Protocol (HTTP/1.1): Authentication (RFC 7235) (2014年6月)
- The Hypertext Transfer Protocol Status Code 308 (Permanent Redirect) (RFC 7538) (2015年4月)
- Hypertext Transfer Protocol Version 2 (HTTP/2) (RFC 7540) (2015年5月)
- HTTP Authentication-Info and Proxy-Authentication-Info Response Header Fields (RFC 7615) (2015年9月)
- Hypertext Transfer Protocol (HTTP) Client-Initiated Content-Encoding (RFC 7694) (2015年11月)
- Using TLS 1.3 with HTTP/2 (RFC 8740) (2020年2月)