🤖

JWTヘッダの検証(node)

2022/07/02に公開約3,800字
略称 名称 RFC 概要
JWT JSON Web Token RFC 7519 ClaimのJSON 表現
JWS JSON Web Signature RFC 7515 電子署名付きメッセージの表現
JWE JSON Web Encryption RFC 7516 暗号化メッセージの表現
JWK JSON Web Key RFC 7517 暗号鍵の JSON 表現
JWA JSON Web Algorithm RFC 7518 JWS や JWE などで使われる暗号アルゴリズム

構造

ヘッダ(header)、ペイロード(payload)、署名(signature)の3つの部分に分かれており、これらをそれぞれBase64URL方式で符号化して「.」(ピリオド)で連結したものがトークンとなります。

JOSE Header
JWS Payload
JWS Signature

JWSヘッダ


JWT形式では以下の記載が一般的で、typがタイプの時はその他のオプションは追加されません。

JWT形式における暗号アルゴリズムリスト

{"typ":"JWT","alg":"HS256"}
"alg" Param Value Digital Signature or MAC Algorithm Implementation Requirements
HS256 HMAC using SHA-256 Required
HS384 HMAC using SHA-384 Optional
HS512 HMAC using SHA-512 Optional
RS256 RSASSA-PKCS1-v1_5 using SHA-256 [1] Recommended
RS384 RSASSA-PKCS1-v1_5 using SHA-384 [1:1] Optional
RS512 RSASSA-PKCS1-v1_5 using SHA-512 [1:2] Optional
ES256 ECDSA using P-256 and SHA-256 Recommended+
ES384 ECDSA using P-384 and SHA-384 Optional
ES512 ECDSA using P-521 and SHA-512 Optional
PS256 RSASSA-PSS using SHA-256 and MGF1 with SHA-256 Optional
PS384 RSASSA-PSS using SHA-384 and MGF1 with SHA-384 Optional
PS512 RSASSA-PSS using SHA-512 and MGF1 with SHA-512 Optional
none No digital signature or MAC performed Optional

検証方法

以下ディレクトリを作成し環境を初期化します。

md jwtHeader
cd jwtHeader
npm init -y

app.jsを作成しヘッダをBase64でエンコードし、デコードします。

app.js
 let header = Buffer.from('{"alg":"HS256","typ":"JWT"}').toString('base64');
 console.log("Header Encode:"+header)
 header = Buffer.from(header, 'base64').toString();
 console.log("Header Deode:"+header)

コンソールに出力します。

headerのエンコード:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
headerのデコード:{"alg":"HS256","typ":"JWT"}

次にライブラリーの検証を行います。jsonwebtokenをインストールします。

npm install jsonwebtoken

追加します。

app.js
const jwt = require('jsonwebtoken');
const token = jwt.sign({ 
    exp: Math.floor(Date.now() / 1000) + (60 * 60),
 username:'taro' }, 'secret');
 header = token.split('.');
console.log("jsonwebtoken header:"+header[0]);
header = Buffer.from(header[0], 'base64').toString();
console.log("jsonwebtoken header Deode:"+header)

コンソールを確認します。エンコード内容が同じであること確認します。

Header Encode:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
Header Deode:{"alg":"HS256","typ":"JWT"}
jsonwebtoken header:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
jsonwebtoken header Deode:{"alg":"HS256","typ":"JWT"}

JWS ペイロード

クレーム 説明
iss JWT発行者
sub JWT発行者から払い出されたユーザ識別子。文字列またはURIで表わされる
aud JWTを利用することが想定された主体の識別子一覧
exp JWTの有効期限を示す。有効期限を設定
nbf JWTが有効になる日時を示す
iat JWTを発行した時刻を示す
jti JWTのための一意な識別子。JWTのリプレイを防ぐことに利用する
typ typヘッダパラメータと同じ値空間および同じ規則が適用される

Registered Claim Names
IANA JSON Web Token Claimsに予め登録されたもので、強制ではないですが推奨されています。

Public Claim Names
利用者が自由に名前を決めることができますが、IANAの「JSON Web Token Claims」に登録するか、公的に衝突しない名前である必要があります。

Private Claim Names
発行者と利用者間で合意が取れている名前です。

JWS 署名

脚注
  1. RSA with PKCS #1v1.5 Padding はパディングオラクル攻撃に対して脆弱
    電子政府における調達のために参照すべき暗号のリスト(CRYPTREC暗号リスト) ↩︎ ↩︎ ↩︎

Discussion

ログインするとコメントできます