1 분 소요

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.



💛 개인 공부 기록용 블로그입니다. 👻

맨 위로 이동하기

태그:

카테고리:

업데이트: