このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docs コミュニティーについてもっと知り、仲間になるにはこちらから。

View in English Always switch to English

Content-Digest ヘッダー

HTTP の Content-Digest リクエスト・レスポンスヘッダーは、メッセージのコンテンツにハッシュアルゴリズムを適用して計算されたダイジェストを提供します。 受信側は、完全性を確認するために、Content-Digest を使用して HTTP メッセージのコンテンツを検証することができます。

Want-Content-Digest フィールドを使用すると、送信者はハッシュアルゴリズムの設定とともに Content-Digest をリクエストすることができます。 コンテンツダイジェストは、Content-Encoding および Content-Range によって異なりますが、Transfer-Encoding による違いはありません。

場合によっては、Repr-Digest を使用することができます。これにより、部分メッセージやマルチパートメッセージの完全性を、完全な表現と照合して検証することができます。 例えば、範囲リクエストの場合、リクエストされたバイト範囲のみが異なる場合、Repr-Digest の値は常に同じになりますが、コンテンツダイジェストはそれぞれのパートで異なります。 このため、単一のメッセージで表現が送信される場合、Content-Digest は Repr-Digest と同一となります。

ヘッダー種別 リクエストヘッダー, レスポンスヘッダー, 表現ヘッダー
禁止リクエストヘッダー いいえ

構文

http
Content-Digest: <digest-algorithm>=<digest-value>

// 複数のダイジェストアルゴリズム
Content-Digest: <digest-algorithm>=<digest-value>,<digest-algorithm>=<digest-value>, …

Content-Digest は構造化フィールド辞書 (RFC 9651: Structured Field Values for HTTP) であり、そのキーは <digest-algorithm> で、値は <digest-value> です。

ディレクティブ

<digest-algorithm>

メッセージのコンテンツのダイジェストを作成するために使用するアルゴリズム。 安全であると見なされる登録済みのダイジェストアルゴリズムは、sha-512 と sha-256 の 2 つだけです。 安全でない(古い)登録済みダイジェストアルゴリズムは、md5、sha (SHA-1)、unixsum、unixcksum、adler (ADLER32)、crc32c です。

<digest-value>

<digest-algorithm> を使用して生成されたメッセージコンテンツのダイジェストを、base64 でエンコードし、コロン (:, ASCII 0x3A) で囲んだもの。このエンコード方式は、仕様書においてバイトシーケンスと呼ばれています。

例

これらすべての例において、エンドポイントは、要求されていないダイジェストヘッダーを送信するように設定されています。送信者は、必要に応じて Want-Content-Digest および Want-Repr-Digest フィールドを使用して、ハッシュアルゴリズムの環境設定とともに Content-Digest または Repr-Digest をリクエストすることができます。

レスポンス内の SHA-256 Content-Digest

ユーザーエージェントが次のようにリソースをリクエストしたとします。

http
GET /items/123 HTTP/1.1
Host: example.com

サーバーは、SHA-256 アルゴリズムを使用してメッセージのコンテンツの Content-Digest を返します。 ダイジェストは、メッセージ本体 {"hello": "mdn"} の正確なバイト数(16 バイト。末尾の改行は明示的に含まれない)に基づいて計算されます。

http
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 16
Content-Digest: sha-256=:bMGjiT1wkArOzyB9ReAdpW51FV4mHlQygPXGp+TtzG4=:

{"hello": "mdn"}

Content-Digest と Repr-Digest の値が同一である場合

ユーザーエージェントが次のようにリソースをリクエストしたとします。

http
GET /items/123 HTTP/1.1
Host: example.com

サーバーは、SHA-256 アルゴリズムを使用してメッセージコンテンツの Content-Digest および Repr-Digest を返します。 Repr-Digest フィールドと Content-Digest フィールドの値が一致するのは、これらが同じバイト列 {"hello": "mdn"}(16 バイト)に対して同じアルゴリズムを用いて計算されているためであり、この場合、表現全体が 1 つのメッセージで送信されます。

http
HTTP/1.1 200 OK
Content-Type: application/json
Content-Length: 16
Content-Digest: sha-256=:bMGjiT1wkArOzyB9ReAdpW51FV4mHlQygPXGp+TtzG4=:
Repr-Digest: sha-256=:bMGjiT1wkArOzyB9ReAdpW51FV4mHlQygPXGp+TtzG4=:

{"hello": "mdn"}

Content-Digest と Repr-Digest の値が一致しない場合

ユーザーエージェントがリソースの一部だけを、次のような範囲リクエストでリクエストしたとします。

http
GET /items/123 HTTP/1.1
Host: example.com
Range: bytes=0-7

サーバーは 206 Partial Content レスポンスを返し、その中にはリクエストされたバイト数のみ、{"hello"(8 バイト)がメッセージのコンテンツとして含まれます。 Content-Digest はこれらのバイト列のみが対象になるのに対し、Repr-Digest は表現全体である {"hello": "mdn"}(16 バイト)が対象となるため、この 2 つの値は異なります。

http
HTTP/1.1 206 Partial Content
Content-Type: application/json
Content-Range: bytes 0-7/16
Content-Digest: sha-256=:pKQv0IAKChzGfyfxu5TNqcnvxIzaG4XICf6NQnB1YhY=:
Repr-Digest: sha-256=:bMGjiT1wkArOzyB9ReAdpW51FV4mHlQygPXGp+TtzG4=:

gzip 圧縮された表現のダイジェスト

このリクエストでは、クライアントは Accept-Encoding ヘッダーを使用して、gzip 圧縮を受け入れることを示しています。

http
GET /items/123 HTTP/1.1
Host: example.com
Accept-Encoding: gzip

サーバーのレスポンスには Content-Encoding ヘッダーが含まれており、メッセージのバイト列がリソースの gzip 形式の表現から取得されたものであることを示しています。 ダイジェストは、元の非圧縮テキストではなく、gzip エンコードされたバイト列に対して計算されます。 ここでは、16 バイトの JSON 本体 {"hello": "mdn"} が gzip 圧縮されて 36 バイトの表現となり、Content-Digest および Repr-Digest は、その 36 バイトに対して計算されます(読みやすいように、ここでは 16 進数で示しています)。

http
HTTP/1.1 200 OK
Content-Type: application/json
Content-Encoding: gzip
Content-Length: 36
Content-Digest: sha-256=:6Gx6u1ZhhahDLs06Zc6ZEqXxUy8RNjy18CaMucjKOFk=:
Repr-Digest: sha-256=:6Gx6u1ZhhahDLs06Zc6ZEqXxUy8RNjy18CaMucjKOFk=:
1F 8B 08 00 00 00 00 00 02 FF AB 56 CA 48 CD C9 C9 57 B2 52 50 CA 4D C9 53 AA 05 00 35 D8 1D 91 10 00 00 00

コンテンツがない場合の Content-Digest 処理

HEAD メソッドを GET の代わりに使用して同じリソースをリクエストした場合、レスポンスにはコンテンツが含まれません。

http
HEAD /items/123 HTTP/1.1
Host: example.com

Repr-Digest の値は以前と同じです。これは、常に完全な表現である {"hello": "mdn"} に適用されるためです。 ただし、サーバーはレスポンスにコンテンツを送信しないため、Content-Digest ヘッダーを省略できます。

http
HTTP/1.1 200 OK
Content-Type: application/json
Repr-Digest: sha-256=:bMGjiT1wkArOzyB9ReAdpW51FV4mHlQygPXGp+TtzG4=:

コンテンツがない場合に Content-Digest を省略する代わりに、サーバーは空文字列に対して明示的にこれを計算することができます。 RFC 9530 のセクション 6.3 によると、これにより、受信者は、特にダイジェストが HTTP メッセージの署名によって提供されている場合、単にヘッダーが省略されたことだけでなく、コンテンツが追加または除去されていないことを検証できるようになります。

http
HTTP/1.1 200 OK
Content-Type: application/json
Content-Digest: sha-256=:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=:
Repr-Digest: sha-256=:bMGjiT1wkArOzyB9ReAdpW51FV4mHlQygPXGp+TtzG4=:

ユーザーエージェントがリクエストで Content-Digest を送信する場合

次の例では、ユーザーエージェントが SHA-512 を使用してメッセージ内容のダイジェストを送信します。 ダイジェストは、メッセージ本文の正確なバイト数、{"recipient":"Alex","amount":900000000}(39 バイト、末尾の改行は明示的に含まない)に基づいて計算されます。 この単一のリクエストで表現全体が送信されるため、Content-Digest と Repr-Digest の値は同じになります。

http
POST /bank_transfer HTTP/1.1
Host: example.com
Content-Type: application/json
Content-Length: 39
Content-Digest: sha-512=:PlrIZYU3M76B30wGsL0h6O79BoxHTdAG+RnMPjOyECTSJCN/KnYdOrSCCWjxV3ckkyvdRmZ52//M3WbehCXcPw==:
Repr-Digest: sha-512=:PlrIZYU3M76B30wGsL0h6O79BoxHTdAG+RnMPjOyECTSJCN/KnYdOrSCCWjxV3ckkyvdRmZ52//M3WbehCXcPw==:

{"recipient":"Alex","amount":900000000}

仕様書

仕様書
Digest Fields
# section-2

ブラウザーの互換性

このヘッダーには、仕様で定義されたブラウザーとの連携機能はありません(「ブラウザーの互換性」は適用されません)。 開発者は、HTTP ヘッダーを fetch() で設定および取得して、アプリケーション固有の実装動作を実現することができます。

関連情報