1. 해당 메서드가 호출되기전에 권한 (roles, authorities) 조건을 검사

  2. 동작방식

    1. Spring Security의 메서드 보안 기능을 활성화해야 함
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    public class SecurityConfig{
    	//...
    }
    
  3. @PreAuthorize 는 메서드 실행 직전에 SpEL(Spring Expression Language)로 조건식을 평가함

  4. “hasRole(’ROLE_USER’)”는 현재 인증된 사용자의 GrantedAuthority 목록에 Role_User가 있는지 확인함

  5. 특징

    1. 선언적 방식이라 코드가 깔끔해짐(메서드 내부에 권한 체크 로직을 안 넣어도 됨)
    2. SpEL 문법을 지원해서, hasRole, hasAuthority, #id == authentication.principal.id 같은 복잡한 조건도 가능
    3. 클래스 메서드 단위로 권한을 세밀하게 조정 가능
  6. 장점

    1. 비지니스 로직과 권한 로직을 분리할수 있다.
    2. API 엔트포인트마다 다른 권한 조건을 붙일 수 있음
    3. @PreAuthorize(”hasRole(’ADMIN’)”) 처럼 선언이 직관적임
  7. 단점

    1. 권한 문자열 하드코딩
    2. 중복 선언: 여러 메서드에 같은 권한 조건을 붙이다 보면 반복 코드 생김
    3. 런타임 오류: 잘못된 SpEL이나 없는 role을 쓰면 실행 시점에서야 알 수 있음
//단순한 권한 체크
@PreAuthorize("hasRole('Admin')")

// 메서드 파라미터와 인증 객체 비교
@PreAUthorize("#id == authentication.principal.id")

//여러 권한 체크
@PreAuthorize("hasAnyRole('USER','ADMIN')")

//조건식
@PreAuthorize("isAuthenticated() and #age >= 20")