概要
Javaのライブラリを使ってJWTを導入した際の事をメモとして残しておく。
JWTとは
- Web Tokenの略称で「署名の出来るJSONを含んだURL Safeなトークン」です。
- JWTはHeader、Payload、Signatureで構成されていて、Header、PayloadはJsonをBase64エンコードした情報なので、ユーザー情報やパスワードなど外に公開したくないものは入れないようにするのがいいみたい。
- 署名されているのでJson部分を改ざんしても検証時にチェックできる
トークンの例
- トークン全体はこんな感じ
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhdXRoMCJ9.izVguZPRsBQ5Rqw6dhMvcIwy8_9lQnrO3vpxGwPCuzs
- Header部分
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9
- Headerをデコードすると
{"typ":"JWT","alg":"HS256"}
- Payload部分
eyJpc3MiOiJhdXRoMCJ9
- Payloadをデコードすると
{"iss":"auth0"}
実際にJavaで書いてみた
- 環境
- java8
- java-jwt(jwt.ioでも公開されてるjwtを扱うjavaライブラリ)
- 今回はIssuerとExpireTime付のJWTを作ってみて動作を確認した
- アルゴリズムはHS256を採用
- いざトークン生成
try {
Date expireTime = new Date();
expireTime.setTime(expireTime.getTime() + 600000l);
Algorithm algorithm = Algorithm.HMAC256("secret");
String token = JWT.create()
.withIssuer("auth0")
.withExpiresAt(expireTime)
.sign(algorithm);
} catch (JWTCreationException exception){
//Invalid Signing configuration / Couldn't convert Claims.
}
- トークンの検証
String token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJhdXRoMCJ9.izVguZPRsBQ5Rqw6dhMvcIwy8_9lQnrO3vpxGwPCuzs";
try {
Algorithm algorithm = Algorithm.HMAC256("secret");
JWTVerifier verifier = JWT.require(algorithm)
.withIssuer("auth0")
.build(); //Reusable verifier instance
DecodedJWT jwt = verifier.verify(token);
} catch (JWTVerificationException exception){
//Invalid signature/claims
}
使った感じ
- java-jwtの公式ページに書いてあるコードを拝借すれば動作確認は簡単にできた。
- ちゃんとJson部分(HeaderやPayload部分)が改ざんされた場合に
JWTVerificationException
が投げられチェックされている。