본문 바로가기
스파르타 내배캠

[TIL] #27. JWT Util

by saemsaem 2024. 5. 30.


 

 [ 개인과제 ] 

5단계 : JWT > JwtUtil

1. 초기설정
  - Header KEY값
  - 사용자 권한의 KEY
  - Token 식별자
 - 토큰 만료 시간

// Header KEY 값
public static final String AUTHORIZATION_HEADER = "Authorization"; // cookie의 name 값
// 사용자 권한 값의 KEY
public static final String AUTHORIZATION_KEY = "auth"; // 권한을 가져오기 위한 key값
// Token 식별자
public static final String BEARER_PREFIX = "Bearer "; // 우리가 만들 토큰 앞에 붙이는 것 [규칙 : "bearer "이 붙어있으면 토큰이라는 의미]
// 토큰 만료시간
private final long TOKEN_TIME = 60 * 60 * 1000L; // 60분

@Value("${jwt.secret.key}") // Base64 Encode 한 SecretKey
private String secretKey; // application.porperties에 설정한 secretKey
private Key key; // secret key를 관리하는 방법 : secret key를 담을 객체
private final SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;

// 로그 설정 : 로깅(동작정보를 시간순으로 기록)
public static final Logger logger = LoggerFactory.getLogger("JWT 관련 로그");

@PostConstruct
public void init() {
    byte[] bytes = Base64.getDecoder().decode(secretKey);
    key = Keys.hmacShaKeyFor(bytes);
}

 

2. JWT 생성
  - bearer, id, 사용자 권한, 만료시간, 발급일 등을 포함하여 토큰 생성

public String createToken(String username, UserRoleEnum role) {
    Date date = new Date();

    return BEARER_PREFIX +
            Jwts.builder()
                    .setSubject(username) // 사용자 식별자값(ID)
                    .claim(AUTHORIZATION_KEY, role) // 사용자 권한 : key, value
                    .setExpiration(new Date(date.getTime() + TOKEN_TIME)) // 만료 시간
                    .setIssuedAt(date) // 발급일
                    .signWith(key, signatureAlgorithm) // 암호화 알고리즘
                    .compact();
}

 

3. JWT 검증
  - 유효한 signature인지
  - 기한이 만료되지 않았는지 등등

public boolean validateToken(String token) {
    try {
        Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token);
        return true;
    } catch (SecurityException | MalformedJwtException | SignatureException e) {
        logger.error("Invalid JWT signature, 유효하지 않는 JWT 서명 입니다.");
    } catch (ExpiredJwtException e) {
        logger.error("Expired JWT token, 만료된 JWT token 입니다.");
    } catch (UnsupportedJwtException e) {
        logger.error("Unsupported JWT token, 지원되지 않는 JWT 토큰 입니다.");
    } catch (IllegalArgumentException e) {
        logger.error("JWT claims is empty, 잘못된 JWT 토큰 입니다.");
    }
    return false;
}

 

4. JWT에서 사용자 정보 가져오기

public Claims getUserInfoFromToken(String token) {
    return Jwts.parserBuilder().setSigningKey(key).build().parseClaimsJws(token).getBody();
}

'스파르타 내배캠' 카테고리의 다른 글

[TIL] #29. JWT  (0) 2024.06.03
[TIL] #28. 인증/인가  (0) 2024.05.30
[TIL] #26. entity 연결  (0) 2024.05.28
[TIL] #25. HTTP 응답 상태 반환  (0) 2024.05.28
[TIL] #24. JWT  (0) 2024.05.24