본문 바로가기
Today I Learned/Spring

[Security] @Secured, @PreAuthorize, @PostAuthorize

by dbs_ 2025. 5. 27.

 

최근 보안 설정과 관련된 처리를 하면서 @PreAuthorize를 사용하며 Spring Security에서 제공하는 @Secured, @PreAuthorize, @PostAuthorize라는 세 보안 어노테이션에 대해 찾아보게 되었고, 그 김에 정리해서 올려본다.

 

@Secured

@Secured는 특정 Role을 가진 사용자만 메서드에 접근할 수 있도록 제어한다.

@Secured("ROLE_ADMIN")
public void adminOnlyMethod() {
    // 관리자만 실행 가능
}
  • 특징
    • 단순 Role 기반으로 접근 제어
    • SpEL 표현식 불가
    • secured-enabled="true" 설정 필요

 

@PreAuthorize

@PreAuthorize는 메서드 실행 전에 권한과 조건을 평가한다. SpEL(Spring Expression Language) 지원으로 복잡한 조건도 지정 가능하다.

@PreAuthorize("hasRole('ADMIN') or #user.username == authentication.name")
public User getUser(User user) {
    return user;
}
  • 특징
    • 메서드가 실행 되기 전에 권한 및 조건 체크
    • SpEL 표현식 지원
    • pre-post-enabled="true" 설정 필요

 

@PostAuthorize

@PostAuthorize는 메서드 실행 후, 반환값을 기준으로 조건을 평가한다.
예를 들어, 데이터 반환 후 returnObject.owner == authentication.name 같은 조건으로 접근 제어 가능.

@PostAuthorize("returnObject.owner == authentication.name")
public Document getDocument(int id) {
    return documentService.findById(id);
}
  • 특징
    • 메서드 실행 후 리턴값을 기준으로 조건 체크
      • 예를 들어 특정 사용자가 본인 소유의 데이터만 볼 수 있게 하려면, 사용자가 누구인지에 대한 ‘식별’ 과정도 필요한 상황.
    • SpEL 표현식 지원
    • pre-post-enabled="true" 설정 필요

 

결론적으로,

  • @Secured는 SpEL을 지원하지 않기 때문에, 단순 Role 기반의 권한 체크에만 적합하다.
  • java config 사용중이라면
    • SecurityConfig.java 파일에서 해당 클래스에 @EnableMethodSecurity 어노테이션 추가
  • xml config 사용중이라면
    • @PreAuthorize, @PostAuthorize는 pre-post-enabled="true" 설정이 필요하고, @Secured는 secured-enabled="true" 설정 필요함.