[JWT 재발급 01] access token 재발급 구현

먼저 access token과 refresh token이 저장되는 위치를 확인해 보자

 

Access Token : Header에 저장

Refresh Token : 쿠키DB에 저장

 

| access token 재발급 순서

1. header에 담긴 access token 유효기간 확인

- 유효기간이 남은 경우 return "access token이 유효합니다."

 

2. 쿠키에 담긴 refresh token 존재여부 확인

 - 존재하지 않는 경우 return "재로그인하세요"

 

3. 쿠키와 DB에 저장된 refresh token이 동일한지 확인

 - 동일한 경우 : refresh token 이 탈취당하지 않고 믿을만하다고 판단

 - 다른 경우 : return "재로그인하세요"

 

4. 쿠키에 담긴 refresh token 유효기간 확인

 - 만료된 경우 return "재로그인하세요"

 

5. access token 재발급

 

1. header에 담긴 access token 유효기간 확인

String headerAccessToken = HeaderUtil.getAccessToken(httpServletRequest);

AuthToken authHeaderAccessToken = tokenProvider.convertAuthToken(headerAccessToken);

// getExpiredTokenClaims()에서 유효기간이 만료된 경우 null return

if (authHeaderAccessToken.getExpiredTokenClaims() != null) {
    log.debug("access token 유효기간이 남아있습니다.");
    throw new JwtNotExpiredException();
}

 

2. 쿠키에 담긴 refresh token 존재여부 확인

String refreshToken = CookieUtil.getCookie(httpServletRequest, REFRESH_TOKEN)
        .map(Cookie::getValue)
        .orElseThrow(() -> new UnAuthorizedException("쿠키에 refresh token이 없습니다. 다시 로그인 해주세요."));​


 

3. 쿠키와 DB에 저장된 refresh token이 동일한지 확인

if (!refreshToken.equals(user.getRefreshToken())) {
    throw new UnAuthorizedException("DB에 저장되어 있는 refreshToken과 다릅니다. 다시 로그인 해주세요.");
}​

 

4. 쿠키에 담긴 refresh token 유효기간 확인

AuthToken authTokenRefreshToken = tokenProvider.convertAuthToken(refreshToken);

if (!authTokenRefreshToken.validate() || user.getRefreshToken() == null) {
    log.debug("유효하지 않은 refresh token 입니다.");
    throw new UnAuthorizedException("유효하지 않은 refresh token 입니다.");
}​


 

5. access token 재발급

Date now = new Date();

AuthToken accessToken = tokenProvider.createAuthToken(
        user.getId(),
        "ROLE_USER",
        new Date(now.getTime() + appProperties.getAuth().getTokenExpiry())
);

log.debug("정상적으로 액세스토큰 재발급!!!");​