🤖
JWTヘッダの検証(node)
略称 | 名称 | 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がタイプの時はその他のオプションは追加されません。
{"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 署名
-
RSA with PKCS #1v1.5 Padding はパディングオラクル攻撃に対して脆弱
電子政府における調達のために参照すべき暗号のリスト(CRYPTREC暗号リスト) ↩︎ ↩︎ ↩︎
Discussion