먼저 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("정상적으로 액세스토큰 재발급!!!");
'보안, 로그인 > JWT' 카테고리의 다른 글
[JWT 발급 00] JWT & Spring Security 기본 세팅 1 (2) | 2023.07.19 |
---|---|
[JWT 재발급 00] Spring Security Filter에서 만료된 JWT 토큰 예외처리 (0) | 2023.04.27 |