JWT Provider
클래스 다이어그램
소스 코드
import io.jsonwebtoken.*;
import javax.xml.bind.DatatypeConverter;
import javax.crypto.spec.SecretKeySpec;
import java.security.Key;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/*
• 최초 작성자 : Carrykim(김선진)
• 최초 작성일 : 2021.10.19
• 최초 변경일 : 2021.10.19
• 목적 : Study
• 개정 이력(변경자, 변경 일자, 변경 내용) : null
• 저작권 : by Carrykim
*/
public class TokenProvider{
// 암호화 키
private String secretKey = "Carrykim_secreat_key";
public String createToken(String id) throws Exception {
// 유효 기간 밀리초 * 초 * 분 * 시 * 일
int Validity = 1000 * 60 * 60 * 24 * 3;
// 암호화 알고리즘
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
// 발급 시간 및 만료 시간
Date createdTime = new Date();
Date expireTime = new Date(createdTime.getTime() + Validity);
// 서명에 담을 데이터
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(secretKey);
Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
// 헤더에 담을 데이터
Map<String, Object> headerMap = new HashMap<String, Object>();
headerMap.put("typ","JWT");
headerMap.put("alg","HS256");
// 토큰 빌드
JwtBuilder builder = Jwts.builder().setHeader(headerMap)
.setIssuer(id)
.setExpiration(expireTime)
.setIssuedAt(createdTime)
.signWith(signatureAlgorithm, signingKey);
return builder.compact();
}
public boolean verifyJWT(String jwt) throws Exception {
try {
// 토큰에서 페이로드(Claim) 추출
Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(secretKey))
.parseClaimsJws(jwt).getBody();
// 추출값 확인
System.out.println("토큰 발급자 : " + claims.getIssuer());
System.out.println("토큰 만료 시간 : " + claims.getExpiration());
System.out.println("토큰 발급 시간 : " + claims.getIssuedAt());
return true;
} catch (ExpiredJwtException e) {
// 만료 예외 처리
System.out.println("토큰 만료");
return false;
} catch (JwtException e) {
// 유효하지 않은 토큰 예외 처리
System.out.println("유효하지 않은 토큰");
return false;
} catch (Exception e){
// 기타 예외 처리
System.out.println(e);
return false;
}
}
}
실행결과