스프링 시큐리티(Spring Security)는 애플리케이션 보안의 핵심적인 역할을 담당하며, 그중에서도 “인가”는 중요한 영역입니다. @PreAuthorize와 @Secured는 스프링 시큐리티에서 메서드 수준에서 권한 관리를 구현할 수 있도록 제공하는 애노테이션입니다. 이 두 애노테이션의 차이점과 사용 방법, 그리고 권한 설정에서 알아두어야 할 개념들을 깊이 있게 살펴보겠습니다.

@PreAuthorize는 메서드 호출 전에 권한을 검사하기 위한 애노테이션으로, 스프링 표현 언어(SpEL, Spring Expression Language)를 지원하여 복잡한 권한 조건을 설정할 수 있습니다.
| 표현식 | 설명 |
|---|---|
permitAll | 모든 접근 허용 |
denyAll | 모든 접근 비허용 |
isAnonymous() | 현재 사용자가 익명 상태인지 확인 |
isRememberMe() | RememberMe 사용자 여부 확인 |
isAuthenticated() | 사용자가 로그인 상태인지 확인 |
isFullyAuthenticated() | RememberMe나 익명이 아닌 경우 확인 |
@RestController
@RequestMapping("/api")
public class UserController {
@PreAuthorize("isAuthenticated()")
@GetMapping("/users")
public List<User> getAllUsers() {
return userService.getAllUsers();
}
@PreAuthorize("hasRole('ADMIN') and #userId == principal.id")
@DeleteMapping("/users/{userId}")
public ResponseEntity<?> deleteUser(@PathVariable Long userId) {
userService.deleteUser(userId);
return ResponseEntity.ok().build();
}
}
@Secured는 보다 간단한 권한 설정을 위해 사용되는 애노테이션으로, 특정 역할(ROLE)에 따라 접근을 제한할 수 있습니다.
@RestController
@RequestMapping("/api")
public class AdminController {
@Secured("ROLE_ADMIN")
@GetMapping("/admin")
public String adminAccess() {
return "Admin Access Granted";
}
@Secured({"ROLE_ADMIN", "ROLE_MANAGER"})
@GetMapping("/management")
public String managementAccess() {
return "Management Access Granted";
}
}
| 특징 | @PreAuthorize | @Secured |
|---|---|---|
| SpEL 지원 여부 | 지원 | 미지원 |
| 권한 조건 설정 | 복잡한 조건 설정 가능 | 단순한 역할 기반 조건만 가능 |
| 메서드 파라미터 사용 | 가능 | 불가능 |
| 사용 목적 | 복잡한 인가 로직이 필요한 경우 | 간단한 역할 검증에 적합 |
SpEL은 스프링 프레임워크에서 제공하는 강력한 표현 언어로, 런타임 시 동적인 값 평가 및 조작이 가능합니다. @PreAuthorize와 같이 표현식이 필요한 애노테이션에서 사용됩니다.
#objectName.property#objectName.method()principal, authentication#parameterName@PreAuthorize("#userId == principal.id and hasRole('USER')")
public User getUserDetails(Long userId) {
return userService.getUserDetails(userId);
}

최소 권한 원칙 적용
테스트와 검증
HTTPS 사용
최신 보안 업데이트 적용
@EnableGlobalMethodSecurity로 메서드 보안 활성화[공부정리] @Secured(), @PreAuthorize, @PostAuthorize
[Spring Security] Method 방식 인가 주요 아키텍처 이해와 어노테이션