포스트

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 를 전달 받아서 토큰을 생성해서 응답해준다.
깃 주소

GitHub