JwtTokenProvider.java
package com.newbit.auth.jwt;
import com.newbit.common.exception.BusinessException;
import com.newbit.common.exception.ErrorCode;
import io.jsonwebtoken.*;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.stereotype.Component;
import javax.crypto.SecretKey;
import java.util.Date;
@Component
public class JwtTokenProvider {
@Value("${jwt.secret}")
private String jwtSecret;
@Value("${jwt.expiration}")
private long jwtExpiration;
@Value("${jwt.refresh-expiration}")
private long jwtRefreshExpiration;
private SecretKey secretKey;
@PostConstruct
public void init() {
byte[] keyBytes = Decoders.BASE64.decode(jwtSecret);
secretKey = Keys.hmacShaKeyFor(keyBytes);
}
// access token 생성 메소드
public String createToken(String username, String authority) {
Date now = new Date();
Date expiryDate = new Date(now.getTime() + jwtExpiration);
return Jwts.builder()
.subject(username)
.claim("authority", authority)
.issuedAt(now)
.expiration(expiryDate)
.signWith(secretKey)
.compact();
}
// refresh token 생성 메소드
public String createRefreshToken(String username, String authority) {
Date now = new Date();
Date expiryDate = new Date(now.getTime() + jwtRefreshExpiration);
return Jwts.builder()
.subject(username)
.claim("authority", authority)
.issuedAt(now)
.expiration(expiryDate)
.signWith(secretKey)
.compact();
}
public long getRefreshExpiration() {
return jwtRefreshExpiration;
}
public boolean validateToken(String token) {
try {
Jwts.parser().verifyWith(secretKey).build().parseSignedClaims(token);
return true;
} catch (SecurityException | MalformedJwtException e) {
throw new BusinessException(ErrorCode.JWT_INVALID);
} catch (ExpiredJwtException e) {
throw new BusinessException(ErrorCode.JWT_EXPIRED);
} catch (UnsupportedJwtException e) {
throw new BusinessException(ErrorCode.JWT_UNSUPPORTED);
} catch (IllegalArgumentException e) {
throw new BusinessException(ErrorCode.JWT_CLAIMS_EMPTY);
}
}
public String getUsernameFromJWT(String token) {
Claims claims = Jwts.parser()
.verifyWith(secretKey)
.build()
.parseSignedClaims(token)
.getPayload();
return claims.getSubject();
}
}