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!
}
サポートされる機能
互換性のある仕様
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!
}
サポートされる機能
互換性のある仕様
<dependency>
<groupId>io.jsonwebtokengroupId>
<artifactId>jjwtartifactId>
<version>0.9.0version>
dependency>
dependencies {
compile 'io.jsonwebtoken:jjwt:0.9.0'
}
<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!
}
サポートされる機能
互換性のある仕様
強化された仕様
String compactJws = Jwts.builder()
.setSubject("Joe")
.compressWith(CompressionCodecs.DEFLATE)
.signWith(SignatureAlgorithm.HS512, key)
.compact();
Jwsのheaderセクションをチェックすると、これが復号されます.
{
"alg": "HS512",
"zip": "DEF"
}
JJJWTは、圧縮がヘッダをチェックして使用されていることを自動的に検出し、解析時に自動的に解凍します.解凍の場合、追加の符号化は必要ありません.
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
}