이번 포스팅에서는 jjwt
를 사용하는 방법에 대해 알아보도록 하겠습니다. jwt
에 대해서 잘 모르시는 분은 이전 포스팅(https://galid1.tistory.com/581)을 참고해주세요.
1. dependency 추가
우선 당연히 jwt를 사용하기 위해서는 dependency를 추가해야겠죠?
https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt/0.9.0
maven repository에 검색하면 원하는 dependency를 찾을 수 있습니다.
dependencies {
// https://mvnrepository.com/artifact/io.jsonwebtoken/jjwt
compile group: 'io.jsonwebtoken', name: 'jjwt', version: '0.9.0'
}
저는 gradle을 사용하기 때문에 위와 같이 설정을 추가했습니다.
2. 사용법
사용법은 크게 2가지에 대해 알아볼 것입니다.
1. 토큰 생성
2. 토큰 파싱 및 검증
2.1 토큰 생성
x
public static String createToken() {
String key = "A";
Map<String, Object> headers = new HashMap<>();
headers.put("typ", "JWT");
headers.put("alg", "HS256");
Map<String, Object> payloads = new HashMap<>();
Long expiredTime = 1000 * 60l; // 만료기간 1분
Date now = new Date();
now.setTime(now.getTime() + expiredTime);
payloads.put("exp", now);
payloads.put("data", "hello world!");
String jwt = Jwts.builder()
.setHeader(headers)
.setClaims(payloads)
.signWith(SignatureAlgorithm.HS256, key.getBytes())
.compact();
return jwt; .
}
public static void main(String[] args) {
System.out.println(createToken());
}
== 결과 ==
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJkYXRhIjoiaGVsbG8gd29ybGQhIiwiZXhwIjoxNTYyODQzNDg4NDY0fQ.oaHd582vluSm0yYAGnO8EzZAf8X2hCN6kKh74a1hV5k
우선 토큰을 생성 및 파싱하기 위해서는 token에 서명을 하기 위해 key
값이 필요합니다. 테스트를 위해 간단히 "A"를 key
값으로 정했습니다.
이전 포스팅에서 말씀드렸듯이 jwt토큰은 3부분으로 구성되어있습니다.(헤더, 내용, 서명)
Header(헤더)
우선,헤더
의 경우에는 typ(토큰 타입), alg(알고리즘)이 포함되어야 합니다. Header의 경우에는 Map<String, Object>
에 값을 넣어 주면 됩니다.
Payload(내용)
내용에는 원하는 데이터, 토큰 발급대상, 토큰 만료기간, 토근 수령자 등등 여러 내용이 담길 수 있습니다. 이전 포스팅을 참고해주세요. 여기서는 간단히 만료시간
과 데이터
만을 기입했습니다. 또한, payload
의 경우에도 Header와 같이 Map<String, Object>
를 이용해 데이터를 기입하면 됩니다.
Sign(서명)
서명의 경우에는 Jwts.builder()
의 signWith()
메소드를 이용하면 됩니다. 첫번째 매개변수로는 해시 알고리즘, 두번째로는 앞서 정한 key
의 byte를 입력해주면 됩니다.
마지막으로 토큰을 생성하기 위해서는 Jwts.builder().compact()
를 호출하면 됩니다.
2.2 토큰 검증
토큰을 생성했다면, 이것을 우리가 알아볼 수 있고, 사용할 수 있는 형태로 변환하는 방법이 필요합니다.
x
public static void getTokenFromJwtString(String jwtTokenString) throws InterruptedException {
Claims claims = Jwts.parser()
.setSignKey("A".getBytes())
.parseClaimsJws(jwtTokenString)
.getBody();
Date expiration = claims.get("exp", Date.class);
System.out.println(expiration);
String data = claims.get("data", String.class);
System.out.println(data);
}
== 결과 ==
Sun Jul 22 22:28:52 KST 51494
hello world!
우선 jwtToken은 위에서 보았듯이 String
형태로 생성이 됩니다. 우리는 이것을 우리가 사용하기 위한 형태로 parsing
하기 위해서 Jwts.parse()
를 이용해야합니다.
그 후 token을 생성할 때 사용했던 key
를 set해주어야 합니다.(setSignKey("A".getBytes())))
다음으로는 parseClaimsJws()
메소드를 이용해 토큰을 Jws로 파싱합니다.
마지막으로 getBody()
를 이용해 앞서 토큰에 저장했던 data들이 담긴 claims
를 얻어올 수 있습니다.
JUnit Test 통과후, 실제 테스트시 에러(JWT signature does not match locally computed signature)
랜덤키를 발급하여 ~~ 하는데 ~~
'Language > Java' 카테고리의 다른 글
Java - LocalDateTime, LocalDate 날짜 차이 구하기 (관련 이슈처리) (0) | 2019.10.22 |
---|---|
Java - Retrofit이란? (retrofit 사용법 자세한 설명) (2) | 2019.08.24 |
Java - ArrayList 제거 안되는 문제(Wrapper Class) (0) | 2019.07.02 |
Java - Annotation 이란? Annotation 사용법 (0) | 2019.05.02 |
Java - Lambda Expression(람다식)이란? (2) | 2019.04.09 |