본문 바로가기

IT/JAVA

[JAVA] jjwt library 사용방법 - JWT(Java Web Token)

JWT란?

2020/10/02 - [IT/기타] - [JWT] Json Web Token이란?

 

1. jjwt란?

jjwt는 JWT 토큰 생성JWT 토큰 파싱, 검증을 해주는 라이브러리 입니다.

 

2. Maven dependency 추가

...
    <dependencies>
        ...
        <dependency>
            <groupId>io.jsonwebtoken</groupId>
            <artifactId>jjwt</artifactId>
            <version>0.9.1</version>
        </dependency>
        ...
    </dependencies>
...

 

3. 예제

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.Jwts;
import java.io.UnsupportedEncodingException;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class TestJWT {
    final String key = "Bamdule";

    public static void main(String[] args) throws UnsupportedEncodingException {
        TestJWT testJWT = new TestJWT();

        String jwt = testJWT.createToken();
        System.out.println(jwt);
        
        Map<String, Object> claimMap = testJWT.verifyJWT(jwt);
        System.out.println(claimMap); // 토큰이 만료되었거나 문제가있으면 null
    }
        
    //토큰 생성
    public String createToken() {

        //Header 부분 설정
        Map<String, Object> headers = new HashMap<>();
        headers.put("typ", "JWT");
        headers.put("alg", "HS256");

        //payload 부분 설정
        Map<String, Object> payloads = new HashMap<>();
        payloads.put("data", "My First JWT !!");

        Long expiredTime = 1000 * 60L * 60L * 2L; // 토큰 유효 시간 (2시간)

        Date ext = new Date(); // 토큰 만료 시간
        ext.setTime(ext.getTime() + expiredTime);
     
        // 토큰 Builder
        String jwt = Jwts.builder()
                .setHeader(headers) // Headers 설정
                .setClaims(payloads) // Claims 설정
                .setSubject("user") // 토큰 용도 
                .setExpiration(ext) // 토큰 만료 시간 설정
                .signWith(SignatureAlgorithm.HS256, key.getBytes()) // HS256과 Key로 Sign
                .compact(); // 토큰 생성

        return jwt;
    }
    
    //토큰 검증
    public Map<String, Object> verifyJWT(String jwt) throws UnsupportedEncodingException {
        Map<String, Object> claimMap = null;
        try {
            Claims claims = Jwts.parser()
                    .setSigningKey(key.getBytes("UTF-8")) // Set Key
                    .parseClaimsJws(jwt) // 파싱 및 검증, 실패 시 에러
                    .getBody();

            claimMap = claims;

            //Date expiration = claims.get("exp", Date.class);
            //String data = claims.get("data", String.class);
            
        } catch (ExpiredJwtException e) { // 토큰이 만료되었을 경우
            System.out.println(e);
            ...
        } catch (Exception e) { // 그외 에러났을 경우
            System.out.println(e);
            ...
        }
        return claimMap;
    }    
}

 

4. 결과

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ1c2VyIiwiZGF0YSI6Ik15IEZpcnN0IEpXVCAhISIsImV4cCI6MTU5NzIxNDQzM30.a51SU-jC5OgvX2JgiNShQziKDcO_ARLGBpsnbwbBxqs


{sub=user, data=My First JWT !!, exp=1597145971}

 

1) 토큰 만료 시 출력되는 메시지

io.jsonwebtoken.ExpiredJwtException: JWT expired at 2020-08-12T15:40:33Z. Current time: 2020-08-12T15:40:34Z, a difference of 1388 milliseconds. Allowed clock skew: 0 milliseconds.