Skip to content

리프레시 토큰은 유효하지만 액세스 토큰은 유효하지 않을 때 에러 응답이 발생할 수 있습니다 #150

@wjlee0908

Description

@wjlee0908

if (jwtService.isTokenExpired(refreshTokenValue)) {
// 엑세스 토큰 체크
if (jwtService.validateToken(accessTokenValue)) {
// 토큰이 유효하면 인증 정보를 설정
SecurityContextHolder.getContext().setAuthentication(jwtService.getAuthentication(accessTokenValue));
}
} else {
log.info("토큰이 만료 되었습니다");
log.error("토큰 만료 에러");
CookieUtils.setCookie(jwtProperties.cookieName(), null, 0, response);
throw new ValidationException(EXPIRED_TOKEN);
}

1. 83번 줄의 안쪽 If문, jwtService.validateToken(accessTokenValue)) 의 결과가 false일 때 바깥 쪽 else문이 실행되지 않을 것 같습니다.

리프레시 토큰은 유효 && 액세스 토큰은 만료인 상황에서 토큰 만료 response가 발생하는 지 확인 부탁드립니다.

2. 엄밀히 따지면, 인증은 refreshToken이 만료되었을 때도 성공해야 한다고 생각합니다.

refreshToken 의 만료 기간은 accessToken의 갱신할 수 있는 기간을 의미하기 때문입니다.
실 서비스에서는 refreshToken의 만료 기간이 길 테니 심각한 이슈는 아닙니다.

ex)

  • refreshToken 만료 기간: 10분
  • accessToken 만료 기간: 4분
    a. 0분에 refreshToken 발급. 유효 기간: 0분~10분
    b. 9분에 refreshToken 이용해서 accessToken 재발급
    c. accessToken의 유효 기간: 9분~13분(+4분)
    d. 11분의 상황:
  • refreshToken: 10분 초과해서 만료
  • accessToken: 13분에 만료되므로 아직 사용 가능
    => 이 때는 인증이 성공해야 합니다.

3. jwtService.isTokenExpired(refreshTokenValue).isTokenValid()로 이름을 바꾸면 코드를 이해하기 더 좋을 것 같습니다.

  • .isTokenExpired()의 예상 동작
    토큰이 만료되었을 때 true를, 만료되지 않았을 때(유효할 때) false를 return할 것으로 기대됩니다. 함수 이름인 is token expired?의 의미가 토큰이 만료되었는가?이기 때문입니다.

  • .isTokenExpired()의 실제 동작
    토큰 검증에 성공하면 true를, 실패하면 false를 반환합니다.

  • 결론
    함수 이름을 isTokenValid()로 변경하면 함수의 예상 결과와 실제 결과가 일치하게 됩니다.

Metadata

Metadata

Assignees

Labels

Type

No type
No fields configured for issues without a type.

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions