공식 참고 사이트: https://github.com/jwtk/jjwt
1. dependencies 추가
Gradle
dependencies {
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.11.5',
// Uncomment the next line if you want to use RSASSA-PSS (PS256, PS384, PS512) algorithms:
//'org.bouncycastle:bcprov-jdk15on:1.70',
'io.jsonwebtoken:jjwt-jackson:0.11.5' // or 'io.jsonwebtoken:jjwt-gson:0.11.5' for gson
}
여기서 잠깐! JJWT Dependencies 에 대해 초큼 알아보자
dependency의 선언을 보면, 한개만 compile-time dependency 이고, 나머지는 runtime으로 선언되어있다.
이것은, JJWT는 오직 설계한 application에 명시되어있는 APIs 에 의존하도록 설계가 되어있고, 경고 없이 변경될 수 있는 기타 모든 내부 구현 세부 정보는 runtime전용 종속성으로 분류되기 때문입니다. 이건, 만약 안정적인 JJWT사용이나 업데이트를 위해서는 매우 중요하다!
만약, jjwt-impl.jar 를 추가해서 사용한다면, jjwt에 업데이트가 있거나 수정사항이 있을 경우에 자동으로 compativility 되지 않을 거라는 경고도 되어있다. 그래서 jjwt-impl.jar 를 compile scope (implementation)에 넣지 말고 runtime scope에 넣으라고 되어있다.
2. Token 생성해보기반응형
import java.util.Date;
import java.util.UUID;
import io.jsonwebtoken.Jwts;
public class JwtUtils {
public static String createJWT() {
Date now = new Date();
Date expiredAt = new Date(now.getTime() + 10 * 60 * 1000); // 유효시간 10분
String jwtToken = Jwts.builder()
.claim("name", "minah")
.claim("email", "mapark@abc.co.kr")
.setSubject("user")
.setId(UUID.randomUUID().toString())
.setIssuedAt(now)
.setExpiration(expiredAt)
.compact();
return jwtToken;
}
}
해석해보면,
name 에 minah를, email 에 mapark@abc.co.kr 을 각각 넣어둔것. user이라는 subject로
token의 유효시간은 10분으로해서 compact 를 해둠.
그래서 로그를 찍어보니,
이렇게 잘 찍혓다. 그러면 이제 이걸 다시 재해석... 해야지?
3. Token 재해석하여 보낸 데이터 확인
재해석을 하는 과정에서,Jwts 의 parserBuilder() 를 이용하는데, 이제 어떠한 키를 가지고 해석해내지 않으면 할 수 없다고 에러가 떳다. 그래서 key 를 지정해서 jwt 를 생성하고, 그 key 를 가지고 재해석하는 과정을 넣었다.
수정한 메서드
import java.security.Key;
import java.util.Date;
import java.util.UUID;
import javax.crypto.SecretKey;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jws;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;
public class JwtUtils {
static Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256);
public static String createJWT() {
Date now = new Date();
Date expiredAt = new Date(now.getTime() + 10 * 60 * 1000); // 유효시간 10분
String jwtToken = Jwts.builder()
.claim("name", "minah")
.claim("email", "mapark@abcd.co.kr")
.setSubject("user")
.setId(UUID.randomUUID().toString())
.setIssuedAt(now)
.setExpiration(expiredAt)
// 지정한 key 로 sign 하겟다라는 설정
.signWith(key)
.compact();
return jwtToken;
}
public static Jws<Claims> parseJwt(String jwtString){
Jws<Claims> jwt = Jwts.parserBuilder()
.setSigningKey(key)
.build()
.parseClaimsJws(jwtString);
return jwt;
}
}
그래서 다시 확인해봤다.
parse jwtTest에, 내가 넣어두었던 name, email, sub 모두가 나왔다.
다음 글에서는 vue.js에서 로그인해서 token을 header로 보내는 과정을 구현해보겠다.
'웹앱프로젝트 > Java' 카테고리의 다른 글
[JWT] com.auth0 vs io.jsonwebtoken 어떤 것을 사용할 것이냐? (0) | 2022.09.05 |
---|---|
HttpServletResponse 의 getWriter().print() 활용해 웹에 전송 (0) | 2022.07.26 |
AES-256 암호화 과정 (0) | 2022.07.19 |
cmd 창에서 java 파일 compile 해서 실행하기 (0) | 2022.04.18 |
EL으로 List 길이 뿌려주기 (0) | 2022.01.10 |