JJJWTの概要

8487 ワード

Java JWT: JSON Web Token for Java and Android


JJJWTは、JVM上でJSON Web Token(JWTs)を作成し検証するライブラリです.JJJWTは、JWT、JWS、JWE、JWK、およびJWA RFC仕様に基づくJava実装である.このライブラリはOktaのLes Hazlewoodによって作成され、現在は貢献者コミュニティによって維持されています.

JSON Web Tokenとは


JWTは両方の間で情報を伝送する方法である.JWTの本体で符号化された情報をclaimsと呼ぶ.JWTの拡張形式はJSON形式であるため、各claimはJSONオブジェクトのキーである.JWTsは、署名(JWSにする)または暗号化(JWEにする)を暗号化することができる.これにより、JWTsの検証性が向上します.例えば、受信者は、JWTが署名を検証することによって改ざんされていないと判断することができる.生成されたJWTの結果は、3つの部分の文字列であり、各部分は「.」である.区切る.例:eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJKb2UifQ.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY各セクションはbase 64で符号化されています.
第1部はヘッダであり、JWTに署名するアルゴリズムを指定する必要があります.eyJhbGciOiJIUzI1NiJ9
第2部はbodyです.このセクションには、JWT符号化に関するすべての宣言が含まれています.eyJzdWIiOiJKb2UifQ
最後の部分はsignatureです.ヘッダファイルで指定したアルゴリズムをheaderとbodyの組み合わせで計算します.ipevRNuRP6HflG8cFKnmUPtypruRC4fb1DWtoLL62SY
最初の2つの部分を基本的な64デコーダで渡すと、次のようになります.
header

{
  "alg": "HS256"
}
body

{
  "sub": "Joe"
}

この場合,sha−256アルゴリズムのHMACを用いてJWTに署名する情報を得た.また、bodyにはclaim subとvalue Joeがあります.
Registered Claimsにはいくつかの標準的なclaimsが含まれており、subはその中の1つ(subject)である.
署名を計算するには、署名のsercrectを知らなければなりません.

インストール


Maven:
<dependency>
    <groupId>io.jsonwebtokengroupId>
    <artifactId>jjwtartifactId>
    <version>0.9.0version>
dependency>

Gradle:
dependencies {
    compile 'io.jsonwebtoken:jjwt:0.9.0'
}

Note:JJWtはジャックソンに依存した.x.jacksonの古いバージョンに依存している場合は、プロジェクトのバージョンを新しいバージョンに更新する必要があります.そうしないと、競合します.
<dependency>
    <groupId>com.fasterxml.jackson.coregroupId>
    <artifactId>jackson-databindartifactId>
    <version>2.8.9version>
dependency>

クイック使用


まず簡単な例を見てみましょう.
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.impl.crypto.MacProvider;
import java.security.Key;

// We need a signing key, so we'll create one just for this example. Usually
// the key would be read from your application configuration instead.
Key key = MacProvider.generateKey();

String compactJws = Jwts.builder()
  .setSubject("Joe")
  .signWith(SignatureAlgorithm.HS512, key)
  .compact();

上記の例では、登録されたclaimのsub(subject)をJoeに設定し、sha−512アルゴリズムを用いてHMACにJWTを登録するJWTを構築した.最後に、文字列形式に変換します.
eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJKb2UifQ.yiV1GWDrQyCeoOswYTf_xvlgsnaVVYJM0mU6rkmRBf2T1MBl3Xh2kZii0Q9BdX5-G0j25Qv2WF4lA6jPl5GKuA

次にjwtを検証します.
assert Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws).getBody().getSubject().equals("Joe");

ここには2時間あります.以前の鍵はJWTの署名を検証するために使用された.JWTを検証できなかった場合、署名例外が放出されます.JWTが検証されたと仮定すると、claimを解析し、subがJoeに設定されていると断言します.
しかし、署名検証に失敗したらどうしますか?署名異常をキャプチャし、対応する反応を行います.
try {

    Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws);

    //OK, we can trust this JWT

} catch (SignatureException e) {

    //don't trust the JWT!
}

サポートされる機能


互換性のある仕様

  • 明文圧縮JWTs
  • の作成と解析
  • すべての標準JWSアルゴリズムのデジタル署名JWTs(JWssとも呼ばれる):
  • HS256: HMAC using SHA-256
  • HS384: HMAC using SHA-384
  • HS512: HMAC using SHA-512
  • RS256: RSASSA-PKCS-v1_5 using SHA-256
  • RS384: RSASSA-PKCS-v1_5 using SHA-384
  • RS512: RSASSA-PKCS-v1_5 using SHA-512
  • PS256: RSASSA-PSS using SHA-256 and MGF1 with SHA-256
  • PS384: RSASSA-PSS using SHA-384 and MGF1 with SHA-384
  • PS512: RSASSA-PSS using SHA-512 and MGF1 with SHA-512
  • ES256: ECDSA using P-256 and SHA-256
  • ES384: ECDSA using P-384 and SHA-384
  • ES512: ECDSA using P-521 and SHA-512

  • 強化された仕様

  • body圧縮.JWTボリュームが大きい場合は、圧縮デコーダを使用して圧縮できます.最も重要なのは、JJWTライブラリが追加の符号化を必要とせずにJWTを自動的に解凍して解析することです.
  • String compactJws =  Jwts.builder()
        .setSubject("Joe")
        .compressWith(CompressionCodecs.DEFLATE)
        .signWith(SignatureAlgorithm.HS512, key)
        .compact();
    

    Jwsのheaderセクションをチェックすると、これが復号されます.
    {
      "alg": "HS512",
      "zip": "DEF"
    }
    

    JJJWTは、圧縮がヘッダをチェックして使用されていることを自動的に検出し、解析時に自動的に解凍します.解凍の場合、追加の符号化は必要ありません.
  • はclaimsを要求する.解析時に、いくつかのブレークスルーが存在し、値に設定される必要があることを指定できます.
  • try {
        Jws claims = Jwts.parser()
            .requireSubject("Joe")
            .require("hasMotorcycle", true)
            .setSigningKey(key)
            .parseClaimsJws(compactJws);
    } catch (MissingClaimException e) {
    
        // we get here if the required claim is not present
    
    } catch (IncorrectClaimException e) {
    
        // we get here if the required claim has the wrong value
    
    }
    

    Registered Claim


    すべてのclaimはオプションで、大文字と小文字が敏感です.

    1. "iss" (Issuer) Claim


    「iss」(issuer)は、証明書を発行する責任者です.

    2. "sub" (Subject) Claim


    「Sub」(Subject)は主体です.

    3. "aud" (Audience) Claim


    「aud」(Audience)Claimとは、jwtの受信者を指し、audが見つからない場合、jwtを解析する際に異常が放出される

    4. "exp" (Expiration Time) Claim


    「exp」(Expiration Time)は有効期限を指し、有効期限を超えると異常が放出されます

    5. "nbf" (Not Before) Claim


    「nbf」(Not Before)Claimは開始日を指し、claimは現在の日付/時間が「nbf」宣言に記載された日付/時間以上であることを要求する

    6. "iat" (Issued At) Claim


    「iat」(Issued At)Claimとは、jwtの発行時期を指す

    7. "jti" (JWT ID) Claim


    「jti」(JWT ID)Claimは、アプリケーションが複数の発行者を使用する場合、値間の競合を回避し、異なる発行者によって作成されるJWTの唯一の識別子を提供します.
    転載:https://www.jianshu.com/p/a8441d8570de