유저 Role 중에 BLOCK
이면 모든 권한이 차단되어 일반 로그인 시 JwtAuthenticationFilter
에서 DisabledException
을 발생시키고 로그인이 차단되도록 구현되어 있었으나, 카카오 소셜로그인의 경우에는 JwtAuthenticationFilter
를 통과하지 않고 로그인이 정상적으로 진행되는 문제가 발생함.
시도
로그 분석: 카카오 유저의 로그인 흐름을 파악하기 JwtAuthenticationFilter
와 KakaoService
에 log.info를 추가하여 분석하였고, 카카오 소셜로그인의 경우에는 해당 필터를 거치지 않는 것을 확인함.
원인 파악: 카카오 소셜 로그인은 클라이언트와 카카오 서버 간의 직접적인 통신이 진행된다. 따라서 JwtAuthenticationFilter를 타지 않는 것으로 추정함
로그인 처리 시 유저 상태 확인 추가:
if (kakaoMember != null && kakaoMember.getRole().equals(UserRoleEnum.BLOCK)) {
throw new DisabledException("차단된 계정입니다.");
}
• KakaoService
의 registerKakaoUserIfNeeded
메소드 내에서 이미 존재하는 카카오 사용자인 경우, 사용자의 상태를 확인하고 차단된 사용자인 경우 로그인을 허용하지 않는 로직을 추가.
예외 처리 및 응답 로직 추가:
public Map<String, Object> registerKakaoUserIfNeeded(KakaoUserInfoDto kakaoUserInfo) {
// ... 기존 코드 ...
Member kakaoMember = memberRepository.findByKakaoId(kakaoId).orElse(null);
// 기존 사용자가 BLOCK 상태인지 확인
if (kakaoMember != null && kakaoMember.getRole() == UserRoleEnum.BLOCK) {
throw new CustomKakaoBlockException("BLOCK 상태의 계정으로 로그인할 수 없습니다.");
}
// ...
return result;
}
KakaoService
에서 예외가 발생한 경우를 적절히 처리하고 클라이언트에게 적절한 응답을 반환할 수 있도록 예외 처리 로직 추가.
커스텀 예외 및 전역 예외 처리 추가:
```java
public class CustomKakaoBlockException extends RuntimeException {
public CustomKakaoBlockException(String message) {
super(message);
}
}
```
```java
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(CustomKakaoBlockException.class)
public ResponseEntity<MsgResponse> handleCustomException(CustomKakaoBlockException ex) {
MsgResponse errorResponse = new MsgResponse(ex.getMessage());
return new ResponseEntity<>(errorResponse, HttpStatus.FORBIDDEN);
}
}
```
• `CustomKakaoBlockException` 클래스를 생성하여 커스텀 예외를 정의하고, 이를 전역에서 처리할 수 있도록 `GlobalExceptionHandler`에 예외 핸들러를 추가.
해결
문제 해결: 카카오 소셜로그인 사용자도 계정이 차단된 경우에는 로그인이 차단되고, 클라이언트에게는 적절한 응답이 전달되도록 수정됨.