HS256(HMAC SHA-256)によるJWT署名

HS256(HMAC SHA-256)によるJWT署名の仕組み、対称鍵署名の動作原理、HS256を選択すべきタイミング、鍵管理の注意点について解説します。

Algorithm

詳細な説明

HS256(SHA-256を使用するHMAC)は、JWTで最も一般的に使用される対称署名アルゴリズムです。単一の共有秘密鍵を使用して、トークン署名の作成と検証の両方を行います。このアルゴリズムは、base64urlエンコードされたヘッダーとペイロードに対して、SHA-256をハッシュ関数として使用するHMAC(Hash-based Message Authentication Code)を適用します。

HS256の署名の仕組み:

HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload),
  secret
)

署名プロセスでは、エンコードされたヘッダーとペイロードをピリオド区切りで連結し、秘密鍵を使用してこの文字列のHMAC-SHA256を計算します。結果の署名はbase64urlエンコードされ、JWTの3番目の部分として追加されます。検証では同じ計算を繰り返し、結果を受信した署名と比較します。

鍵の要件:

HS256の秘密鍵は、SHA-256のセキュリティレベルに合わせて最低256ビット(32バイト)の長さが必要です。短い鍵を使用するとアルゴリズムが弱くなります。鍵は暗号学的に安全な乱数生成器を使用して生成し、パスワードやパスフレーズから導出すべきではありません。「mysecretkey」のような弱い秘密鍵はブルートフォース攻撃で解読可能であり、その鍵で署名されたすべてのトークンが完全に危殆化します。

対称鍵のトレードオフ:

HS256の根本的な特性は、同じ鍵で署名と検証を行うことです。つまり、トークンを検証する必要があるすべてのサービスが秘密鍵を所有しなければなりません。20のサービスを持つマイクロサービスアーキテクチャでは、20のサービスすべてが署名鍵にアクセスできる必要があります。いずれか1つのサービスが侵害されると、攻撃者はシステム全体のトークンを偽造できます。これがRS256のような非対称アルゴリズムと比較したHS256の主な制限です。

HS256を選択すべきタイミング:

HS256は、単一のサーバーまたは小規模で厳密に管理されたクラスタがトークンの発行と検証の両方を行う場合に理想的です。実装が簡単で、計算が高速で、RSAベースの代替手段よりも署名が小さくなります。モノリシックアプリケーション、内部ツール、単一サーバーAPIが最適な候補です。トークンの発行者と消費者が別のエンティティである分散システムでは、代わりにRS256またはES256を検討してください。

ユースケース

単一サーバーのNode.jsアプリケーションが、256ビットの秘密鍵でHS256を使用してセッションJWTに署名し、実装をシンプルに保ちながら高速な検証を実現します。

試してみる — JWT Decoder

フルツールを開く