권한 체크에 Spring AOP를 적용해보자!

YUZE·2024년 12월 5일
1

Auction

목록 보기
5/5
post-thumbnail

무엇이 문제인가?


public enum Role {
    USER,
    ADMIN,
    GUEST
}

옥션 프로젝트에서 접근하는 유저의 권한은 Guest, User, Admin으로 나뉜다.

따라서, 엔드포인트 마다 접근한 유저에 대해 권한 체크를 하고, 올바르지 못한 접근에 대해 예외를 던져야 한다.

그러나, 토큰을 사용하는 모든 엔드포인트에서 중복되는 권한 체크 코드가 생길텐데. . . 같이 개발하는 팀원들이 해당 코드를 작성하지 않게 할 수 있는 방법이 있을까?

그렇게 해서 Spring AOP에 대해 앞서서 공부하였다.

🗨️ Spring AOP 개념 관련 포스팅 (1)
🗨️ Spring AOP 개념 관련 포스팅 (2)
🗨️ Spring AOP 개념 관련 포스팅 (3)


프로젝트에 어떻게 AOP를 적용하였나?


Auction 프로젝트에서의 user 요청 후 프로세스를 간략화 하면 다음과 같다.

  • user가 요청
  • user의 토큰을 검증 후, 권한에 따라서 ADMIN, USER, GUEST 역할을 부여
  • 엔드포인트에서 접근 가능한 역할인지 확인

위 프로세스를 거친다.

엔드포인트에서 접근 가능한 역할인지 확인하는 과정은 토큰을 사용하는 모든 컨트롤러 메서드에서 반복 해야한다.

따라서, 해당 부분을 컨트롤러 메서드에 직접 로직을 작성하는 것이 아니라, 부가 기능으로 판단하여 핵심 로직으로부터 분리하기로 결정하였다.


프로젝트 적용 코드

커스텀 어노테이션 생성 - 포인트 컷 생성을 위한 작업

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface UserOnly {
}

먼저, 커스텀 어노테이션을 만들었다.
AOP에서 포인트 컷을 지정하는 방법으로, 메서드에 커스텀 메서드를 붙이는 방법을 택했다.
@UserOnly를 컨트롤러 메서드에 붙여주면, @UserOnly가 붙은 메서드가 실행되는 시점에 AOP가 실행된다.


이제 AOP 실행 되는 메서드를 특정하는 것을 정의했으니, 부가 기능 그 자체를 구현하는 것에 대해 알아보도록 하겠다.

AOP 구현 - 부가 기능 작성

// AspectJ 어노테이션 이용해서 Aop 구현하겠다 지정한다
@Aspect
// 빈으로 등록해서 spring aop로 사용가능하게한다
@Component
public class UserCheck {
	// Advice("point cut")를 부여하고자 하는 기능(메서드)에 붙여준다 -> 기능 실행 시점과 특정 위치를 지정한다
    @Before("@annotation(UserOnly)")
    public void userCheck(JoinPoint joinPoint) {
    // joinPoint.getArgs()를 통해 가져오는 것은 타겟 메서드의 매개변수(Arguments)
    // 즉, AOP가 적용된 메서드가 호출될 때 전달된 실제 매개변수 값들을 배열 형태로 반환
        Object[] args = joinPoint.getArgs();

        for (Object arg : args) {
            if (arg instanceof Accessor accessor) {
                if (!accessor.isUser()) {
                    throw new IllegalArgumentException("안됨");
                }
            }
        }
    }
}

위 코드는, 메서드에 접근을 시도하는 사람이 USER 역할을 가진 사람인지 확인하는 메서드이다.(AOP)

@Before 어노테이션에 의해, Point Cut으로 특정한 메서드가 실행 되기 직전에 해당 AOP가 실행 되고, 예외를 던지지 않을 경우, 메서드 실행 후 target이 실행된다.

만약 @Before에 대한 자세한 내용이 궁금하다면 해당 포스팅을 참고하면 된다.
Advice 어노테이션에 대한 포스팅

만약, 유저의 접근 권한이 올바르지 않을 경우 예외를 던지고 target이 실행되지 않는다.

따라서 AOP를 통해, UserOnly 어노테이션이 메서드에 붙어있는 경우, USER 역할을 부여받은 접근자만 접근할 수 있게 된다.

profile
안녕하세요

0개의 댓글

관련 채용 정보