반응형

공식 참고 사이트: 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로 보내는 과정을 구현해보겠다.

반응형

+ Recent posts