1. 터미널로 redis 설치

2. MySQL 업그레이드
업그레이드 중, Homebrew가 mariadb와 충돌상태라는 내용의 문제가 생겼다!

MySQL과 MariaDB는 같은 바이너리를 제공하여 같이 사용할 수 없다고 한다...!
이를 해결하기 위해 선택한 방법은
3. brew deps --tree mysql 명령어 사용
해당 명령어를 사용해서 어떤 패키지가 mysql을 필요로 하는지 확인!


LLVM이 MySQL을 의존성으로 포함한다고 나왔다!
하지만 너는 MariaDB를 데이터베이스에 사용하고 있어서, MySQL이 필요 없으므로 아래의 방법을 사용해서 해결했다.
4. brew upgrade --ignore-dependencies mysql

위 명령어를 사용하면 MySQL을 건너뛰고, 나머지 패키지만 업데이트 된다!
5. redis 설치 완료!

위와 같이 레디스 설치가 완료되었다! 하지만
WARNING: The TCP backlog setting of 511 cannot be enforced because kern.ipc.somaxconn is set to the lower value of 128.
이 부분이 신경 쓰여 그냥 넘어가도 되지만
sudo sysctl -w kern.ipc.somaxconn=511 명령어를 사용해서 해결!
6. Redis를 이용한 RefreshToken 관리와 로그아웃된 AccessToken의 블랙리스트 처리 구현 - Service 코드
public Map<String, String> reissue(String email, String refreshToken) {
User user = userRepository.findByEmail(email)
.orElseThrow(() -> new BusinessLogicException(ExceptionCode.USER_NOT_FOUND));
RefreshToken redisRefreshToken = refreshTokenRepository.findById(email)
.orElseThrow(() -> new BusinessLogicException(ExceptionCode.TOKEN_NOT_FOUND));
if (refreshToken.equals(redisRefreshToken.getRefreshToken())) {
Map<String, String> token = new HashMap<>();
token.put("accessToken", jwtTokenProvider.generateAccessToken(user));
token.put("refreshToken", jwtTokenProvider.generateRefreshToken(user.getEmail()));
redisRefreshToken.setRefreshToken(token.get("refreshToken"));
refreshTokenRepository.save(redisRefreshToken);
return token;
} else {
throw new IllegalArgumentException("토큰이 일치하지 않습니다.");
}
}
public void logout(User user, String accessToken) {
String email = user.getEmail();
String jws = accessToken.replace("Bearer ", "");
Long expiration = jwtTokenProvider.getExpiration(jws);
LogoutAccessToken logoutAccessToken = LogoutAccessToken.of(jws, email, expiration);
logoutAccessTokenRedisRepository.save(logoutAccessToken);
deleteRefreshToken(email);
}
7. Spring Security Filter 코드
private void checkBlackList(String jws) {
Optional<LogoutAccessToken> optionalLogoutAccessToken = logoutAccessTokenRedisRepository.findById(jws);
if (optionalLogoutAccessToken.isPresent())
throw new BusinessLogicException(ExceptionCode.LOGOUT_AUTHORIZATION);
}
8. 결과
로그아웃과 리프레쉬 토큰 재발급하면 토큰 값이 레디스에 저장 로직을 구현하고
레디스에 저장된 리프레쉬 토큰 값과 유저가 가지고 있는 값이 일치하면 새로운 access Token과 refresh Token을 발급받을 수 있다!
