/
TokenUtils.java
105 lines (85 loc) · 3.38 KB
/
TokenUtils.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package com.mang.example.security.utils;
import com.mang.example.security.app.user.domain.User;
import com.mang.example.security.enums.role.UserRole;
import io.jsonwebtoken.*;
import lombok.AccessLevel;
import lombok.NoArgsConstructor;
import lombok.extern.log4j.Log4j2;
import javax.crypto.spec.SecretKeySpec;
import javax.xml.bind.DatatypeConverter;
import java.security.Key;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Log4j2
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class TokenUtils {
private static final String secretKey = "ThisIsA_SecretKeyForJwtExample";
public static String generateJwtToken(User user) {
JwtBuilder builder = Jwts.builder()
.setSubject(user.getEmail())
.setHeader(createHeader())
.setClaims(createClaims(user))
.setExpiration(createExpireDateForOneYear())
.signWith(SignatureAlgorithm.HS256, createSigningKey());
return builder.compact();
}
public static boolean isValidToken(String token) {
try {
Claims claims = getClaimsFormToken(token);
log.info("expireTime :" + claims.getExpiration());
log.info("email :" + claims.get("email"));
log.info("role :" + claims.get("role"));
return true;
} catch (ExpiredJwtException exception) {
log.error("Token Expired");
return false;
} catch (JwtException exception) {
log.error("Token Tampered");
return false;
} catch (NullPointerException exception) {
log.error("Token is null");
return false;
}
}
public static String getTokenFromHeader(String header) {
return header.split(" ")[1];
}
private static Date createExpireDateForOneYear() {
// 토큰 만료시간은 30일으로 설정
Calendar c = Calendar.getInstance();
c.add(Calendar.DATE, 30);
return c.getTime();
}
private static Map<String, Object> createHeader() {
Map<String, Object> header = new HashMap<>();
header.put("typ", "JWT");
header.put("alg", "HS256");
header.put("regDate", System.currentTimeMillis());
return header;
}
private static Map<String, Object> createClaims(User user) {
// 공개 클레임에 사용자의 이름과 이메일을 설정하여 정보를 조회할 수 있다.
Map<String, Object> claims = new HashMap<>();
claims.put("email", user.getEmail());
claims.put("role", user.getRole());
return claims;
}
private static Key createSigningKey() {
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(secretKey);
return new SecretKeySpec(apiKeySecretBytes, SignatureAlgorithm.HS256.getJcaName());
}
private static Claims getClaimsFormToken(String token) {
return Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(secretKey))
.parseClaimsJws(token).getBody();
}
private static String getUserEmailFromToken(String token) {
Claims claims = getClaimsFormToken(token);
return (String) claims.get("email");
}
private static UserRole getRoleFromToken(String token) {
Claims claims = getClaimsFormToken(token);
return (UserRole) claims.get("role");
}
}