JWT について

JWT

リソース指向なアーキテクチャ(Resource Oriented Architecture:ROA)なサイト構築には

RESTFulがデファクトな感がありますが、今回は、以前(結構前に)、社内の勉強会でも発表させて頂いた

このROAに対しての認証で良く使用されるJWT(JSON Web Tokenの略で、ジョットと読む)について共有させて頂きます。

 

 

JWTの構成

JWTは、以下の構成で成り立っています。

  • ヘッダー
  • ペイロード
  • シグネチャ

この文字列をbase64UrlEncodeし、ドット「.」で文字連結することでJWTとなります。

{ヘッダー}.{ペーロード}.{シグネチャ}

 

※詳細は、jwt.io をご参照ください。

 

 

ヘッダー

・alg …  アルゴリズム。シグネチャを暗号化する為のアルゴリズム名を指定(ES384やHS256 などを指定)

・typ …  トークンタイプ(JWTを指定)

 

データの例:{“alg”: “HS256″,”typ”: “JWT”}

base64UrlEncodeした値:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

 

 

ペイロード

・サーバーへ送付する実際のデータになります。key – value 形式で指定します。

・key – value 形式の組み合わせの事をクレーム(Claim)と言います

 

データの例:{“sub”: “1234567890”,”name”: “John Doe”,”iat”: 1516239022}

base64UrlEncodeした値:eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ

 

 

シグネチャ

・ヘッダーとペイロードをドット「.」で文字連結し、指定したアルゴリズム(この例の場合は「HS256」)で暗号化したものをシグネチャとします。

・暗号化する際のキーは、サーバでしか知らないシークレットキーを使用します。

 

データ例:base64UrlEncode(ヘッダーの値) + “.” +base64UrlEncode(ペイロードの値) をシークレットキーで暗号化

base64エンコードした値:SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

 

上の3つの値をドット「.」で文字連結したものがJWTとなります。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.

SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

 

サーバーサイドでしか知り得ない、シークレットキーを使用することにより

JWTの値の有効性が担保されます。(と言うか、シークレットキーが分からないとシグネチャの生成が適当な値となる)

 

 

JWTの認証フロー

実際の使用方法はとフローは以下な感じになります。

フローは図の上から順に…

  1. 認証
    1. 例えばユーザID(メアド)とパスワードをサーバーへPOSTします。
  2.  レスポンス(アクセストークン付与)
    1. サーバーは、取得した情報を基に認証を実施します。
    2. 認証NGだった場合、エラーコードとメッセージを返却します。
    3. 認証OKだった場合、シークレットキーを使用し取得情報からJWTを生成します。
    4. 生成したJWTをレスポンスします。
  3. リクエスト(アクセストークン付与)
    1.  サーバーから返却されたJWTの値をヘッダーなりパラメータなりに付与します。
    2. APIをリクエストします。(OAuthなどで、Authorization: Bearer Tokenとして良く使用されたりする。)
  4. 検証
    1. サーバーサイドで、シークレットキーを使用し、JWTのシグネチャ値を検証します。
  5. れすぽんす
    1. 認証できた場合は、リクエストに応じた値をレスポンスします。

 

Laravel/Lumenでの実装

ライブラリ(パッケージ)をインストールします。

 

※ライブラリの利用制限や、使用方法はこちらをご参照下さい。

 

JWT用のクラスを生成します。

後は、こいつをNew Jwt();して使うだけです。

でわ!



❏❏ TOPIC ❏❏ ------------------------------------------------------------

カスタム自由!フリーECサイトパッケージ
チャットボット導入サービス
WEBシステム開発・スマホアプリ開発はSRIAへ