B.4. HTTP メッセージの変換
B.4. HTTP Message Transformations (HTTP メッセージの変換)
HTTP では中間者やアプリケーションが, メッセージの意味を変えずに HTTP メッセージを変換できる. HTTP メッセージ署名は, 状況に応じてこれらの変換の多くに対して頑健になるよう設計されている.
例えば, 次の HTTP リクエストメッセージは Ed25519 アルゴリズムと鍵 test-key-ed25519 で署名されている.
注: RFC 8792 に従う \ による行の折り返し.
GET /demo?name1=Value1&Name2=value2 HTTP/1.1
Host: example.org
Date: Fri, 15 Jul 2022 14:24:55 GMT
Accept: application/json
Accept: /
Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519"
Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==:
このメッセージの署名ベース文字列は次のとおり.
"@method": GET
"@path": /demo
"@authority": example.org
"accept": application/json, /
"@signature-params": ("@method" "@path" "@authority" "accept")
;created=1618884473;keyid="test-key-ed25519"
次のメッセージは Accept-Language ヘッダーフィールドの追加とクエリパラメータの追加によって改変されている. しかし Accept-Language ヘッダーフィールドもクエリも署名で被覆されていないため, 同じ署名は依然として有効である.
注: RFC 8792 に従う \ による行の折り返し.
GET /demo?name1=Value1&Name2=value2¶m=added HTTP/1.1
Host: example.org
Date: Fri, 15 Jul 2022 14:24:55 GMT
Accept: application/json
Accept: /
Accept-Language: en-US,en;q=0.5
Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519"
Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==:
次のメッセージは Date ヘッダーフィールドの削除, Referer ヘッダーフィールドの追加, Accept ヘッダーフィールドの 1 行への畳み込みによって改変されている. Date と Referer は署名で被覆されておらず, Accept の畳み込みは HTTP フィールド値の正規化アルゴリズムですでに許容される変換である. 同じ署名は依然として有効である.
注: RFC 8792 に従う \ による行の折り返し.
GET /demo?name1=Value1&Name2=value2 HTTP/1.1
Host: example.org
Referer: https://developer.example.org/demo
Accept: application/json, /
Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519"
Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==:
次のメッセージは元メッセージのフィールド値の並べ替えによって改変されているが, 個々の Accept ヘッダーフィールド同士の順序は入れ替えていない. 同じ署名は依然として有効である.
注: RFC 8792 に従う \ による行の折り返し.
GET /demo?name1=Value1&Name2=value2 HTTP/1.1
Accept: application/json
Accept: /
Date: Fri, 15 Jul 2022 14:24:55 GMT
Host: example.org
Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519"
Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==:
次のメッセージはメソッドを POST に, 権威を Host ヘッダーフィールド内の "example.com" に変更して改変されている. メソッドと権威はいずれも署名で被覆されているため, 同じ署名はもはや有効ではない.
注: RFC 8792 に従う \ による行の折り返し.
POST /demo?name1=Value1&Name2=value2 HTTP/1.1
Host: example.com
Date: Fri, 15 Jul 2022 14:24:55 GMT
Accept: application/json
Accept: /
Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519"
Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==:
次のメッセージは Accept ヘッダーフィールドが 2 つある場合の順序を入れ替えて改変されている. HTTP では同一フィールド名の複数フィールドの順序は意味上重要であるため, 署名ベースで用いる値が変わり, 同じ署名はもはや有効ではない.
注: RFC 8792 に従う \ による行の折り返し.
GET /demo?name1=Value1&Name2=value2 HTTP/1.1
Host: example.org
Date: Fri, 15 Jul 2022 14:24:55 GMT
Accept: /
Accept: application/json
Signature-Input: transform=("@method" "@path" "@authority"
"accept");created=1618884473;keyid="test-key-ed25519"
Signature: transform=:ZT1kooQsEHpZ0I1IjCqtQppOmIqlJPeo7DHR3SoMn0s5J
Z1eRGS0A+vyYP9t/LXlh5QMFFQ6cpLt2m0pmj3NDA==: