JWS【JSON Web Signature】

「JOSE」(JSON Object Signing and Encryption)と総称される仕様群の一つで、「JWE」(暗号化)、「JWK」(鍵表現)、「JWA」(アルゴリズム)と共に用いられる。実用上はJWT(JSON Web Token)に署名を付与する仕組みとして最も広く使われており、JWTの署名付きトークンはJWSの構造を採用している。
データ構造はヘッダー、ペイロード、署名の三要素からなる。ヘッダーはJSONオブジェクトをBase64URLエンコードしたもので、使用する署名アルゴリズムの識別子(algパラメータ)などを含む。ペイロードは署名対象の任意のバイト列をBase64URLエンコードしたものである。
デジタル署名は、「Base64URLエンコードされたヘッダー」と「Base64URLエンコードされたペイロード」をピリオドで連結した文字列に対して生成される。最終的な出力はこれら三つをピリオドで連結した「ヘッダー.ペイロード.署名」の形式となる。これを「コンパクトシリアライゼーション」と呼ぶ。
署名アルゴリズムには「HMAC」(HS256、HS384、HS512)と公開鍵暗号方式の二系統がある。HMACは送受信者が同一の秘密鍵を共有し、署名の生成と検証の両方に使う対称方式である。公開鍵方式では「RSA署名」(RS256など)や「ECDSA」(ES256など)が使われ、秘密鍵で署名を生成し公開鍵で検証する非対称方式である。公開鍵方式では署名の検証者に秘密鍵を渡す必要がないため、不特定多数の検証者がいる構成に適している。
受信側はヘッダーに記載されたアルゴリズムと対応する鍵を使って署名を再計算し、受け取った署名と一致するかを確認することでデータが改竄されていないことを検証できる。署名はデータの機密性を保証しないため、内容を秘匿する必要がある場合はJWEと組み合わせて使う。