JWT (JSON Web Tokens)


1.ログインの実装方法


👎 ユーザーにIDとPasswordを要求し続ける

  • ユーザからIDとPasswordを取得しDBと比較する.
  • ログインを維持できないため、モバイルページは情報を維持できません.
  • も脆弱です.
  • 👎 セッション(サーバメンテナンス)


    これは,サーバのメモリ,データベースなどのリソースを利用してユーザ情報を維持する方式である.

    オペレーションシーケンス



    長所

  • トークン方式よりも安全です.
  • 短所

  • サーバの拡張性が劣っています.
  • サーバのリソースが多数必要です.
  • (セッションの保存とメンテナンスが必要)
  • は、通常、複数のサーバを使用してトラフィックを分散し、ログイン時にセッションを参照する場合、要求をストレージセッションの対応するサーバに送信するだけです.
  • 👍 Tokenメソッド(クライアントメンテナンス)


    これは,ユーザがログインした後,サーバから発行されたトークンをブラウザリポジトリに格納して情報を保持する方式である.

    長所

  • サーバに格納されないため、サーバは拡張性があります.
  • は、トークンが有効かどうかを確認するだけで、セッション方式とは異なり、どのサーバにリクエストを送信しても関係ありません.
  • 2. JWT


    JWTはWeb規格(RFC 7519)で、電子署名のURL-SAFE(URLに使用可能な文字のみを含む)のJSONである.
    公開鍵暗号方式を使用します.

    🔧 JWT構造



    JWTは.を基準に3つの部分に分かれている.

    1) Header

  • トークンタイプ
  • ハッシュアルゴリズム情報
  • JWTの第1の部分は、
  • BASE 64によって符号化され、書き込まれる.△暗号化ではないので、重要な情報を追加することはできません.
  • {
    	'alg' : 'HS256',
        'typ' : JWT'
    }

    2) Payload

  • 私たちが送信するデータが含まれている場所.
  • 登録目的:定義済みの集合
  • 、例えばexpは、期限切れを示す
  • Public Claim:公開
  • Private Claim:クライアントとサーバ間のプロトコルで使用され、ユーザ情報を推定できない情報(PK)が含まれます.
  • の上の3つの要素を組み合わせてBASE 64を符号化し、2番目の要素に配置する.△暗号化ではないので、重要な情報を追加することはできません.
  • {
    	'user-id' : '1',
        'exp' : '1539517391'
    }

    3) Signature

  • JWTがそのままであることを確認する(整合性を確認する場合)に使用する部分です.
  • ヘッダ、ペイロード、およびJWT secretは、ヘッダによって指定された暗号アルゴリズムで暗号化されて送信される.(復号可能)
  • フロントエンドがJWTをバックエンドAPIサーバに送信すると、サーバは、サーバによって生成されたJWTが正しいかどうかを判断するために、渡されたJWTの署名部分を復号する.
  • BASE 64のみで符号化されるため、重要な情報は含まれません.
  • 🔧 JWTプロセス


    1) Only "Acces Token"



    1~3回の操作を行うとログインし、認証を取得します.
    4️⃣
    クライアントは、APIを要求すると、認証ヘッダにJWT(Access Token)をロードして送信する.
    5️⃣
    サーバは、ユーザが送信したトークン署名をsecret keyで復号し、有効なトークンであるか否かを確認する.
    4~6回の動作を繰り返して承認する.

    2) With "Refresh Token"


    1番方式で行った場合の問題はAccess Tokenを奪われたことです.
    (なぜuser.idをタグに入れられないのですか?)
    トークンの有効期間が長いと、その期間内に情報が盗まれ、それを意識して有効期間が短縮されると、ユーザは複数回ログインするトラブルに直面する.
    この問題を解決するために、Refresh Tokenを使用します.Refresh TokenAccess Tokenに類似したJWTである.
    ログインすると、サーバはAccess TokenRefresh Tokenを同時に送信します.
    ただし、両者の有効期間設定は異なる.Refresh Tokenは1日、Access Tokenは1時間、Access Tokenは満期後もRefresh Tokenがあり、ユーザーはログインする必要がなくAccess Tokenを再び取得することができます.
    したがって、ログインは維持されます.

    🔧 タグの保存先


    開発者の好みやサービスの性質によって異なります.

    Local Storage

  • このドメインに永続的に保存したい場合.
  • Cross-site Request Forgeryへの攻撃は安全です.
  • XSS(Cross-site Scripting)に弱い.
  • Cookie

  • ドメインに日付を設定し、その日付に保存したい場合.
  • XSS(Cross-site Scripting)攻撃からLocalStorageより安全です.
  • XSS(Cross-site Scripting)とCSRF(Cross-site Request Forgery)が脆弱になる可能性があります.
  • 👍 クッキーを使用してXSSをブロックし、Refresh Tokenを使用してCSFRをブロックすることができます.

    🔧 JWTのメリットとデメリット


    長所

  • は、追加の認証ストレージを必要としないため、サーバとの通信を最小限に抑えることができる.
  • 流量負担が小さい.
  • つまり、
  • JWTという独立したオブジェクトが使用されます.
  • 短所

  • JWTが大きいほど、ほとんどのリクエストが一緒に送信され、データトラフィックのサイズに影響を与える可能性があります.
  • トークンはクライアントに格納されるため、データベースがユーザ情報を変更してもトークンに直接適用されない.
  • <コメント>
    JWTはどこに保存すればいいですか?localStorage vs cookie
    JWTはいったい何なのか、なぜ使うのか。