LoginSignup
20
21

More than 3 years have passed since last update.

JavaでJWTを使ってみた

Posted at

概要

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が投げられチェックされている。
20
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
21