JWT(Json Web Token)と非対称鍵


JWTとは?


JSON objectを用いて情報伝達方法を暗号化する公開基準.JWTは便利で(コンパクトな)自己受け入れの方式で安全に情報を伝達する.

自分を受け入れる?


JWTは自分の必要なすべての情報を持っている.JWTシステムが提供するトークンには、「トークンに関する基本情報」、「伝達する情報」、および「トークンの有効性を検証する情報」が含まれる.

2.JWTの構成


1) Header


アルゴリズムタイプ(RSA、SHA 256など)を定義します.
  • alg : 署名暗号化アルゴリズム(ex:HMAC SHA 256,RSA)
  • typ : トークンタイプ
  • 2) Payload


    コインに含まれる情報の破片、クレム.(実際のJWTで知っているデータ)サーバとクライアント間のインタラクティブシステム 使用する情報の内容.

    3) Signature


    トークンは有効な情報を表します.署名はユーザーによって操作できません.

    3.JWTの働き方



    1)JWTの作成


    JWTはHeaderとPayloadを符号化して結合し,特定のアルゴリズム暗号化により署名を生成する.
    encoding(Header) + encoding(Payload) → encryption → signature
    header = {
    	"alg":"HMACSHA256",
    	"typ":"JWT"
    }
    
    payload = {
    	"user_id":1,
    	"name":"bdg",
    	"class":"2"
    	...
    }
    
    signature = HMACSHA256(
      base64UrlEncode(header) + "." +
      base64UrlEncode(payload),
      secret)
    
    JWT = base64UrlEncode(header).base64UrlEncode(payload).signatue

    2)JWT消費


    ユーザはbase 64復号によりヘッダと負荷を容易に得ることができる.ただし、secretはサーバのみを知っているため、ヘッダと負荷を変更した後に署名を再作成することはできません.ユーザは,サーバから送信されたJWTをそのまま消費し,変更せずにサーバに再送信するだけである.

    3)検証


    サーバは,ユーザが返すJWTのヘッダと負荷を用いて署名を再生成し,ユーザが送信した署名と比較する.この2つの署名が一致する場合、ユーザはJWTを変更していないことを証明する.
    ペイロードが変更されていないことが証明されたので、ユーザは、ペイロード内のユーザIDを信頼し、それによってユーザを識別することができる.

    4.非対称鍵を使用するJWT


    非対称鍵を使用する場合、サードパーティ製アプリケーションはライセンスを実行できます.

    1)非対称鍵暗号化とは?


    一対の鍵が存在し、相手鍵で暗号化できる値を自分の鍵で復号する方式を非対称鍵暗号化方式と呼ぶ.
    例えば、A、Bという鍵が2つ存在するとする
    まずAで「重要値」を暗号化します.
    A("重要値")="暗号化値"
    この「暗号化値」はBによって復号される.
    B("暗号化値")="重要値"
    ここでの特殊な点は,Aが暗号化された値を復号できないことである.自分で暗号化した値だけが他の鍵で復号できます.
    A(「暗号化値」)=「重要値」-(X)

    2)非対称鍵を用いたJWT認証/認証方式


    上記の「JWTの動作方式」では、HMACSHA 256アルゴリズムとsecretというキー値によって暗号化されている.特に復号化プロセスは行われていない.しかし、この場合、secretの3番目のサービスがJWTが有効かどうかを判断することはできない.
    ここで肥大Kingキーを適用しましょう一対の非対称鍵(A:公開鍵、B:秘密鍵)を使用します.まず,秘密鍵(A)はサーバのみであり,決して公開されない.これに対して、公開鍵(A)は公開されており、誰でも簡単に鍵を得ることができる.

  • JWTの作成
    署名を生成する過程で秘密鍵(B)によりsignatrueを生成する.この署名は、秘密鍵(B)によってのみ生成され、公開鍵(A)によってのみ復号される.

  • JWT消費
    ユーザは、サーバから送信されたbase 64復号によって、JWTのヘッダおよび負荷を容易に回復することができる.また,罪悪は公開鍵(A)により復号することも可能である.(実際には、ユーザは署名を復号する必要はありません.)

  • 第3項サービス
    ユーザがサーバではなく3番目のサービスにJWTを渡すとします.この第3のサービスは、ユーザIDを識別し、偽造したかどうかを判断する必要がある.
    3番目のサービスは、元のサーバから公開鍵を取得します.
    この公開鍵(A)は、ユーザが送信したJWT署名を復号するために使用される.復号結果がJWTのヘッダおよびペイロードと一致する場合、JWTは偽造されていないことが証明される.これにより、認証サーバがない場合に認証を実行することができる.
    3番目のサーバは、公開鍵(A)のみを使用して、ユーザJWTが偽造したかどうかを識別する.
  • 3)非対称鍵を利用したJWT


    主にMicro Serviceアーキテクチャで使用されます.最初のIDとPasswordがJWTに配布する認証サーバを分離し、各アプリケーションは鍵を公開するだけで、ユーザが送信したJWTが有効かどうかを判断することができる.

    Reference

  • https://jwt.io/introduction
  • http://www.opennaru.com/opennaru-blog/jwt-json-web-token-with-microservice/
  • https://velopert.com/2389