package com.zioinfo.mall.auth; import io.jsonwebtoken.*; import io.jsonwebtoken.security.Keys; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.crypto.SecretKey; import java.nio.charset.StandardCharsets; import java.util.Date; @Slf4j @Component public class JwtUtil { @Value("${guardia.jwt.secret:guardia-mall-jwt-secret-2026-minimum-256bit-key-zioinfo}") private String secret; @Value("${guardia.jwt.expiration:86400000}") private long expirationMs; private SecretKey key() { return Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8)); } public String generate(String username, String role) { return Jwts.builder() .subject(username) .claim("role", role) .issuedAt(new Date()) .expiration(new Date(System.currentTimeMillis() + expirationMs)) .signWith(key()) .compact(); } public Claims parse(String token) { return Jwts.parser().verifyWith(key()).build() .parseSignedClaims(token).getPayload(); } public boolean isValid(String token) { try { parse(token); return true; } catch (JwtException | IllegalArgumentException e) { log.debug("JWT 검증 실패: {}", e.getMessage()); return false; } } public String getUsername(String token) { return parse(token).getSubject(); } public String getRole(String token) { return parse(token).get("role", String.class); } }