스프링

JWT 토큰 체크

winwin-k9 2023. 1. 19. 21:05
public boolean tokenValid(String token) {
    try {
        Jws<Claims> claimsJws = Jwts.parserBuilder().setSigningKey(secretKey).build().parseClaimsJws(token);
        return true;
    } catch (Exception e) {
        return false;
    }
}

토큰이 만료 되었는지 체크하는 로직이다.

토큰에서 헤더인 "AccessToken"를 뽑아낸 다음

유효하면 true를 리턴하고, 그렇지 않으면 false를 return하도록 한다.

 

claim으로 변환도중 다음과 같은 예외가 발생한다.

 

1) ExpiredJwtException : JWT를 생성할 때 지정한 유효기간 초과할 때.

2) UnsupportedJwtException : 예상하는 형식과 일치하지 않는 특정 형식이나 구성의 JWT일 때

3) MalformedJwtException : JWT가 올바르게 구성되지 않았을 때

4) SignatureException :  JWT의 기존 서명을 확인하지 못했을 때

5) IllegalArgumentException

 

예외가 발생하면 유효하지 않은 토큰으로 판단 한다.

 

다음과 같은 방식으로 유효일자 까지 한번에 체크할 수 도 있다.

public boolean validateToken(String jwtToken) {
        try {
            Jws<Claims> claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwtToken);
            return !claims.getBody().getExpiration().before(new Date());
        } catch (Exception e) {
            return false;
        }
    }

 

JWT의 생김새는 이와같이 생겼다.

 

 

 

헤더(header)

유형(typ)과 알고리즘(alg) 정보를 담음. 보통 HMAC SHA256을 사용.

유형(typ)은 토큰의 타입을 지정하며 여기서는 JWT로 지정.

 

정보(payload)

name / value 한쌍으로 이루어져 있으며 토큰에는 여러개의 클레임을 넣을 수 있음.

시스템에서 실제로 사용될 정보에 대한 내용들을 담음

iss: 토큰

sub: 토큰 제목 (subject)

exp: 만료시간 (expiration)

iat: 토큰 발급 시간 (issued at)

aud: 토큰 대상자(audience)

 

 

토큰 정보를 가져오기

 

public String getUid(String token) {
    return Jwts.parserBuilder()
            .setSigningKey(secretKey)
            .build()
            .parseClaimsJws(token)
            .getBody().getSubject();
}

getBody로 payLoad의 정보를 가져온 후, getSubject로 토큰의 제목을 가져온다.

 

 

728x90