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는 보안이 필요한 데이터 검증이 필요할 때 활용할 수 있다.
'JAVA & KOTLIN' 카테고리의 다른 글
[JAVA] UUID Version 7은 어떻게 사용할까? (0) | 2024.12.30 |
---|---|
[JAVA] Java Instant 주요 메소드 (0) | 2024.12.24 |
[SPRING] Spring @Transactional (2) | 2024.12.22 |
[KOTLIN] Kotlin에서 Value Object 언제 사용할까? (2) | 2024.12.21 |
[JAVA] java 1.8에서 변경 된 time (0) | 2024.12.17 |