2017-01-21 17 views
3

JSON Webトークン(JWT)に関する一般的な質問があります。JSON Webトークン(JWT)

JWTがハッキングや物理的なアクセスによってクライアントから盗まれた(たとえば、Cookieやアプリケーションのデータベースとして保存されていた)場合は、サーバーに送信して正当だと思うサーバーに送信できますユーザー。これは正しいです?

クライアントからデバイス/ブラウザのタイプまたは参照コードを一緒に送信するなど、これを防ぐための一般的な、または標準的な方法はありますか?サーバーは、JWTトークンが生成されて保存されたと。 (ただし、標準的な方法はサーバーに何も保存しないことです)

Java JWT(JJWT)、RESTful Java Jersey、およびGoogle Web Toolkitを実装する必要があるため、アドバイスしてください。 (私はこのような文書を読んできました:[https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage])。

ありがとうございました!あなたはキー有効期限exp(よりすなわち創造に関してでJWTを確認することができ、サーバー側では

byte[] key = getSignatureKey(); 

String jwt = Jwts.builder().setIssuer("myTestApplication") 
    .setSubject("myTest") 
    .setExpiration(expirationDate) 
    .put("scope", "testing") 
    .signWith(SignatureAlgorithm.HS256, key) 
    .compact(); 

:あなたのようJWTを構築しているクライアントで

答えて

5

JWTの存在は認証の証です。トークンを盗んだ攻撃者がユーザーを偽装する可能性があります。

  • は、ストレージの種類に応じて追加のセキュリティ対策を追加するTLSチャネルに
  • を使用します。

    ので、セキュアトークンを保持します。クッキーはCSRF攻撃に対して脆弱です。 Javascriptからトークンにアクセスする必要がない場合は、HttpOnlyを使用してください。 localStorageはXSSに脆弱であることの認証トークンに短い有効期限を設定し、資格情報を必要とするトークンの有効期限が切れている場合は、JWTが盗まれていることを知っているwon`tので

ブラックリストは有用ではありません。

  • を攻撃しますそして、それはプロキシの背後に、モバイルデバイスやシステムに問題がある可能性があるため、その使用ブレークのstateleness、JWT

    の利点の1つはまたIPにトークンを追加しますが、使用シナリオを考慮することが可能である

  • +0

    私よりも良い答え: – mxlse

    +1

    ブラウザの指紋(User-AgentやAccept- *など)を追加することもできます。また、2つのクッキーを使用します.1つはSameSiteクッキーであり、すべての機密操作に必要です(csrfはまだデータを盗みながら操作することはできません) –

    +0

    サーバーによって生成されたトークンはサーバーによってデジタル署名され、トークンがサーバに戻ったとき、サーバは、それが生成したトークンであることをサーバが認識するようになる。ただし、サーバーが同じクライアントであることを100%確かめることはできません。サーバーはトークンを生成したことを100%確信しています。したがって、他のコメントで述べたように、クライアント側(クライアントのIPアドレス、クライアントのブラウザの指紋など)は、同じクライアントであることを保証する必要がありますが、プロキシや携帯電話などの特定のユースケースでは破損します。私の理解は正しいのですか? – ifelsemonkey

    2

    日付、発行者iss、観客aud):

    JWTを盗む
    String subject = "notMyToken"; 
    try { 
        Jws jwtClaims = Jwts.parser().setSigningKey(key).parseClaimsJws(jwt); 
    
        subject = claims.getBody().getSubject(); 
    
        //OK, we can trust this JWT 
    } catch (SignatureException e) { 
        //don't trust the JWT! 
    } 
    

    は、SSLを使用することによって回避されなければならない...しかし、JWT場合盗まれた場合、このJWTを正確に再生するリスクがあります。それはjtiが入っています。

    jti(JWT ID)クレームは、JWTの一意の識別子を提供します。 識別子値は、 が、偶然同じ値が別のデータオブジェクトに割り当てられる可能性はごくわずかな確率であることが保証されるように割り当てる必要があります。アプリケーションが複数の 発行者を使用している場合は、異なる発行者 によって生成された値の間で衝突を防ぐ必要があります。 jtiクレームは、 JWTが再生されないようにするために使用できます。 jti値は、大文字小文字を区別する文字列です。このクレームの を使用することは任意です。

    このIDを使用すると、このIDがすでに送信されているかどうかを知ることができます(サーバー側でブラックリストに登録する必要がありますが、何らかの形でJWTの性質が損なわれます)。有効期限を使用する必要があるため、有効期限がSignatureExceptionになる場合は、IDを消去することができます。

    あなたが質問に書いたように「ハッカー」は、データベースのうち、JWTを盗んだ場合、攻撃者よりも、他のデータを盗む可能性があるためしかし、あなたは、おそらく盗まれたJWTの横にさらに問題を抱えているなど

    これが少し助けてくれることを願っています。

    +0

    があればと思いましてjtiフィールドはトークンを1回だけ使用するのに使用されますか? –

    関連する問題