JWT(JSON Web Token)


JWTとは?


JSON Web Token(JWT)は、Web規格(RFC 7519)として、2つのオブジェクトの中でJSONオブジェクトを使用して、簡単で自己包含的な方法で安全に情報を伝達する.

構成



見出し


ヘザーには2つの情報がある
  • タイプ:コインタイプ
  • alg:ハッシュアルゴリズムの指定
  • ->エンコード後
    const header = {
      "typ": "JWT",
      "alg": "HS256"
    };
    
    // encode to base64
    const encodedPayload = new Buffer(JSON.stringify(payload))
                                .toString('base64')
                                .replace('=', '');
    console.log('payload: ',encodedPayload);
    
    結果
    header: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

    情報(ペイロード)

  • ここにコインが入っている情報が
  • 情報の一部を「クレーム」と呼ぶ
  • クレーム登録済み(登録済み)クレーム、公開(公開済み)クレーム、非公開(秘密保持済み)クレーム
  • 登録済みクレーム


    サービスに必要な情報ではなく、トークンの情報を記録するために命名されたクレーム.
  • iss:コイン発行者
  • sub:コードネーム
  • aud:トークン対象
  • exp:トークンの有効期限
  • nbf : Not Before. コイン有効化日
  • iat:トークン発行時間
  • jti:JWTの一意の識別子で、主に重複処理防止
  • 公開クレーム


    競合を回避するためのURI形式のクレームの名前付け
    ex)
    {
        "https://velopert.com/jwt_claims/is_admin": true
    }

    非公開クレーム


    Xを登録し、Xクレームを公開します.双方が協議で使用し、重複して衝突する可能性があることに注意してください.
    ex)
    {
        "username": "velopert"
    }
    ->エンコード後
    const payload = {
        "iss": "velopert.com",
        "exp": "1485270000000",
        "https://velopert.com/jwt_claims/is_admin": true,
        "userId": "11028373727102",
        "username": "velopert"
    };
    
    // encode to base64
    const encodedPayload = new Buffer(JSON.stringify(payload))
                                .toString('base64')
                                .replace('=', '');
    
    console.log('payload: ',encodedPayload);
    結果
    payload: eyJpc3MiOiJ2ZWxvcGVydC5jb20iLCJleHAiOiIxNDg1MjcwMDAwMDAwIiwiaHR0cHM6Ly92ZWxvcGVydC5jb20vand0X2NsYWltcy9pc19hZG1pbiI6dHJ1ZSwidXNlcklkIjoiMTEwMjgzNzM3MjcxMDIiLCJ1c2VybmFtZSI6InZlbG9wZXJ0In0

    に署名


    ヘッダの符号化値と情報の符号化値を合成した後,所与の秘密鍵でハッシュ生成を行う.
  • タイトルと情報.合わせて
  • secretで復号
  • base 64符号化
  • const crypto = require('crypto');
    const signature = crypto.createHmac('sha256', 'secret')
                 .update(encodedHeader + '.' + encodedPayload)
                 .digest('base64')
                 .replace('=', '');
    
    console.log('signature: ',signature);
    結果
    signiture: WE5fMufM0NDSVGJ8cAolXGkyB5RmYwCto1pQwDIqo2w

    JWTプロパティ

  • 複数種類のプログラミング言語をサポート
  • 自己包容力
  • 伝わりやすい
  • 使用状況

  • 会員認証
  • 情報交流
  • Reference

  • https://velopert.com/2389