JWT payload 정보 가져오기
JWT를 사용하면서 access token의 페이로드 안에 있는 exp 정보를 가져와야할 일이 생겼다.
TokenDto
TokenDto
는 로그인 후 토큰 정보를 반환하기 위한 dto이다.
여기에 accessTokenExp
를 추가한다.
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class TokenDto {
private String accessToken;
private String refreshToken;
private Date accessTokenExp; // 🌟 추가
}
JwtTokenProvider
JwtTokenProvider
는 access token과 refresh token을 생성하는 클래스인데, 여기에 getAccessTokenExp()
메서드를 추가한다.
@Component
public class JwtTokenProvider {
@Value("${jwt.token.jwt-secret-key}")
private String SECRET_KEY;
...
/**
* 엑세스 토큰의 exp 가져오기
*/
public Date getAccessTokenExp(String accessToken) {
Claims body = getClaims(accessToken);
// Date issuedAt = body.getIssuedAt(); // issuedAt도 가져올 수 있다.
return body.getExpiration();
}
/**
* 토큰정보 해석
*/
private Claims getClaims(String token) {
Claims body = Jwts.parserBuilder()
.setSigningKey(SECRET_KEY)
.build()
.parseClaimsJws(token)
.getBody();
return body;
}
}
AuthServiceImpl
new TokenDto()
를 통해 토큰 dto를 생성할 때, accessTokenExp
도 추가한다.
@Service
@RequiredArgsConstructor
@Slf4j
public class AuthServiceImpl implements AuthService {
private final MemberRepository userRepository;
private final JwtTokenProvider jwtTokenProvider;
private final AuthenticationManager authenticationManager;
private final RedisTemplate<String, String> redisTemplate;
private long REFRESH_TOKEN_EXPIRE_TIME = 1000L * 60 * 60 * 24 * 7; // 7일
@Override
public ResponseEntity<TokenDto> signIn(SignInReq signInReq) {
try {
Member member = userRepository.findByUsername(signInReq.getUsername())
.orElseThrow(() -> new CustomException(MEMBER_NOT_FOUND));
Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
signInReq.getUsername(),
signInReq.getPassword()
)
);
String accessToken = jwtTokenProvider.generateAccessToken(authentication);
String refreshToken = jwtTokenProvider.generateRefreshToken(authentication);
Date accessTokenExp = jwtTokenProvider.getAccessTokenExp(accessToken); // 🌟 엑세스 토큰 exp
TokenDto tokenDto = new TokenDto(
accessToken,
refreshToken,
accessTokenExp // 🌟 엑세스 토큰 exp
);
...
return new ResponseEntity<>(tokenDto, httpHeaders, HttpStatus.OK);
} catch (AuthenticationException e) {
throw new CustomException(INVALID_CREDENTIAL);
}
}
}
Ref.
💛 개인 공부 기록용 블로그입니다. 👻