JWT認証方法


JWT : JSON WEB TOKEN



電子署名URL利用可能文字のみからなるJSON
電子署名によるJSONでの改ざんの確認が可能

認証方式と原理


JWT構成


aaaa.bbbb.ccccのような3つの部分に分かれています
各タイトル.payload.署名で構成
Base 64符号化には「+」、「/」、「=」が含まれるが、JWTはURL-SafeのBase 64 url符号化を使用してURIでパラメータとして使用する(+、/、=などの文字は他の文字列に置き換えられる)
  • Base 64符号化
  • Header


    構成
  • トークンタイプとハッシュ暗号化アルゴリズム
  • トークンタイプ(JWT)
  • ハッシュアルゴリズム(HMAC、SHA 256、RSA等)
  • {
      "typ": "JWT",
      "alg": "HS256"
    }

    Payload


    伝達する情報(ex.ユーザid、ロールなど):claimとも呼ばれる
  • キー:
  • を価値の形で渡す
    {
      "iss": "//sso.tvcf.co.kr",
      "iat": 1626308465,
      "exp": 1626394865,
      "roles": [
        "guest",
        "user"
      ],
      "userId": "tonydev",
      "userName": "tony",
      "userType": 3,
      "userLevel": 1
    }
    一般通貨vsクレーム

  • よくあるトークンの問題
  • で発行されたコインについては、期限切れにすることはできません.
  • から発行されたトークンをチェックまたは処理するたびに、データベースにアクセスしてチェックすると、負担が発生します.
  • ユーザーのログアウトなどによるコインの管理はできません.

  • クレーム(クレーム:クレーム、要求)
  • の情報を含むトークン
  • クレームの3種類
  • 登録済みクレーム
  • タグ情報決定データ型、オプション
  • iss:トークン発行者(発行者)
  • sub:トークンタイトル(トピック)
  • および:ターゲット(視聴者)
  • exp:トークンの有効期限
  • nbf:トークンアクティブ化日(notbefore)-この日までにトークン
  • はアクティブ化されていません.
  • iat:コイン発行時間:
  • jti:JWT Id-アクセストークンなどの使い捨てトークンの重複を防止するための
  • 時間:数値データの検証方法
  • new Date(parseInt("1626394865") * 1000)
  • 公開クレーム
  • の競合を回避するために開示された名称
  • URL形式で書く
  • 例:{"https://hexlant.com":true}
  • 非公開クレーム
  • は、実際に使用する開発者によって指定され、サーバおよびクライアントによって定義されたクレーム
  • である.
  • { "token_type": "access"}
  • signature


    暗号化された鍵にはsecret keyが含まれます
  • ヘッダに指定されたアルゴリズムおよび鍵および署名は、ペイロードおよびヘッダを含む.

  • トークンへのアクセスとトークンのリフレッシュ


    Access token : JWT


    Refresh token:tokenにアクセスするタグを取得する

  • accessトークンを使用して期限が切れた場合、refreshトークンを使用して
  • を再発行する.
  • 通常API要求はリフレッシュトークン
  • を同時に送信しない.
  • refreshトークンはどこに格納され、いつ一緒に送信されますか?
  • 普段はaccessトークンだけがapiサーバに転送されて認証が行われていますが、refreshトークンはブラウザのどこに格納されていますか?
  • accessトークンが期限切れになった時間をどのように知ってリフレッシュしますか?
  • refreshトークンの格納場所
  • Client side(browser)
    1-1. Local storage
  • javascriptアクセスしやすくXSS攻撃を受けやすい
    1-2. Cookie
  • Cookieの場合、HTTPONLYとSecureオプションを使用してCSRF攻撃と比較すると、ある程度のセキュリティ
  • を提供することができる.
  • Server side
    2-1. セッション
  • セッションに格納し、セッションの有効期限を延長:ユーザーが多くなるのはでたらめで、最初にセッションを使用したくないのはEXCETOWN方式
  • です.
    2-2. DBに保存
  • DBにrefreshタグを格納、そのインデックス値をCookieまたはローカルストレージ(ハッシュ処理がより安全)
  • に格納する.

    JWTボリューム期間


    タイトル(OSEタイトル)

    new Buffer('{"alg":"HS256","typ":"JWT"}').toString("base64")
    // eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

    payload(JWT Claim Set)

    new Buffer('{"iss":"John Doe","exp":1434290400000,"username":"john","age":25,"iat":1434286842654}').toString("base64")
    // eyJpc3MiOiJKb2huIERvZSIsImV4cCI6MTQzNDI5MDQwMDAwMCwidXNlcm5hbWUiOiJqb2huIiwiYWdlIjoyNSwiaWF0IjoxNDM0Mjg2ODQyNjU0fQ==

    signature

    var crypto = require('crypto');
    
    var secretKey = 'secret';
    var headerAndClaimSet = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJKb2huIERvZSIsImV4cCI6MTQzNDI5MDQwMDAwMCwidXNlcm5hbWUiOiJqb2huIiwiYWdlIjoyNSwiaWF0IjoxNDM0Mjg2ODQyNjU0fQ';
    
    crypto.createHmac('sha256', secretKey).update(headerAndClaimSet).digest('base64')
    // jzvwdy5mQuzkEenNEFeRlSytvB7+X7NVAvtTDr1jP0Q=

    JWTプロパティ

  • トークン自体がデータを持っている
    誰でも
  • を開くことができるので、重要な情報
  • を入れるべきではありません.
  • 他の通貨より
  • 長い
  • 通貨の有効期限を強制できません.
  • 銀行サービス、酒神関連サービスなどのリアルタイムセキュリティが非常に重要な場所で、JWTを使用するよりもデータベースの負担が重すぎても、データベースにタグを追加することができます.
  • よりもセキュリティが重要なアプリケーションでは、
  • という大きなメリットがあります.
  • の有効期限が短いaccessトークンとは異なり、refreshトークンの有効期限は
  • と長い.

    タグ確認プロセス


    Case 1:access tokenとrefresh tokenの両方が期限切れになった場合->エラーが発生します
    Case 2:access tokenは期限切れですが、refresh tokenが有効である場合->access tokenの再発行
    Case 3:access tokenは有効ですが、refresh tokenが期限切れの場合->refresh tokenを再起動します
    Case 4:accesss tokenとrefresh tokenが有効な場合->

    セッション-Cookieメソッドとの比較


    セッション-Cookie認証方法



    セッション-Cookie認証は、ログインで最も一般的な認証方法です.
    Cookie(Cookie)
  • クライアント(ブラウザ)上のリポジトリ
  • ブラウザは最大300個、ドメインごとに最大20個、各ストレージ4 KB
  • コンポーネント
  • Name-value
  • 有効期間(Max AgentまたはExpires)
  • ドメイン(ドメイン):Cookieを送信するためのドメイン
  • パス:サーバルーティング時に使用されるパス、default:"/"
    Cookieは
  • サーバからPathサブルーティング
  • に送信する.
  • セキュリティ:Cookie
  • は、trueに設定HTTPSの場合にのみ送信.
  • HttpOnly:JavaScriptでブラウザのCookieにアクセスするかどうかを確認します
  • true:jsはCookie
  • にアクセスできません.
  • false(default):XSS攻撃を受けやすい
  • SameSite:Cross-OriginリクエストCookieを送信するかどうか
  • Lax:Cross-origin「GET」メソッドのみに対してCookie
  • を送信
  • Stric:Cookie
  • をSame-Sciteでのみ送信
  • None:Cookieは随時送信できますが、セキュリティオプション
  • を有効にする必要があります.
    セッション(サーバ上のリポジトリ)
  • サーバ側Cookie、キー値からなるオブジェクト
  • サーバは、クライアントを区別するためにセッションIDを提供する
  • クライアントが要求を送信と、サーバはCookieをヘッダにマウントするときにセッションID
  • を送信する.
  • セキュリティはCookie
  • より優れている
  • ユーザーの増加に伴い、サーバメモリの使用量は
  • 増加する.

    セッションとクッキーの違い

  • と同様に、最終セッションもCookieを使用してサーバに格納されます.
    セッション
  • ブラウザの終了を通知するには、beforeUnloadイベント
  • を使用します.

    トークン方式(JWT)とセッション-Cookie方式の違い

  • セッションクッキーは、セッションID
  • のみを送信する.
  • セッションでは、サーバメモリ
  • が必要です.

    適用した項目の復習


    jasonwebtokenモジュール(npm i jsonwebtoken)の使用


    JAsonwebtokenはアクセストークンとリフレッシュトークンをどのように管理しますか?

  • トークンのみを生成し、
  • を保存します.
    //tvcfの分析方法

    分析をtvcfに適用する方法



    tvcfのコインの満期日は1日です.
    refreshトークンはどこに格納されますか?
  • ローカルストレージでは、アクセストークンのみが表示されます.
  • クッキー登録前後に変化はなく、サーバ側に保存されていると推測される.
  • セッションまたはDBに1つの場所に保存される場合があります.
  • 私が適用したJWT(npm jsonwebtoken)とtvcfで適用した方法の違いを分析する

    {
      "id": 9,
      "iat": 1626355500
    }
  • refreshトークンを発行するのではなく、ローカルストレージにアクセストークンを永続的に格納しました.
    トークンで送信されるのはuserです.id
  • のみ送信
  • refreshトークンには概念がなく、apolloクライアントのキャッシュ機能を使用しており、想像していたjwt方式よりも、トークンのペイロードに多くの情報を含める必要はないようです.
  • n/a.結論


    JWT認証の実現方式は多い.
    どちらが正解かは言い難い.
    クライアントがリクエストを受信するたびにverify候補を送信するミドルウェアを使用して、会社のサーバが論理をどのように構成しているかを知りたいです.

    参考文献

  • JSON Web Tokenの理解と利用
  • 汎用トークンベースの認証とクレームトークンベースの認証
  • NodeJs jsonwebtoken calculate “iat” and “exp”
  • JSON Claim set
  • タグの更新
  • Access Tokenの格納場所の考察
  • タグ確認プロセス
  • セッションCookie認証方法
  • Cookieとセッションの概念
  • ビスケットのすべてについて