본문 바로가기
웹개발/JWT

Java에서 JSON Web Token 생성하고 검증하기

by 어컴띵 2021. 3. 25.

이제 대충 JWT에서 알아봤으니 token 생성하고 생성된 토큰의 claim을 알아보자. 내용은 다음 url을 참조하였다.

참조: stormpath.com/blog/jwt-java-create-verify

 

How to Create and verify JWTs in Java

Sample code that shows how a JWT token can be both created and verifed in Java using the JSON Web Token for Java library

stormpath.com

 

먼저 token을 생성하는 코드다 기존소스가 버전이 올라가면서 deprecated된 메서드들이 있어 조금 수정하였다.

public class JwtGenerator {

    String apikey = "jwtsigntutorialasdfasdfasdfasdfasdf";

    /**
     * 토큰생성
     * @param id
     * @param issuer
     * @param subject
     * @param ttlMills
     * @return
     */
    public String createJWT(String id, String issuer, String subject, long ttlMills) {

        long nowMillis = System.currentTimeMillis();
        Date now = new Date(nowMillis);

        // 표준 클레임 셋팅
        JwtBuilder builder = Jwts.builder()
                .setId(id)
                .setIssuedAt(now)
                .setSubject(subject)
                .setIssuer(issuer)
                .signWith(getSignKey());

        // 토큰 만료 시간 셋팅
        if(ttlMills >= 0){
            long expMillis = nowMillis + ttlMills;
            Date exp = new Date(expMillis);
            builder.setExpiration(exp);
        }

        // 토큰 생성
        return builder.compact();
    }

    /**
     * 토큰 파싱
     * @param jwt
     * @return
     */
    public Jws<Claims> parseJwt(String jwt) {
        Jws<Claims> claims = Jwts.parserBuilder()
                .setSigningKey(getSignKey())
                .build()
                .parseClaimsJws(jwt);
        
        return claims;
    }

    private Key getSignKey(){
        return Keys.hmacShaKeyFor(apikey.getBytes(StandardCharsets.UTF_8));
    }
}

토클을 생성하고 확인하는 코드를 작성하자

@Log
public class JwtExample {
    public static void main(String[] args) {
        JwtGenerator jwtGenerator = new JwtGenerator();
        String generated = jwtGenerator.createJWT("jwttest","tester","jwttoken",1000);
        log.info(generated);
        Jws<Claims> claimsJws = jwtGenerator.parseJwt(generated);
        log.info(claimsJws.getBody().toString());
    }
}

생성된 토큰과 생성된 토큰으로 파싱된 결과를 볼수 있다.

INFO: eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJqd3R0ZXN0IiwiaWF0IjoxNjE2NjQzODg4LCJzdWIiOiJqd3R0b2tlbiIsImlzcyI6InRlc3RlciIsImV4cCI6MTYxNjY0Mzg4OX0.Tsd7_orxV_dHYifBIx2xKOmJsT1wQo3InH2HXWHgn-M
INFO: {jti=jwttest, iat=1616643888, sub=jwttoken, iss=tester, exp=1616643889}