🤖
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