카카오 소셜로그인 유저차단 검증로직 별도 구현

Noh Jihyeon·2023년 11월 10일
0
  • [BE] 카카오 소셜로그인 유저차단 검증로직 별도 구현 문제
    • 유저 Role 중에 BLOCK이면 모든 권한이 차단되어 일반 로그인 시 JwtAuthenticationFilter에서 DisabledException을 발생시키고 로그인이 차단되도록 구현되어 있었으나, 카카오 소셜로그인의 경우에는 JwtAuthenticationFilter를 통과하지 않고 로그인이 정상적으로 진행되는 문제가 발생함.

      시도

    • 로그 분석: 카카오 유저의 로그인 흐름을 파악하기 JwtAuthenticationFilterKakaoService 에 log.info를 추가하여 분석하였고, 카카오 소셜로그인의 경우에는 해당 필터를 거치지 않는 것을 확인함.

    • 원인 파악: 카카오 소셜 로그인은 클라이언트와 카카오 서버 간의 직접적인 통신이 진행된다. 따라서 JwtAuthenticationFilter를 타지 않는 것으로 추정함

    • 로그인 처리 시 유저 상태 확인 추가:

      if (kakaoMember != null && kakaoMember.getRole().equals(UserRoleEnum.BLOCK)) {
          throw new DisabledException("차단된 계정입니다.");
      }

      KakaoServiceregisterKakaoUserIfNeeded 메소드 내에서 이미 존재하는 카카오 사용자인 경우, 사용자의 상태를 확인하고 차단된 사용자인 경우 로그인을 허용하지 않는 로직을 추가.

    • 예외 처리 및 응답 로직 추가:

      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`에 예외 핸들러를 추가.

      해결

    • 문제 해결: 카카오 소셜로그인 사용자도 계정이 차단된 경우에는 로그인이 차단되고, 클라이언트에게는 적절한 응답이 전달되도록 수정됨.

profile
꼭꼭 씹어서 소화시키는 맛있는 코딩

0개의 댓글