content: package com.example.demo.security.jwt;
  
  import com.auth0.jwt.JWT;
  import com.auth0.jwt.JWTVerifier;
  import com.auth0.jwt.algorithms.Algorithm;
  import com.auth0.jwt.interfaces.DecodedJWT;
  import com.example.demo.dto.AccountDTO;
  import java.util.NoSuchElementException;
  import java.util.Optional;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
  import org.springframework.stereotype.Component;
  
  @Component
  public class JwtDecoder {
  
      private final Logger log = LoggerFactory.getLogger(this.getClass());
  
      public AccountDTO decodeJwt(String token) {
          DecodedJWT decodedJWT = isValidToken(token)
                  .orElseThrow(() -> new NoSuchElementException("유효한 토큰아 아닙니다."));
  
          String username = decodedJWT
                  .getClaim("USERNAME")
                  .asString();
  
          String role = decodedJWT
                  .getClaim("USER_ROLE")
                  .asString();
  
          return new AccountDTO(username, role);
      }
  
      private Optional<DecodedJWT> isValidToken(String token) {
          DecodedJWT jwt = null;
  
          try {
              Algorithm algorithm = Algorithm.HMAC256("jwttest");
              JWTVerifier verifier = JWT
                      .require(algorithm)
                      .build();
  
              jwt = verifier.verify(token);
          } catch (Exception e) {
              log.error(e.getMessage());
          }
  
          return Optional.ofNullable(jwt);
      }
  }