[10] 
[DFN[[RUBYB[JOSEヘッダー][JOSE Header]]]]は、
使用する
[[RFC 4949]] [[デジタル署名]]や
[[RFC 4949]] [[MAC]]
の[[演算]]や[[引数]]を記述する
[[JSONオブジェクト]]です。
[SRC[>>8, >>47]]
更に追加の情報も含めることが出来ます。
[SRC[>>47]]


* 仕様書

[REFS[
- [7] [CITE@en[[[RFC 7515]] - JSON Web Signature (JWS)]], [TIME[2019-11-24 17:13:01 +09:00]] <https://tools.ietf.org/html/rfc7515>
-- [8] [CITE@en[RFC 7515 - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#section-2>
-- [47] [CITE@en[RFC 7515 - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#section-4>
-- [142] [CITE@en[RFC 7515 - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#section-9>
-- [148] [CITE@en[RFC 7515 - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#section-10>
- [33] 
[CITE@en[[[RFC 7516]] - JSON Web Encryption (JWE)]], [TIME[2022-11-23T07:27:18.000Z]] <https://datatracker.ietf.org/doc/html/rfc7516#section-4>
- [14] 
[CITE@en[[[RFC 7516]] - JSON Web Encryption (JWE)]], [TIME[2022-11-23T10:33:48.000Z]] <https://datatracker.ietf.org/doc/html/rfc7516#section-5.2>
- [16] 
[CITE@en[[[RFC 7516]] - JSON Web Encryption (JWE)]], [TIME[2022-11-24T09:02:40.000Z]] <https://datatracker.ietf.org/doc/html/rfc7516#section-7.2>


]REFS]

* データモデル

[13] 
[DFN[[RUBYB[ヘッダー引数][Header Parameter]]]]は、
[[JOSEヘッダー]]の[[メンバー]]たる[RUBYB[[[名前]]][name]]と[RUBYB[[[値]]][value]]の[[組]]です。
[SRC[>>8]]

[48] 
[[ヘッダー引数]]の名前は、[[JOSEヘッダー]]内で固有でなければ[MUST[なりません]]。
[[JWS]] [[構文解析器]]は、
[[JWS]]
が[[ヘッダー引数]]の重複を含む時、
これを拒絶するか、
または重複するメンバー名について字句的に最後のもののみ採用する
[[JavaScript]] [CODE[JSON.parse]]
と同じ挙動の [[JSON]] [[構文解析器]]を使うかしなければ[MUST[なりません]]。
[SRC[>>47, >>148]]

[5] 
[[JWE]] でも[[ヘッダー引数]]の名前は固有でなければ[MUST[なりません]]。
[SRC[>>33, >>14]]
各[[受信者]]に対する[[JWE被保護ヘッダー]]、
[[JWE被共有非被保護ヘッダー]]、
[[JWE受信者毎非被保護ヘッダー]]の組み合わせにおいて[[ヘッダー引数]]の名前が[[互いに素]]でなければ[MUST[なりません]]
[SRC[>>16]]。

;; [49] [[JSONオブジェクト]]は、
[CODE[{"name": "value1", "name": "value2"}]]
のごとく同名のメンバーを複数含めることが出来ます。
[[JWS]] はこれを拒絶するか、最後の [CODE[value2]] のみ採用することを求めています。
挙動に曖昧性が認められるのは、
[[相互運用性]]の火種であり、
とりわけ[[セキュリティー]]技術には好ましからざる性質です。
どちらとも実装し得る [[JSON]] 仕様側の問題といえなくもないですが。
[[JSON]] の標準的な実装である [CODE[JSON.parse]]
の挙動、すなわちエラーとせず最後のもののみを採用するのが好ましいと考えられます。


;; [17] 重複メンバーの扱いは[[JWK]]や[[JWK集合]]と同等の規定です。


[1] [[ヘッダー引数]]群にまたがっての[[ヘッダー引数]]の重複も禁止されています。
[SEE[ [[JWS]] ]]

** JWS におけるヘッダー引数

[2] 
[[JWS]] では [[JOSEヘッダー]]における[[JWS被保護ヘッダー]]や[[JWS非被保護ヘッダー]]で使用できます。

** JWE におけるヘッダー引数

[4] 
[[JWE]] では [[JOSEヘッダー]]における[[JWE被保護ヘッダー]],
[[JWE共有非被保護ヘッダー]],
[[JWE受信者毎非被保護ヘッダー]]で使用できます。


* ヘッダー引数の処理


[50] 
[[JWS]] および [[JWE]]
の実装は、理解しなければ[MUST[ならない]]と規定された[[ヘッダー引数]]を、
理解し処理しなければなりません。
[SRC[>>47, >>33]]

[51] 
[[JWS]] および [[JWE]]
の実装は、
それ以外の[[ヘッダー引数]]は、理解できない場合無視しなければ[MUST[なりません]]。
ただし、 [CODE[crit]] が適用されるものを除きます。
[SRC[>>47, >>33]]

** [CODE[crit]] ヘッダー引数

[70] 
[[ヘッダー引数]]
[DFN[[CODE[crit]]]]
(critical)
は、
[[JWS]] や [[JWE]] や [[JWA]] の[[仕様書]]に対する[[拡張][拡張性]]が使われていて、
これを理解して処理しなければ[MUST[ならない]]ことを示すものです。
[SRC[>>69, >>33]]

-*-*-

[71] 
値は、
当該[[拡張][拡張性]]を使う [[JOSEヘッダー]]の[[ヘッダー引数]]名の[[配列][JSON配列]]です。
[SRC[>>69]]

[73] 
[[生成器]]は、
[[JWS]] や [[JWA]] の[[仕様書]]で定められた[[ヘッダー引数]]名を指定しては[MUST[なりません]]。
[SRC[>>69]]

[74] 
[[生成器]]は、
[[ヘッダー引数]]名を重複して指定したり、
[[JOSEヘッダー]]内に出現しない[[ヘッダー引数]]名を指定したりしては[MUST[なりません]]。
[SRC[>>69]]

-*-*-

[79] 
[CODE[crit]] の使用は[MAY[任意]]です。
[SRC[>>69]]

[75] 
[[生成器]]は、
空の[[配列][JSON配列]]を指定しては[MUST[なりません]]。
[SRC[>>69]]

[78] 
[CODE[crit]] を使う場合、
[[JWS保護ヘッダー]]に含めなければ[MUST[なりません]]。
[SRC[>>69]]
[[JWS非保護ヘッダー]]では使えません。

-*-*-

[80] 
実装は、[[ヘッダー引数]]
[CODE[crit]] 
を理解し処理しなければ[MUST[なりません]]。
[SRC[>>69]]

[76] 
[[受信者]]は、
[CODE[crit]] の値が制約 (>>73, >>74, >>75) 違反のとき、
当該 [[JWS]] を[[非妥当]]とみなして[MAY[構いません]]。
[SRC[>>69]]

;; [77] なぜ[MUST[必須]]でないのか不明です。
これでは[[相互運用性]]の罠です。

[72] 
[[受信者]]が指定された[[ヘッダー引数]]のいずれかを理解対応していない場合には、
当該 [[JWS]] は[[非妥当]]です。
[SRC[>>69]]




* ヘッダー引数の一覧

[3] 
[[JWS]] の[[ヘッダー引数]]は、
[[JWS被保護ヘッダー]]で使えるもの、
[[JWS非被保護ヘッダー]]で使えるもの、
どちらでも使えるものがあります。



[FIG(short list)[ [56] [[JWS]] [[ヘッダー引数]]
- [CODE[alg]] (指定必須、対応必須)
- [CODE[jku]]
- [CODE[jwk]]
- [CODE[kid]]
- [CODE[x5u]]
- [CODE[x5c]]
- [CODE[x5t]]
- [CODE[x5t#S256]]
- [CODE[typ]]
- [CODE[cty]]
- [CODE[crit]] (対応必須)
]FIG]

[12] 
[[JWE]] の[[ヘッダー引数]]は、
[[JWE被保護ヘッダー]],
[[JWE共有非被保護ヘッダー]],
[[JWE受信者毎非被保護ヘッダー]]で使用できますが、
どこで使用できるか制限されているものもあります。


[FIG(short list)[ [11] [[JWE]] [[ヘッダー引数]]
- [CODE[alg]] (指定必須、対応必須)
- [CODE[crit]] (対応必須)
- [CODE[cty]]
- [CODE[enc]] (指定必須、対応必須)
- [CODE[jku]]
- [CODE[jwk]]
- [CODE[kid]]
- [CODE[typ]]
- [CODE[x5c]]
- [CODE[x5t]]
- [CODE[x5t#S256]]
- [CODE[x5u]]
- [CODE[zip]] (対応必須)

]FIG]

[FIG(short list)[ [15] その他の[[ヘッダー引数]]
- [CODE[apu]]
- [CODE[apv]]
- [CODE[epk]]
- [CODE[p2]]
- [CODE[p2s]]

]FIG]


* ヘッダー引数名の登録


[52] 
[[ヘッダー引数]]名には、
[[登録ヘッダー引数名]]、
[[公開ヘッダー引数名]]、
[[私的ヘッダー引数名]]の3[RUBYB[種類][class]]があります。
[SRC[>>47, >>33]]
この「class」は[[互いに素]]のようにも感じられますが、
[[仕様書]]の定義が曖昧で意図を掴みかねます。

[53] 
[DFN[[RUBYB[登録ヘッダー引数名][Registered Header Parameter name]]]]は、
[[IANA登録簿]]に登録されたものです [SRC[>>47]]。
[[IANA登録簿]]は [[JWS]] と [[JWE]]
で共通で、一方または両方で使用するかを指定できます [SRC[>>142]]。
[[JWS]] と [[JWE]] の両方で使うものを定める場合、用法が一貫していなければなりません
[SRC[>>47, >>33]]。

[143] 
登録する[[ヘッダー引数]]名は、
短く、原則として8文字[[以下]]である[SHOULD[べき]]とされています。
[SRC[>>142]]

[144] 
一般に[[ヘッダー引数]]名は[[大文字・小文字区別あり]]ですが、
登録時に[[指定専門家]]が必要と認めた場合を除き、
[[大文字・小文字不区別]]で既存の名称と一致するものは登録できません。
[SRC[>>142]]


[54] 
[DFN[[RUBYB[公開ヘッダー引数名][Public Header Parameter name]]]]
[SRC[>>47]]
が何であるか[[仕様書]]はなぜか明確に述べていませんが、
[[登録ヘッダー引数名]]でも[[私的ヘッダー引数名]]でもないものとみられます。

[57] 
[[公開ヘッダー引数名]]に関する[[仕様書]]の節には、
次のようにあります。
[[JWS]] / [[JWE]] の利用者は、 
[[RFC 7515]] / [[RFC 7516]] にない追加の[[ヘッダー引数]]名を定義できますが、
[[IANA登録簿]]に登録するか、
または Public Name ([[耐衝突名]]が含まれる値)
であるかとする[RUBYB[べき][should]]です。
いずれにせよ、
定義者は、
名前を定義するため使う名前空間の部分に関して、
制御下に置かれるべく十分に注意を払う必要があります。
[SRC[>>47, >>33]]
(この Public Name が[[公開ヘッダー引数名]]を指しているとも解せます。
主語の利用者が誰を指すか明らかではありませんが ([[私的ヘッダー引数名]]との違いに注意)、
[[JWS]] を利用する技術の仕様策定者とみるべきでしょうか。)

[58] 
新しい[[ヘッダー引数]]の追加は、[[相互運用性]]の低下を招き得るため、
慎重にする[RUBYB[べき][should]]です。
[SRC[>>47, >>33]]




[55] 
[DFN[[RUBYB[私的ヘッダー引数名][Private Header Parameter name]]]]
[SRC[>>47]]
が何であるか[[仕様書]]はなぜか不明瞭にしていますが、
[[仕様書]]の[[私的ヘッダー引数名]]の[[節]]には、
[[JWS]] / [[JWE]] の生成者と消費者は
Private Names ([[登録ヘッダー引数名]]でない名前)
や[[公開ヘッダー引数名]]を[[使う][私用]]ことに[[合意][情報交換の当事者間の合意]]して構わない
[SRC[>>47, >>33]]
とあります。
この Private Names が[[私的ヘッダー引数名]]とも解し得ますが、
「[[登録ヘッダー引数名]]でない」
ならそれは[[公開ヘッダー引数名]]を含むとも考えられ、
だとすると敢えて[[公開ヘッダー引数名]]に言及しているのが不審です。
[[公開ヘッダー引数名]]と違って[[私的ヘッダー引数名]]は衝突の恐れがあり、
注意して使うべきである [SRC[>>47, >>33]]
とされており、だとすると両者は[[互いに素]]であるとも思われます。

[59] 
この通り[[ヘッダー引数]]名には3つの分類がありますが、
[[仕様書]]は注意せよと言っているだけで、
利用の制限も特になく、
定義も曖昧で、
実質的な違いはないといって良いでしょう。

[60] [[相互運用性]]を考慮すると、
[[JWS]] や [[JWE]]
を使う[[応用]]は、
それぞれどれを実装しなければならないか定め、
それ以外は実装してはならないと定める必要がありそうです。
[[JWS]] や [[JWE]]
の実装は、 
その適用対象の[[応用]]に合わせ、
不要なものを生成せず、
対応が求められていないものを無視することを徹底するべきでしょう。




* メモ


[6] [[JWE]] は [[JWS]] に同じ、と丸投げしています。その委任の仕方が雑なので、
[[仕様書の厳密な解釈][spec lawyer]]に基づくと [[JWE]] の規定する処が若干曖昧ではあります。

[9] [[JOSE]] は [[JWE]], [[JWS]] 等の仕様の共通化できる部分を共通化し、
[[JWA]] のように仕様書としても共通部分を括りだしているところがあるのに、
なぜか [[JWE]] が依存する [[JWS]] との共通部分が [[JWS]]
の仕様書に [[JWS]] 用の規定として含まれています。
なぜこのような技術的に美しくない仕様書の構成にしたのでしょう。



