[TIL] Spring Security – @PreAuthorize vs @Secured: 주요 차이점과 사용 방법

냠냠빈·2025년 1월 7일

들어가며

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


✨ @PreAuthorize

@PreAuthorize는 메서드 호출 전에 권한을 검사하기 위한 애노테이션으로, 스프링 표현 언어(SpEL, Spring Expression Language)를 지원하여 복잡한 권한 조건을 설정할 수 있습니다.

🔸 주요 특징

  • SpEL 지원: 표현식을 사용하여 동적인 조건 평가 가능
  • 메서드 파라미터 접근 가능: 메서드 매개변수를 기준으로 조건 설정 가능
  • 사용 시점: 복잡한 권한 조건이 필요한 경우 적합

🔸 주요 표현식

표현식설명
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

@Secured는 보다 간단한 권한 설정을 위해 사용되는 애노테이션으로, 특정 역할(ROLE)에 따라 접근을 제한할 수 있습니다.

🔸 주요 특징

  • SpEL 미지원: 복잡한 조건 설정 불가
  • 역할 기반 접근 제어: 단순한 권한 기반으로 사용
  • 사용 시점: 간단한 권한 조건만 필요한 경우 적합

🔸 사용 예시

@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 vs @Secured

특징@PreAuthorize@Secured
SpEL 지원 여부지원미지원
권한 조건 설정복잡한 조건 설정 가능단순한 역할 기반 조건만 가능
메서드 파라미터 사용가능불가능
사용 목적복잡한 인가 로직이 필요한 경우간단한 역할 검증에 적합

🔒 SpEL (Spring Expression Language)

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);
}


❗ 💡 권한 설정 시 주의사항

  1. 최소 권한 원칙 적용

    • 사용자가 필요한 최소한의 리소스에만 접근할 수 있도록 설정하세요.
  2. 테스트와 검증

    • 권한 설정은 보안상의 허점이 생기지 않도록 철저히 테스트해야 합니다.
  3. HTTPS 사용

    • 권한 정보가 안전하게 전달될 수 있도록 HTTPS를 사용하세요.
  4. 최신 보안 업데이트 적용

    • 스프링 시큐리티와 관련된 종속성을 최신 버전으로 유지하세요.

🔄 함께 공부해야 할 개념

  • Spring Security Filter Chain: 요청이 처리되는 필터의 흐름
  • Authentication vs Authorization: 인증과 인가의 차이
  • Principal 객체: 현재 사용자의 정보를 담고 있는 객체
  • Role Hierarchy: 역할 간 계층 구조 설정
  • Global Method Security 설정: @EnableGlobalMethodSecurity로 메서드 보안 활성화

참고문헌

[공부정리] @Secured(), @PreAuthorize, @PostAuthorize
[Spring Security] Method 방식 인가 주요 아키텍처 이해와 어노테이션

profile
다 먹어버릴거야!

0개의 댓글