Replies: 6 comments 15 replies
-
@GetMapping("/reissue")
public ResponseEntity<Void> reissueToken(@CookieValue(value = "refresh_token", required = false) String refreshToken,
HttpServletResponse response) {
if (Strings.isEmpty(refreshToken) || blacklistService.isTokenBlacklisted(refreshToken)) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
String newAccessToken = authService.reissueToken(refreshToken);
response.setHeader("Authorization", newAccessToken);
return ResponseEntity.ok().build();
} 현재 코드를 보면
RT를 재발급하지 않을 경우 문제가 발생할 것 같다고 하셨는데, 블랙리스트인지를 검사하니까 괜찮지 않나라고 생각했는데, 해커가 블랙리스트 등재되지 않은 토큰을 탈취 후 사용해도 그 토큰은 로그아웃 하지 않는 이상 블랙리스트가 아니니 이 부분에 대해서 RT의 재발급이 필요해 보입니다. |
Beta Was this translation helpful? Give feedback.
-
문제 상황A 사용자의 RT를 B 해커가 탈취한 상황이라고 가정해본다면,
해결 방안재발급 요청시, 다음과 같은 로직으로 변경하면 어떨까 싶어요!
이러한 경우, B(해커)가 탈취한 RT로 재발급 요청을 하더라도 문제가 없어보이긴 합니다. 문제가 없는가?걱정되는게 있다면, B가 A보다 먼저 재발급 요청을 한다면? 정상 유저의 재발급 요청이 거절될인데 문제가 되지 않을까? |
Beta Was this translation helpful? Give feedback.
-
이긴 한데 1일 경우엔 리이슈 요청이 너무 자주 들어와 서버가 뻗을 가능성이 높고 |
Beta Was this translation helpful? Give feedback.
-
혹시 지금 리이슈의 발생 조건이 무엇인지를 알 수 있나요? |
Beta Was this translation helpful? Give feedback.
-
여기 저희가 고민하는 문제를 해결한 분의 글을 정리해보면 A : 정상 유저 RT 탈취 시
RT가 재발급 되기 전에 탈취되어 그 RT가 재발급 될 경우
한 명의 사용자가 여러개의 RT를 가지게 되는 경우
즉, 탈취 감지 트리거와 승조님이 제시해주신 문제 상황을 이를 통해 해결할 수 있을 것 같습니다. |
Beta Was this translation helpful? Give feedback.
-
부하 테스트 결과 (JMeter)평균 값을 기준으로 합니다. 부하 테스트 결과를 표로 나타내면 다음과 같습니다:
장점 정리
결론,기존에 Refresh Token 관리를 MySQL에서 진행하였지만 Redis 로 마이그레이션을 진행합니다. |
Beta Was this translation helpful? Give feedback.
-
현재 상황
현재 재발급("/api/v1/auth/reissue") 과정에서, AT만 새로 발급을 하고 RT는 그대로 사용하는 방식으로 구현이 되어있습니다.
이러한 경우에 문제가 발생할 것 같은데 어떠한 보안상 결함이 있을까요?
Beta Was this translation helpful? Give feedback.
All reactions