본문 바로가기
백엔드/Spring

Spring, 403 AccessDenied 오류(적용하지 않은 어노테이션이 적용됨)

by greenyellow-s 2025. 4. 8.
728x90

문제 발생

기능 : User가 자신의 정보를 수정할 수 있게 하는 엔드포인트 추가

오류 : 403 AccessDenied

 

문제 발생 분석

관리자인지 아닌지 확인하는 커스텀 어노테이션 (@CheckAdminUser) 을 추가하지도 않았는데

관리자 여부 확인 과정을 거치는 바람에 "권한 없음"으로 오류 발생

 

정리

 

     • @CheckAdminUser 어노테이션이 있는 다른 메서드가 UserController 안에 존재함.

     •  새로 만든 메서드에는 @CheckAdminUser 가 없음.

     • 그런데도 관리자 체크가 실행됨 → 예상치 못한 403 또는 AccessDenied 발생.


 

원인

 

Spring에서 HandlerMethod는 컨트롤러 메서드 하나에 해당하지만,
인터셉터나 필터 등에서 조건 분기 없이 동작하도록 설정해두면


해당 컨트롤러 전체가 매핑 경로에 포함되면서, 클래스 단위 또는 동일 클래스의 다른 메서드에 붙은 어노테이션이 간섭할 수 있다.

 

이럴 때 Interceptor 내부에서 HandlerMethod.getBeanType()으로 클래스까지 확인하거나
내부 로직이 잘못 설계되어 있으면 메서드 단위가 아니라 클래스 단위로도 어노테이션을 오해하게 된다.

 


해결방법

1. UserController 안에 있는 관리자 여부 확인 어노테이션 모두 삭제

 

// - @CheckAdminUser
PutMapping("/user/{userId}")
public void userUpdate (...) {...}

 

UserController 안에 있는 @CheckAdminUser 모두 제거

 

 

2. Interceptor에서 명확하게 메서드 단위로 어노테이션 확인

 

Interceptor에서 어노테이션이 없으면 실행하지 못하도록 코드를 추가

// 계정 활성 체크 애노테이션 확인
if (handler instanceof HandlerMethod handlerMethod) {
  CheckAdminUser checkAdminUserAnnotation = handlerMethod.getMethodAnnotation(CheckAdminUser.class);
    if (checkAdminUserAnnotation == null) {
      return true; // 계정 활성 체크 애노테이션 없으므로, 요청 계속 진행
    }
  
  ...
  
  return true;
}

 


결론

@CheckAdminUser 를 안 썼는데도 실행된다면, 해당 컨트롤러 클래스 안 다른 메서드에 붙어있을 가능성이 높고,
인터셉터 로직이 그걸 구분하지 않고 무조건 실행하고 있을 가능성이 크다.

728x90