Post

Spring boot 3 에서의 JWT 코드 변화

JWT 를 만드려는데 갑자기 오랜지색 줄이 나타났다면 도움이 될겁니다요.

1. signWith() 의 폐기

오래만에 프로젝트를 진행중, 아래 오랜지색 줄이 나타나서 자세히 봤더니…

signWith 가 폐기되었다고 하네요!



2. 어떻게 수정해야 할까?

문서에서는 아래와 같이 수행 하라고 나와 있습니다.

https://velog.velcdn.com/images/sieunnnn/post/85fa4842-0b42-46f7-83f1-1cb42219b188/image.png

그래서 아래와 같이 코드를 변경해주었습니다.

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
@Component
@RequiredArgsConstructor
@Slf4j
public class TokenUtil implements InitializingBean {
    private final RedisUtil redisUtil;
    private final UserRepository userRepository;

    @Value("${secret.key}")
    private String SECRET_KEY;
    static final long AccessTokenValidTime = 15 * 60 * 1000L;
    private Key key;

    @Override
    public void afterPropertiesSet() {
        generateKey();
    }

    private void generateKey() {
        byte[] keyBytes = SECRET_KEY.getBytes(StandardCharsets.UTF_8);
        this.key = Keys.hmacShaKeyFor(keyBytes);
    }

    public String generateToken(String userId) {
        if (key == null) {
            generateKey();
        }

        Claims claims = Jwts.claims().setSubject(userId);
        Date now = new Date();

        String token = Jwts.builder()
                .setClaims(claims)
                .setIssuedAt(now)
                .setExpiration(new Date(now.getTime() + AccessTokenValidTime))
                .signWith(key)
                .compact();

        return token;
    }

2.1. 주의

저의 경우, SECRET_KEY 를 단순한 영문자로 저장 했기에 해독과정이 필요 없었습니다. 그래서 byte[] 를 생성하는 부분의 메서드가 다릅니다. 만약 base64 encoding 한 변수가 담겨있다면, 아래 메서드를 사용해주세요.

1
byte[] keyBytes = Decoders.BASE64.decode(SECRET_KEY);



3. ‘parser()’ is deprecated

parser() 대신 paserBuilder() 를 사용해주세요!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public Long getUserIdFromToken(String token) {
        // Remove "Bearer " from accessToken.
        if (token.contains("Bearer")) {
            token = token.substring(7);
        }

        String userIdFromToken = Jwts.parserBuilder()
                .setSigningKey(key)
                .build()
                .parseClaimsJws(token)
                .getBody()
                .getSubject();

        Long userId = Long.parseLong(userIdFromToken);
        log.info("======================================================");
        log.info("userId: " + userId);
        log.info("======================================================");

        return userId;
    }
This post is licensed under CC BY 4.0 by the author.