본문 바로가기
JAVA & KOTLIN

Spring Security에서 @Secured, @PreAuthorize, @PostAuthorize를 사용법

by nozee 2025. 2. 13.
반응형

 

1. 개요

Spring Security에서는 메서드 단위의 접근 제어를 위해 @Secured, @PreAuthorize, @PostAuthorize 애너테이션을 제공한다.
이 애너테이션들을 활용하면 특정 역할(Role) 또는 조건을 만족하는 사용자만 메서드를 실행할 수 있도록 제한할 수 있다.
각 애너테이션이 어떻게 동작하는지, 어떤 차이가 있는지에 대해 알아본다.


2. @Secured

기본 개념

@Secured 애너테이션은 특정 역할(Role)을 가진 사용자만 해당 메서드를 실행할 수 있도록 제한한다.
이를 사용하기 위해서는 Spring Security 설정에서 @EnableMethodSecurity 또는 @EnableGlobalMethodSecurity(securedEnabled = true)을 활성화해야 한다.

사용법

 
@Secured("ROLE_ADMIN")
fun adminOnlyMethod() {
    println("관리자만 접근할 수 있다.")
}
@Secured(["ROLE_ADMIN", "ROLE_MANAGER"])
fun adminOrManagerMethod() {
    println("관리자 또는 매니저만 접근할 수 있다.")
}

 단점

  • Spring Expression Language(SpEL) 지원하지 않음 → @PreAuthorize, @PostAuthorize보다 유연성이 떨어진다.
  • 역할(Role) 기반 제한만 가능 → 세부적인 조건을 설정하기 어렵다.

3. @PreAuthorize

기본 개념

@PreAuthorize 애너테이션은 메서드 실행 전에 권한을 검사하여 접근을 결정한다.
Spring EL을 지원하기 때문에 더 세부적인 권한 검사가 가능하다.

사용법

@PreAuthorize("hasRole('ROLE_ADMIN')")
fun adminOnlyMethod() {
    println("ROLE_ADMIN 권한이 있어야 실행할 수 있다.")
}

위 코드는 ROLE_ADMIN 권한을 가진 사용자만 실행할 수 있도록 제한한다.
이외에도 hasAuthority() 같은 메서드를 사용할 수 있다.

🔹 여러 권한을 허용하는 경우

@PreAuthorize("hasAnyRole('ROLE_ADMIN', 'ROLE_MANAGER')")
fun multipleRolesMethod() {
    println("ADMIN 또는 MANAGER 권한이 있는 사용자만 접근할 수 있다.")
}

🔹 사용자 정보를 기반으로 접근을 제한하는 경우

Spring EL을 활용하면 로그인한 사용자의 정보를 기반으로 접근을 제어할 수도 있다.

 
@PreAuthorize("#username == authentication.name")
fun userOnlyMethod(username: String) {
    println("$username 사용자가 접근할 수 있다.")
}

장점

  • Spring EL을 활용하여 복잡한 권한 조건 설정 가능
  • 역할(Role)뿐만 아니라 사용자 정보까지 활용 가능
  • 메서드 실행 전에 권한을 검사하므로 보안성이 높음

4. @PostAuthorize

기본 개념

@PostAuthorize 애너테이션은 메서드 실행 후 반환된 결과를 검사하여 권한을 확인한다.
즉, 반환된 데이터를 기반으로 접근을 제한할 수 있다.

사용법

 
@PostAuthorize("returnObject.owner == authentication.name")
fun getUser(username: String): User {
    return userService.findByUsername(username)
}


즉, 사용자가 자신의 정보만 조회할 수 있도록 제한하는 역할을 한다.

단점

  • 메서드 실행 후 검증이 이루어지므로 불필요한 연산이 발생할 가능성이 있다.
  • 보안 검사가 늦게 수행될 수 있다.

5. @Secured vs @PreAuthorize vs @PostAuthorize 비교

애너테이션실행 시점사용 가능 표현식역할(Role) 기반조건 기반주요 용도

에너테이션 실행시점 사용 가능 표현식 역할 기반 조건 기반  
@Secured 메서드 실행 전 X O X 간단한 역할 기반 접근 제어
@PreAuthorize 메서드 실행 전 O (SpEL 지원) O O 역할 & 조건 기반 접근 제어
@PostAuthorize 메서드 실행 후 O (SpEL 지원) O O 반환된 데이터 검증

6. 정리

  • @Secured → 역할(Role) 기반으로 간단한 권한을 부여할 때 사용한다.
  • @PreAuthorize → 실행 전에 권한을 검사하며, SpEL을 활용하여 세부적인 조건을 설정할 수 있다.
  • @PostAuthorize → 실행 후 반환된 데이터를 기반으로 접근을 제한할 수 있다.

일반적으로 @PreAuthorize가 가장 유용하며 복잡한 권한 검사가 필요한 경우 사용된다.
@Secured는 단순한 권한 제어에 적합하지만 유연성이 부족하다.
@PostAuthorize는 보안이 필요한 데이터 검증이 필요할 때 활용할 수 있다.

반응형