[14] 
[DFN[JWS]]
は、
[[電子署名]]のための
[[JSON応用]]です。

* 仕様書

[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>
-- [22] [CITE@en[RFC 7515 - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#section-3>
-- [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>
--- [69] [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.1.11>
-- [81] [CITE@en[RFC 7515 - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#section-5>
-- [129] [CITE@en[RFC 7515 - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#section-6>
-- [31] [CITE@en[RFC 7515 - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#section-7>
-- [138] [CITE@en[[[RFC 7515]] - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#section-8>
-- [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>
-- [150] [CITE@en[RFC 7515 - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#appendix-D>
-- [172] [CITE@en[RFC 7515 - JSON Web Signature (JWS)]], [TIME[2020-03-29 16:13:43 +09:00]] <https://tools.ietf.org/html/rfc7515#appendix-F>
- [50] 
[CITE@en[RFC 7519 - JSON Web Token (JWT)]], [TIME[2025-10-15T08:44:46.000Z]] <https://datatracker.ietf.org/doc/html/rfc7519#page-5>


]REFS]

* データモデル


[9] 
[DFN[JSON Web Signature]] ([DFN[JWS]])
は、
[[デジタル]]的に [[RFC 4949]] [[署名][デジタル署名]]されまたは [[RFC 4949]] [[MAC]]
された[[メッセージ]]です。
[SRC[>>8, >>22]]

;; [21] [[JWS]] には、[[一貫性]]保護のない[[非保安JWS]]も含まれます。


[24] [[JWS]] は、次により構成されます。
[SRC[>>22]]

[FIG(list members)[ [25] [[JWS]]
: [[JOSEヘッダー]]: 
次の[[合同]]です。
[FIG(list members)[

: [DFN[[RUBYB[JWS被保護ヘッダー][JWS Protected Header]]]] :
[[JWS署名]]の [[RFC 4949]] [[デジタル署名]]または
[[RFC 4949]] [[MAC]]演算によって[[一貫性]]保護された[[ヘッダー引数]]を含む
[[JSONオブジェクト]]です。
[SRC[>>8]]
: [DFN[[RUBYB[JWS非被保護ヘッダー][JWS Unprotected Header]]]] :
[[一貫性]]保護されていない[[ヘッダー引数]]を含む
[[JSONオブジェクト]]です。
[SRC[>>8]]

]FIG]
: [[JWSペイロード]]:
: [[JWS署名]]:
]FIG]



[13] 
[[JOSEヘッダー]]には、
[[JWS]] 用の[[ヘッダー引数]]をいくつか指定できます。
[[ヘッダー引数]]は名前と値の組です。
[SEE[ [[JOSEヘッダー]] ]]

[10] 
[[JOSEヘッダー]]内の[[ヘッダー引数]]の重複は認められません。
[SEE[ [[JOSEヘッダー]] ]]
[[JWS被保護ヘッダー]]と[[JWS非被保護ヘッダー]]の間でも同名があってはなりません (>>43, >>46)。



* 構文


[23] [[JWS]] は、 [[RFC 7159]] [[JSON]] データや [[base64url]]
を使って記述されます。 [[JSON]] は、その定めるところにより、
値の前後に[[空白]]を挿入できます。 [SEE[ [[JSON]] ]]
[SRC[>>22]]

[11] 
[DFN[[RUBYB[JWSペイロード][JWS Payload]]]]は、
[RUBYB[保安される][secured]][[オクテット列]]、[RUBYB[すなわち][[[aka]]]][RUBYB[[[メッセージ]]][message]]です。
[[ペイロード]]は、
任意の[[オクテット列]]を含められます。
[SRC[>>8]]

[12] 
[DFN[[RUBYB[JWS署名][JWS Signature]]]]は、
[[JWS保護ヘッダー]]と[[JWSペイロード]]に関する [[RFC 4949]] [[デジタル署名]]や 
[[RFC 4949]] [[MAC]]
です。
[SRC[>>8]]



[16] 
[DFN[[RUBYB[JWS署名入力][JWS Signing Input]]]]は、
[[RFC  4949]] [[デジタル署名]]または [[RFC 4949]] [[MAC]] 計算への[[入力]]です。
この値は、

= [[RFC 20 ASCII][ASCII()]] ([[RFC 7515 BASE64URL][BASE64URL()]] ([[RFC 3629 UTF8][UTF8()]] ([[JWS保護ヘッダー]])))
= [CODE[.][FULL STOP]]
= [[RFC 7515 BASE64URL][BASE64URL()]] ([[JWSペイロード]])

... を[[順に連結][文字列連結]]した結果です。
[SRC[>>8]]




[20] 
[DFN[StringOrURI]]
は、
[[JSON文字列]]値であって、
任意の[[文字列]]値であっても[MAY[構わない]]ものの、
[CODE[:]] が含まれる場合は
[[RFC 3986]] [[URI]]
でなければ[MUST[ならない]]ものです。
[[比較][文字列の比較]]は、
[[大文字・小文字区別あり]]で変形や[[正準化]]なく行います。
[SRC[>>8, >>50]]

[62] [CODE[alg]] や [CODE[enc]] は[[耐衝突名]]かつ [[StringOrURI]] 
(を含む文字列) とされています。

-*-*-

[173] 
[[JWS]] のうち [[JWSペイロード]]を含めない、
つまり [[JWS]] 生成後に [[JWS簡潔直列化]]にあっては該当部分を[[空文字列]]とし、
[[JWS JSON直列化]]にあっては [CODE[payload][JWSペイロード]]
を削除したものを扱うのが時に有用なのであって、
受信者も別の手段で [[JWSペイロード]]相当の情報を入手し、
容易に [[JWS]] を再構築し得るものである、
と[[仕様書]]に敢えて言及があります [SRC[>>172]]。

[174] 
しかしなぜか本体仕様とは別に簡単に説明されているに過ぎず、
しかも送受信者がそのような簡単な操作で標準的な [[JWS]] 
のライブラリーの入出力を改変して実現可能だ、
と [[JWS]] 本体ではなく[[応用]]側で実装するべきものとしています。
本当にそのような需要があるのなら、
こうした取ってつけた説明ではなく [[JWS]]
本体仕様に組み込んで詳細に規定するべきで、不可解です。


* 直列化

[27] 
[[JWS]]
は、
3種類の表現方法があります。
[[JWS]] を使う[[応用]]は、
どちらの[[直列化]]を使うか、
どの[[直列化]][RUBYB[機能][feature]]を使うかを、
規定する必要があります。
[[JWS]] の実装は、
対応したい[[応用]]で必要な機能のみ実装する必要があります。
[SRC[>>31]]

[EG[
[33] 
例えば、
「[[JWS JSON直列化]]で署名か [[MAC]] の値は1つだけ対応する」
のような定めが可能です。
[SRC[>>31]]
]EG]

;; [26] 
そのためただ「JWS を使う」「JWS に対応」とだけ言っても意味は通じません。
2つの 「JWS に対応」した実装が[[相互運用可能]]とは限りません。


[32] 
[[JWE]] との区別は [[JOSE]] 参照。


** JWS簡潔直列化

[17] 
[DFN[[RUBYB[JWS簡潔直列化][JWS Compact Serialization]]]]は、
[[JWS]]
を簡潔で [[URL安全]]な[[文字列]]として表現したものです。
[SRC[>>8]]

[28] 
[[JWS簡潔直列化]]では、
[[JWS非保護ヘッダー]]を使うことが出来ません。
[[JOSEヘッダー]] = [[JWS保護ヘッダー]]です。
[SRC[>>8, >>22]]

[29] 
[[JWS簡潔直列化]]は、
次のものを[[順に連結][文字列連結]]したものです。
[SRC[>>22, >>31]]

= [[RFC 7515 BASE64URL][BASE64URL()]] ([[RFC 3629 UTF8][UTF8()]] ([[JWS保護ヘッダー]]))
= [CODE[.][FULL STOP]]
= [[RFC 7515 BASE64URL][BASE64URL()]] ([[JWSペイロード]])
= [CODE[.][FULL STOP]]
= [[RFC 7515 BASE64URL][BASE64URL()]] ([[JWS署名]])

[34] 
[[署名]]・[[MAC]] は1つだけしか指定できません。 [SRC[>>31]]



** JWS JSON直列化

[18] 
[DFN[[RUBYB[JWS JSON直列化][JWS JSON Serialization]]]]は、
[[JWS]]
を
[[JSONオブジェクト]]として表現したものです。
[[JWS簡潔直列化]]と違って、
複数の
[[RFC 4949]] [[デジタル署名]]と
[[RFC 4949]] [[MAC]]
の[[一方又は両方][及び/又は]]を同じ内容に適用できます。
簡潔性や [[URL安全性]]は重視していません。
[SRC[>>8]]

[30] 
[[JWS JSON直列化]]では、
[[JWS保護ヘッダー]]と[[JWS非保護ヘッダー]]の両方を使うことができます
[SRC[>>8, >>22]]。
どちらか一方は存在しなければ[MUST[なりません]] [SRC[>>22]]。
[[JOSEヘッダー]]は両者全体で構成されます [SRC[>>8, >>22]]。

[35] 一般構文と呼ばれるものと、平坦化構文と呼ばれるものの2種類があります。
[SRC[>>31]]

[48] 
[[ヘッダー引数]]と違って明言されていませんが、
[[JSONオブジェクト]]の重複[[メンバー]]は
[[ヘッダー引数]]の重複と同様に処理するべきと思われます。
[SEE[ [[ヘッダー引数]] ]]


*** 一般構文

[36] 
[DFN[[RUBYB[(完全)一般JWS JSON直列化構文][(fully) general JWS JSON serialization syntax]]]]は、
次のような最上位の
[[JSONオブジェクト]]です。
[SRC[>>31]]

[FIG(list  members)[ [38] [[JSONオブジェクト]]
: [DFN[[CODE[payload][JWS Payload]]]] :
[[RFC 7516 BASE64URL][BASE64URL()]] ([[JWSペイロード]])。
[MUST[必須]]。
[SRC[>>31]]
: [DFN[[CODE[signatures]]]] :
[[JSONオブジェクト]]の[[配列]]でなければ[MUST[なりません]]。
[FIG(list members)[ [40] [[JSON配列]]

[41] 
各[[JSONオブジェクト]]は、
[[JWSペイロード]]と [[JWS保護ヘッダー]]の[[署名]]や [[MAC]] を表します。
[SRC[>>31]]
[FIG(list members)[ [39] [[JSONオブジェクト]]

: [DFN[[CODE[protected][JWS保護ヘッダー]]]] :
[[JWS保護ヘッダー]]値が空でない時、
[[RFC 7515 BASE64URL][BASE64URL()]] ([[RFC 3629 UTF8][UTF8()]] ([[JWS保護ヘッダー]]))
でなければ[MUST[なりません]]。
[[ヘッダー引数]]値は[[一貫性]]保護されます。
そうでないとき、
省略しなければ[MUST[なりません]]。
[SRC[>>31]]
: [DFN[[CODE[header][JWS非保護ヘッダー]]]] :
[[JWS非保護ヘッダー]]値が空でない時、
[[JWS非保護ヘッダー]]たる [[JSON]] 値でなければ[MUST[なりません]]。
[[ヘッダー引数]]値は[[一貫性]]保護されません。
そうでないとき、
省略しなければ[MUST[なりません]]。
[SRC[>>31]]
: [DFN[[CODE[signature][JWS Signature]]]] :
[[RFC 5715 BASE64URL][BASE64URL()]] ([[JWS署名]])
でなければ[MUST[なりません]]。
[SRC[>>31]]
: その他 :
他のメンバーを指定できます。
実装は、理解できないものを無視しなければ[MUST[なりません]]。
[SRC[>>31]]

]FIG]

[42] 
[CODE[protected][JWS保護ヘッダー]] または [CODE[header][JWS非保護ヘッダー]]
の一方または両方がなければ[MUST[なりません]]。
最低でも [CODE[alg]] [[ヘッダー引数]]が必要です。
[SRC[>>31]]

[43] 
[[署名]]や [[MAC]] 値の作成や[[検証]]に使う[[ヘッダー引数]]は、
[CODE[protected][JWS保護ヘッダー]] と
[CODE[header][JWS非保護ヘッダー]]
を[[合同]]して得られる
[[JOSEヘッダー]]です。
両者の[[ヘッダー引数]]の名前は、[[互いに素][disjoint]]でなければ[MUST[なりません]]。
[SRC[>>31]]


]FIG]
: その他 :
他のメンバーを指定できます。
実装は、理解できないものを無視しなければ[MUST[なりません]]。
[SRC[>>31]]
([CODE[protected][JWS保護ヘッダー]],
[CODE[header][JWS非保護ヘッダー]],
[CODE[signature][JWS Signature]]
も禁止はされていません。)

]FIG]




*** 平坦化構文

[37] 
[DFN[[RUBYB[平滑化JWS JSON直列化構文][flattened JWS JSON serialization syntax]]]]は、
単一の[[デジタル署名]]・ [[MAC]] の場合に最適化したもので、
次のような最上位
[[JSONオブジェクト]]です。
[SRC[>>31]]

[FIG(list  members)[ [44] [[JSONオブジェクト]]
: [CODE[payload][JWS Payload]] :
[[RFC 7516 BASE64URL][BASE64URL()]] ([[JWSペイロード]])。
[MUST[必須]]。
[SRC[>>31]]
: [CODE[protected][JWS保護ヘッダー]] :
[[JWS保護ヘッダー]]値が空でない時、
[[RFC 7515 BASE64URL][BASE64URL()]] ([[RFC 3629 UTF8][UTF8()]] ([[JWS保護ヘッダー]]))
でなければ[MUST[なりません]]。
[[ヘッダー引数]]値は[[一貫性]]保護されます。
そうでないとき、
省略しなければ[MUST[なりません]]。
[SRC[>>31]]
: [CODE[header][JWS非保護ヘッダー]] :
[[JWS非保護ヘッダー]]値が空でない時、
[[JWS非保護ヘッダー]]たる [[JSON]] 値でなければ[MUST[なりません]]。
[[ヘッダー引数]]値は[[一貫性]]保護されません。
そうでないとき、
省略しなければ[MUST[なりません]]。
[SRC[>>31]]
: [CODE[signature][JWS Signature]] :
[[RFC 5715 BASE64URL][BASE64URL()]] ([[JWS署名]])
でなければ[MUST[なりません]]。
[SRC[>>31]]
: その他 :
他のメンバーを指定できます。
実装は、理解できないものを無視しなければ[MUST[なりません]]。
[CODE[signatures]] があっては[MUST[なりません]]。
[SRC[>>31]]

]FIG]

[45] 
[CODE[protected][JWS保護ヘッダー]] または [CODE[header][JWS非保護ヘッダー]]
の一方または両方がなければ[MUST[なりません]]。
最低でも [CODE[alg]] [[ヘッダー引数]]が必要です。
[SRC[>>31]]

[46] 
[[署名]]や [[MAC]] 値の作成や[[検証]]に使う[[ヘッダー引数]]は、
[CODE[protected][JWS保護ヘッダー]] と
[CODE[header][JWS非保護ヘッダー]]
を[[合同]]して得られる
[[JOSEヘッダー]]です。
両者の[[ヘッダー引数]]の名前は、[[互いに素][disjoint]]でなければ[MUST[なりません]]。
[SRC[>>31]]



* 処理

** 作成

[82] 
[DFN[[RUBYB[JWSを作成][create a JWS]]]]するには、
[VAR[[[JWSペイロード]]]]、
[[JSONオブジェクト]]または [CODE[null]] [VAR[[[JWS保護ヘッダー]]]]、
[[JSONオブジェクト]]または [CODE[null]] [VAR[[[JWS非保護ヘッダー]]]]を、
次のようにします。
[SRC[>>81]]

[FIG(steps)[
= [87] [[Assert]]: [[JOSEヘッダー]] ([VAR[JWS保護ヘッダー]]と[VAR[JWS非保護ヘッダー]])
には [CODE[alg]] [[ヘッダー引数]]が含まれなければ[MUST[なりません]]。
= [83] [VAR[符号化ペイロード値]]を、
[[RFC 7515 BASE64URL][BASE64URL()]] ([VAR[JWSペイロード]]) の結果に設定します。
= [84] [VAR[符号化ヘッダー値]]を、[[空文字列]]に設定します。
= [85] [VAR[符号化ヘッダー値]]が [CODE[null]] で''ない''場合、
== [86] 
[[RFC 7515 BASE64URL][BASE64URL()]] ([[RFC 3629 UTF8][UTF8()]] ([VAR[JWS保護ヘッダー]]))
の結果に設定します。
= [88] 
[VAR[JWS署名]]を、[[JWS署名]]を計算した結果に設定します。
[FIG(list members)[

: [VAR[[[JWS署名入力]]]] :
[[RFC 20 ASCII][ASCII()]] ([VAR[符号化ヘッダー値]])、
[CODE[.][FULL STOP]]、
[VAR[符号化ペイロード値]]を[[順に連結][文字列連結]]した結果
: [VAR[[[JOSEヘッダー]]]] :  [VAR[JWS保護ヘッダー]]と[VAR[JWS非保護ヘッダー]]

]FIG]
= [89] 
[VAR[符号化署名値]]を、
[[RFC 7515 BASE64URL][BASE64URL()]] ([VAR[JWS署名]])
の結果に設定します。
= [90] 
[VAR[符号化保護ヘッダー]]、
[VAR[JWS非保護ヘッダー]]、
[VAR[符号化ペイロード値]]、
[VAR[符号化署名値]]について、
直列化した結果を返します。
]FIG]

[128] [[BOM]] を生成するべきか否か仕様書から明らかではありません。一般的には
[CITE[Encoding Standard]] の
[[UTF-8符号化]]のように [[BOM]] を生成しないものと解されています。

** 検証

[91] 
[[JWS]] を[RUBYB[検証][validate]]するには、
[VAR[JWS]] を、
次のようにします。
[SRC[>>81]]

[FIG(steps)[
= [92] 
[VAR[結果]]を、 [VAR[JWS]] を構文解析した結果に設定します。
= [93] [VAR[結果]]が[[失敗]]の場合、
== [94] [[偽]]を返し、ここで停止します。
= [95] [VAR[ヘッダーバイト列]]を、
[VAR[結果]]の[F[符号化ヘッダー値]]を [[RFC 7515 base64url復号]]した結果に設定します。
= [96] [VAR[ヘッダーバイト列]]が[[失敗]]の場合、
== [97] [[偽]]を返し、ここで停止します。
= [99] [VAR[ヘッダー文字列]]を、
[VAR[ヘッダーバイト列]]を 
[[RFC 3629]] [[UTF-8]]
[[復号]]した結果に設定します。
= [100] [VAR[ヘッダー文字列]]が[[失敗]]の場合、
== [101] [[偽]]を返し、ここで停止します。
= [98] [VAR[JWS保護ヘッダー]]を、
[VAR[ヘッダー文字列]]を [[RFC 7159]] [[JSON]] として構文解析した結果に設定します。
= [102] [VAR[JWS保護ヘッダー]]が[[JSONオブジェクト]]で''ない''場合、
== [103] [[偽]]を返し、ここで停止します。
= [104] [VAR[結果]]の [F[JWS非保護ヘッダー]]が [CODE[null]] で''ない''場合、
== [105] [VAR[結果]]の[F[JWS非保護ヘッダー]]のメンバーと[VAR[JWS保護ヘッダー]]のメンバーについて、
メンバー名 (= [[ヘッダー引数]]名) に重複がある場合、
=== [106] [[偽]]を返し、ここで停止します。
= [107] [VAR[結果]]の[F[JWS保護ヘッダー]]と[VAR[JWS保護ヘッダー]]について、
[[JWS]] の規定により対応しなければならないとされるもの、
指定された[[アルゴリズム]]により対応しなければならないとされるもの、
[CODE[crit]] [[ヘッダー引数]]で指定されたものについて、
実装が理解し処理できる[[ヘッダー引数]]であること、
その値もまた理解し処理できるものであることを確認します。そうでない場合、
== [108] [[偽]]を返し、ここで停止します。
= [109] [VAR[ペイロードバイト列]]を、
[VAR[結果]]の[F[符号化ペイロード値]]を [[RFC 7515 base64url復号]]した結果に設定します。
= [110] [VAR[ペイロードバイト列]]が[[失敗]]の場合、
== [111] [[偽]]を返し、ここで停止します。
= [112] [VAR[署名バイト列]]を、
[VAR[結果]]の[F[符号化署名値]]を [[RFC 7515 base64url復号]]した結果に設定します。
= [113] [VAR[署名バイト列]]が[[失敗]]の場合、
== [114] [[偽]]を返し、ここで停止します。
= [115] 
[VAR[JWS署名]]を、[[JWS署名]]を計算した結果に設定します。
[FIG(list members)[

: [VAR[[[JWS署名入力]]]] :
[[RFC 20 ASCII][ASCII()]] ([VAR[結果]]の[F[符号化ヘッダー値]])、
[CODE[.][FULL STOP]]、
[VAR[結果]]の[F[符号化ペイロード値]]を[[順に連結][文字列連結]]した結果
: [VAR[[[JOSEヘッダー]]]] :  [VAR[JWS保護ヘッダー]]と[VAR[結果]]の[F[JWS非保護ヘッダー]]

]FIG]
= [116] [VAR[署名バイト列]]が[VAR[JWS署名]]で''ない''場合、
== [117] [[偽]]を返し、ここで停止します。
= [119] [VAR[ペイロード文字列]]を、
[VAR[ペイロードバイト列]]を 
[[RFC 3629]] [[UTF-8]]
[[復号]]した結果に設定します。
= [120] [VAR[ペイロード文字列]]が[[失敗]]の場合、
== [121] [[偽]]を返し、ここで停止します。 [SRC[仕様書になし]]
= [122] [VAR[JWSペイロード]]を、
[VAR[ペイロード文字列]]を [[RFC 7159]] [[JSON]]として構文解析した結果に設定します。
= [123] [VAR[JWSペイロード]]が[[JSONオブジェクト]]で''ない''場合、
== [124] [[偽]]を返し、ここで停止します。 [SRC[仕様書になし]]
= [118] [[真]]、
[VAR[JWS保護ヘッダー]]、
[VAR[結果]]の[F[JWS非保護ヘッダー]]、
[VAR[JWSペイロード]]を返します。
]FIG]

[125] 
[[JWS署名]]が複数含まれる時、
どれを検証するか、すべてを検証するかは[[応用]]が決めることとされています。
最低でも1つは検証し[[真]]を返すことを確認しなければ[MUST[なりません]]。
[SRC[>>81]]

[126] 
検証結果が[[真]]であっても、
[[アルゴリズム]]が[[応用]]の期待するものでなければ、
非妥当とみなす[SHOULD[べきです]]。
[SRC[>>81]]

[127] 
[[UTF-8]] や [[JSON]] の[[復号]]について、参照している仕様が明確に方法を定めていないため、
[[相互運用性]]の問題が生じるおそれがあります。[[仕様書]]の厳密な解釈に従うことは避け、
明確な規定のある [CITE[Encoding Standard]] [[BOMなしUTF-8復号または失敗]]や 
[CITE[ECMAScript]] [CODE[JSON.stringify]] に倣うべきでしょう。

** アルゴリズムと鍵

[134] 
[[JWS署名]]の計算に使われる[[アルゴリズム]]は、
[CODE[alg]] [[ヘッダー引数]]に指定することになっています。
[[生成器]]は、これを指定しなければ[MUST[なりません]]。
[CODE[alg]] の値が[[受信器]]の[[対応]]している[[アルゴリズム]]でないとき、
[[妥当]]ではありません [SRC[>>47]]。
[[検証]]は[[失敗]]します。

;; [135] つまり、[[相互運用性]]のため、
[[応用]]は送受信者が対応しなければならない[[アルゴリズム]]を明確かつ限定的に規定しなければなりません。

[149] 
[[アルゴリズム]]の実装によっては[[JWS署名]]値内に含まれる[[アルゴリズム]]を使って検証する場合があります。
その場合でもそれが [CODE[alg]] と一致しているか確認しなければ[MUST[なりません]]。
さもなくば [CODE[alg]] に強いアルゴリズムを指定し、
実際には弱いアルゴリズムで攻撃することが可能となってしまいます。
[SRC[>>148]]

[15] [[JOSE鍵識別]]

* MIME 型

[SEE[ [[JOSE]] ]]

* 応用

[FIG(short list)[ [6] [[JWS]] の[[応用]]
- [[JWT]]
-- [[VAPID]]
]FIG]

[49] [[JAdES]]

* 関連

[19] 関連記事:
[[JOSE]], 
[[JWE]]


* 歴史

[1] [CITE@en[JSON Web Signature (JWS)]]
( ([TIME[2011-12-14 23:15:42 +09:00]] 版))
<http://openid.net/specs/draft-jones-json-web-signature-04.html>

[2] [CITE@en[draft-ietf-jose-json-web-signature-19 - JSON Web Signature (JWS)]]
( ([TIME[2013-12-29 22:15:32 +09:00]] 版))
<http://tools.ietf.org/html/draft-ietf-jose-json-web-signature-19>

[3] 
[TIME[2015年5月][2015-05]]、
[[IETF]]
[[提案標準]]
[DFN[RFC 7515]]
として出版されました。

[4] [CITE@en[RFC 7797 - JSON Web Signature (JWS) Unencoded Payload Option]]
([TIME[2016-03-31 02:08:14 +09:00]] 版)
<https://tools.ietf.org/html/rfc7797>

[5] [CITE@en[RFC 8055 - Session Initiation Protocol (SIP) Via Header Field Parameter to Indicate Received Realm]]
([TIME[2017-02-03 01:02:37 +09:00]])
<https://tools.ietf.org/html/rfc8055>