240229 기록, jwt적용(2)
JWT 적용하기
jwt.yml 파일 생성
1
2
3
4
secret-key: testSecretKey20240229testSecretKey20240229testSecretKey20240229testSecretKey20240229
access-expiration-hours: 36000000
refresh-expiration-hours: 1008000000
issuer: jwKim
- secret-key는 HS256 사용할 것이기 때문에,
- 256비트 = 32바이트 : 즉, char로 32자 이상.
jwt 패키지
- 파일명 JWTUtil
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
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
import java.security.Key;
import java.util.Date;
@PropertySource("classpath:jwt.yml") // 소스파일 지정
@Component
public class JWTUtil {
private final Key key;
private final String issuer;
public JWTUtil(@Value("${secret-key}")String secret,
@Value("${issuer}")String issuer){
byte[] byteSecretKey = Decoders.BASE64.decode(secret);
this.key = Keys.hmacShaKeyFor(byteSecretKey);
this.issuer = issuer;
}
public String getUsername(String token){
return Jwts.parserBuilder().setSigningKey(key).build()
.parseClaimsJwt(token).getBody().get("username", String.class);
}
public String getRole(String token){
return Jwts.parserBuilder().setSigningKey(key).build()
.parseClaimsJwt(token).getBody().get("role", String.class);
}
public Boolean isExpired(String token){
return Jwts.parserBuilder().setSigningKey(key).build()
.parseClaimsJwt(token).getBody().getExpiration().before(new Date());
}
public String createJwt(String username, String role, Long expiredMs){
Claims claims = Jwts.claims();
claims.put("username", username);
claims.put("role", role);
return Jwts.builder()
.setClaims(claims)
.setIssuedAt(new Date(System.currentTimeMillis()))
.setIssuer(issuer)
.setExpiration(new Date(System.currentTimeMillis() + expiredMs))
.signWith(key, SignatureAlgorithm.ES512)
.compact();
}
}
- @PropertySource(“classpath:jwt.yml”), application.yml에 jwt에 대한 정보를 세팅하지 않고 따로 빼뒀기 때문에 소스에 대한 경로 지정
- JWTUil 생성자에서 @Value할 때 lombok을 import하지 않도로 주의!!!
- 생성자 밑에 3개의 메소드는 토큰을 검증하는 메소드이다
- 마지막 메소드는 토큰을 생성하는 메소드이다.
- 토큰 생성은 로그인 성공 시 successfulHandler에 의해서 username, role, expiredMs 를 전달 받아서 토큰을 생성해서 응답해준다.