-
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'스프링' 카테고리의 다른 글
OAuth2.0과 JWT적용 - 3 (0) 2023.01.25 UsernamePasswordAuthenticationFilter (0) 2023.01.19 OAuth2.0과 JWT적용 - 2 (0) 2023.01.17 OAuth2.0과 JWT적용 - 1 (0) 2023.01.17 security버전 (0) 2023.01.15