あなたの次のウェブアプリを確保する方法


どのようにあなたのWebアプリケーションを確保していますか?セッションクッキーを使っていますか?第三者ベース認証?SAML今日はJSONウェブトークン、JWTというニート標準を紹介します.あなたがウェブアプリケーションで働いているならば、あなたが少なくとも彼らのことを聞いた良いチャンスがあります、しかし、今日、私はあなたを彼らのために彼らを神秘化しようとするつもりです.
すべてのnitty gritty詳細に入ることに興味があるならば、あなたはそうすることができますread the RFC , しかし、それはこの記事のゴールでありません.代わりに、行きます.
  • JWTはどのような高レベルの概要を与える
  • JWTがどのように動作し、なぜそれが偉大なの詳細についてもう少し行く
  • カバーいくつかの一般的なJWTセキュリティ落とし穴
  • JWTとは


    JSONのウェブトークンopen standard データの作成と送信.それは方法を提供しますcryptographically sign JSONペイロードは、その信頼性と整合性を検証し、そして/またはJSONペイロードを暗号化して機密性を提供する.暗号署名をデジタル署名と呼ぶことがあるかもしれないことに注意してください.

    JWTは暗号署名トークンである


    この記事の目的のために、暗号化トークンを議論します.暗号的に署名されたトークンは、サーバによってユーザに発行され、ユーザがユーザに対して、ユーザが行動を実行する権限を与えられることを証明するために、サーバに戻ることができる.この暗号署名には2つの主な利点があります.
  • サーバだけが秘密鍵を知っているので、サーバだけが有効なトークンを発行することができます.
  • トークンとそのJSONペイロードを暗号化署名の特性のために検出なしで修正または改ざんすることは不可能です.(どのように動作しますかhere .
  • これらのプロパティは、JWTSに認証のための大きな仕組みを作ります.ユーザが自分のユーザ名とパスワードでログインするとき、ユーザID、そのアクセス許可/アクセスレベル、および有用な他の属性などの識別情報を含むトークンを発行できます.
    そして、ユーザーがアプリケーションルートまたは機能にアクセスして、アクセスするとき、彼らはサーバーにこのトークンを提示します、そして、サーバーはトークンからこれらの特性を読むことができます.一旦アプリケーションがトークンが有効であると保証するならば(トークンは期限が切れるように構成されることができます)、そして、改ざんされていません、あなたはトークンの情報に基づいて承認決定をすることができます.

    トークン構造:JWTの3部


    署名されたJSONウェブトークンは、3つの主要な部分を持ちます:ヘッダー、JSONペイロードとサイン.
  • ヘッダーには暗号化シグネチャを生成するために使用される暗号化アルゴリズムを識別するJSONが含まれており、other information トークンタイプ、X . 509証明書チェーン情報などを使用している場合.
  • ペイロードはJSONオブジェクトです.それが含んでいるデータはクレームとして知られています.JWT規格定義seven standard claims . あなたは、ほとんどのプログラミング言語のいくつかのキーワードが特定のものを意味するために予約されて、他の変数名のために使われることができないという同じ方法で「予約された」クレームと考えることができますclass if , else , など).これらの標準的なクレームは、ユーザーの身元、期限情報、発行者に関する情報を格納することができます.また、トークンに追加のクレームを追加することができます.以下のサブセクションでこれをカバーします.
  • シグネチャは、ヘッダとペイロードをbase 64でエンコードすることで計算され、. , そして、サーバーの秘密鍵を使用してこのストリングを暗号化します.トークンを検証するために、サーバーはそれが受け取ったトークンのヘッダーとペイロードのためにこのプロセスを繰り返して、結果をトークンの署名ブロックに比較します.トークンが改ざんされた場合、2つは一致しません.
  • これらの部分からトークンを形成するには、各部分はbase64 encoded , そして、部品は点と共に連結される.以下は例です.
    eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJsb2dnZWRJbkFzIjoiYWRtaW4iLCJpYXQiOjE0MjI3Nzk2Mzh9.gzSraSYS8EXBxLN_oWnFSRgCzcmJmMjLiuyu5CSpyHI
    

    JWT主張- JWTトークンで情報を格納すること


    JWTの主張はトークンのペイロードで定義されます.彼らは、トークン、発行者、それが発行されているユーザーだけでなく、他のオプションの情報についての有用な情報を格納することができます.
    例えば、ユーザがログインしたとき、サーバは管理者権限を持っているかどうかをチェックし、ユーザのユーザIDを含むトークンを発行し、管理者権限を持っているかどうかを確認します.
    {
      "iat": 1609781109,
      "nbf": 1609781109,
      "jti": "0c2df7d5-f940-409a-b8b5-b3c6f9f1ef1e",
      "exp": 1609784709,
      "identity": "964403f4-444a-428a-88a0-15da8cdaf17c",
      "fresh": false,
      "type": "access",
      "user_claims": {
        "email": "[email protected]",
        "real_name": "John Doe",
        "customer_acct": "Some Organization LLC",
        "is_admin": true
      }
    }
    
    この場合、identity はユーザIDのGUIDです.The iat , nb , exp , and jti フィールドはすべてstandard claims . user_claims ユーザーに関する追加情報を格納するために追加したクレームです.
    ユーザーが動作を実行しようとすると、サーバーはユーザーの要求で送信されたトークンをチェックすることができ、ユーザーがそのアクションを実行する権限があるかどうかを確認するためにこれらのクレームを使用できます.

    アプリケーションでJWTを使用する利点


    JSONウェブトークンの使用には多くの利点があります.
  • WebはJavaScript上で動作するので、JSON認証情報を格納するための素晴らしい選択です.しかし、JWTはJavaScriptアプリケーションに限定されません- PHPからPythonへのすべてはJSONを消費することができます.それは柔軟で使いやすいです.
  • JWTの主張を簡単にデータベースの検索を行うことなく、アプリケーション内でアクセスできるユーザーに関する追加情報を格納することができます.
  • トークンは小さく、安全です.彼らはクッキーとして、ローカルストレージ、またはセッションのストレージに格納することができます.
  • 最も一般的なWebフレームワークには、JWT用のライブラリがあります.(この記事の一番下にいくつかのリンクを入れます).
  • 共通JWTセキュリティ落とし穴


    任意のセキュリティメカニズムのように、JWTはいくつかの一般的な落とし穴があります.彼らは避けるのが難しいです、しかし、あなたは彼らを避けるために何を知っている必要があります:

    認証のためのJWT認証


    JWT認証のためのメカニズムではなく、認証です.認証は重要です:認証はユーザが彼らが言うということを確実にしています.認証は、通常、認証が既に発生した後に、アクションを実行する(許可)許可されているかどうかを判断します.
    JWTトークンをユーザーに発行する前に、それらを認証する必要があります.これは通常、ユーザ名とパスワードで行われます.(もしそのことについてもっと知りたいなら、チェックアウトしてください).ユーザーが認証された(すなわち、自分のユーザ名とパスワードが確認された後)、その後、アプリケーションに対して次の要求で認証目的で使用できるトークンを発行します.

    あなたの鍵が安全であることを確認してください


    あなたがデモに沿って続いているならば、彼らは一般的に例コードで例キーを持っています.キーをコピーしないでください.短い単語やフレーズを使用しないでください-それは長い、ランダムなキーである必要があります.

    アプリケーションに秘密キーをコードしないでください


    トークンにサインするために、あなたのサーバはそれが秘密鍵を持つ必要があります.あなたの言語に使用するJWTフレームワークによっては、これをいくつかの方法で指定できます.アプリケーションにキーをハードコードしないことが重要です.ハードコーディングキーは、キーをあなたのバージョン管理にコミットされます.(これは特にあなたのプロジェクトが公開されている場合に悪いです).鍵を持っている誰もがトークンを作成することができますので、それは秘密を維持することが重要です.私は環境変数やいくつかの種類の秘密マネージャを使用することをお勧めします.

    クッキーのトークンの保存?しっかりしなさい。


    設定してくださいsecure and HttpOnly JWTクッキーの属性.The secure 属性は、ブラウザーが暗号化された上でトークンを送るのを確実にしますhttps ) クッキーが遮断されるのを防ぐ接続.
    The HttpOnly 属性はJavaScriptを通してクッキーをアクセスできないことを保証します.そして、それはクロスサイトスクリプティング(XSS)攻撃を軽減するのを助けます.
    あなたは、この上でより多くの情報を見つけることができますhere .

    結論


    キーテイクアウト
  • JWTは認証のために使用できるオープンスタンダードです.
  • 秘密鍵を知らずにJWTトークンを偽造したり修正したりできません.
  • JWTは、承認または他の目的のために使用できるトークンでJSONデータ(「クレーム」)を保存することができます
  • JWTは使いやすいです、そして、あなたのアプリケーションでそれを実装するための大きなフレームワークがたくさんあります
  • アプリケーションが秘密キーとJWTトークンを安全に管理することを確認します
  • 私はあなたがこの便利見つける!私はあなたが以下のコメントで何を考えて知ってみよう.
    あなたが雲アプリケーションのためにコードを書いているならば、物事がうまくいかないとき、あなたは行く必要があります.私は建築を手伝ったCodeLighthouse リアルタイムのアプリケーションエラー通知を送信するには、開発者にまっすぐに見つけることができますし、エラーを修正します.無料で起動するcodelighthouse.io 今日!

    脚注


    約束されているように、Python/フラスコ、ノード用のJWTライブラリへのリンクがいくつかあります.JS/ExpressとPHP :
    Flask-jwt-extended : 私は徹底的に使用して楽しむPythonのフラスコフレームワークのための非常に堅牢なモジュール.
    Express-jwt : シームレスにノードに統合する偉大なパッケージ.JSエクスプレスアプリ.あなたがノードで構築しているなら、私は非常にそれを推薦します.JSエクスプレス.
    php-jwt : FireBaseによって維持されるPHP用の高品質JWTライブラリ.