문제 발생
기능 : 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
를 안 썼는데도 실행된다면, 해당 컨트롤러 클래스 안 다른 메서드에 붙어있을 가능성이 높고,
인터셉터 로직이 그걸 구분하지 않고 무조건 실행하고 있을 가능성이 크다.
'백엔드 > Spring' 카테고리의 다른 글
Spring Data JPA 에서 Projection이 작동하는 방식 (1) | 2025.06.11 |
---|---|
Kafka, Spring Boot 실습 (0) | 2025.05.21 |
Spring, DTO, DAO, BO, VO 차이점 (1) | 2025.04.01 |
Spring, Pageable/List 기본 정렬 기준 (0) | 2025.03.18 |
Spring, Service 자주 사용하는 어노테이션 정리 (0) | 2025.03.18 |