私の理解では、HMACは対称署名アルゴリズム(単一の秘密鍵)ですが、RSAは非対称署名アルゴリズム(秘密/公開鍵のペア)です。私は、JSON Webトークンに署名するためにこれらの2つの方法から選択しようとしています。
ただし、HMACの使用例については少し混乱しています。クライアント(ユーザー)とサーバーの両方がキーを共有している場合、何が原因でクライアントがトークンのペイロードフィールド(おそらくサブジェクトを別のユーザーのIDに変更する)を変更し、その後トークンをクライアント側に再署名できなくなります。明らかにこれは悪いでしょう。 HMACは、RSAのように単一のエンティティだけでなく、秘密鍵で誰かがデータに署名したことだけを保証しますか?これには実際にどのような使用例がありますか、おそらく何かを誤解していますか?または、秘密鍵がクライアントとさえ共有されていないのでしょうか?
HMACは、シークレットにアクセスできない誰かが操作から保護するに使用します。通常、これは、シークレットがサーバーだけに知られている場合はクライアントによる操作から保護すること、またはシークレットがクライアントとサーバーに知られている場合は送信中の操作から保護することを意味します。
RSAベースの署名は、操作を防止するために使用され、データを操作することなく他のユーザーがデータの整合性とソースを確認できるようにするにも使用されます。これを行うことができるのは、秘密鍵がデータのプロバイダーと署名者だけに知られているのに対して、公開鍵は整合性を検証したいすべての人に知られているからです。
したがって、何を選択するかは、特定のユースケースによって異なります。サーバーがクライアントによる操作からトークンを保護する必要があるだけの場合は、サーバー側のシークレットでHMACを使用するだけで十分です。代わりに、トークンが特定の(信頼できる)サーバーによって作成されたことを他の人にも証明する必要がある場合は、RSAベースの署名を使用する必要があります。