認証トークンシステムを実装しようとしているので、JSON Web暗号化(JWE)またはJSON Web署名(JWS)を使用することの長所と短所、および両方を使用することに意味があるかどうか(JWS内のJWE)を知りたいです)。
JSON Web署名(JWS)クレームは、秘密署名鍵を使用してサーバーで検証できる署名で署名されます。これにより、クライアントとサーバー間でクレームが渡されたときにクレームが緩和されないことが保証されます。 JWSトークンの内容はBase64でエンコードされており、暗号化されていません(エンコードは暗号化とは異なることに注意してください!)。 Base64でエンコードされたデータは、ガベージテキストのように見えるという点で暗号化されているように見えますが、実際には、読み取り可能なデータに戻すのは簡単です。したがって、JWTに機密情報を含めないことを常にお勧めします。 JWTは、2者間(またはクライアントとサーバー間)で情報を交換する場合にのみ使用することをお勧めします。機密データは、トークンのペイロードとして渡されません。
しかし、トークンに個人情報を含めたい場合はどうでしょうか。機密情報が、攻撃者が簡単にデコードできるBase64でエンコードされたトークンに含まれることは望ましくありません。幸い、クレームデータを暗号化して保護する方法があります。これはJSON Web暗号化(JWE)として知られるより安全なレベルの保護です。クレームデータ(基本的にはJSONベースのデータ構造)を暗号化する方法を定義し、目的の受信者のみがトークンに存在する情報を読み取ることができるようにします。
Webトークンを処理する最良の方法は次のとおりです:
Javaで利用できる、JSON Webトークンを暗号化できる優れたライブラリがいくつかあります。
上記のライブラリは両方とも、JWTおよびJOSE(Javascript Object Signing and Encryption)仕様スイートのオープンソース(Apache 2.0)実装です。どちらも高品質のライブラリであり、間違った選択をすることはできません。ただし、JWT.IOには、使用可能な各ライブラリの違いを表示するための優れたUIがあります。
JWSはデータの署名に使用され、データの整合性が保護されます。これは、次のことを意味します。
JWEは、データを暗号化し、整合性を保護するために使用されます
JWSとJWEの目的は異なります。 JWSはクレームに署名するために使用され、JWEは機密データを送信するために使用されます。
認証システムを実装する場合は、JWSを使用してクレームの信頼性を検証する必要があります。
JWSのクレームの一部に機密情報が含まれている場合は、JWEを使用してJWSを暗号化することもできます。
ただし、JWEのみを使用することは、コンテキストでは意味がありません。